#ifndef _SYS_VTOC_H
#define _SYS_VTOC_H
#include <sys/dklabel.h>
#ifdef __cplusplus
extern "C" {
#endif
#define V_NUMPAR NDKMAP
#define VTOC_SANE 0x600DDEEE
#define V_VERSION 0x01
#define V_EXTVERSION V_VERSION
#define V_UNASSIGNED 0x00
#define V_BOOT 0x01
#define V_ROOT 0x02
#define V_SWAP 0x03
#define V_USR 0x04
#define V_BACKUP 0x05
#define V_STAND 0x06
#define V_VAR 0x07
#define V_HOME 0x08
#define V_ALTSCTR 0x09
#define V_CACHE 0x0a
#define V_RESERVED 0x0b
#define V_SYSTEM 0x0c
#define V_VXVM_PUB 0x0e
#define V_VXVM_PRIV 0x0f
#define V_BIOS_BOOT 0x18
#define V_NETBSD_FFS 0xff
#define V_FREEBSD_BOOT 0x0900
#define V_FREEBSD_SWAP 0x0901
#define V_FREEBSD_UFS 0x0902
#define V_FREEBSD_VINUM 0x0903
#define V_FREEBSD_ZFS 0x0904
#define V_FREEBSD_NANDFS 0x0905
#define V_UNKNOWN 0xffff
#define V_UNMNT 0x01
#define V_RONLY 0x10
#define VT_ERROR (-2)
#define VT_EIO (-3)
#define VT_EINVAL (-4)
#define VT_ENOTSUP (-5)
#define VT_ENOSPC (-6)
#define VT_EOVERFLOW (-7)
struct partition {
ushort_t p_tag;
ushort_t p_flag;
daddr_t p_start;
long p_size;
};
struct vtoc {
unsigned long v_bootinfo[3];
unsigned long v_sanity;
unsigned long v_version;
char v_volume[LEN_DKL_VVOL];
ushort_t v_sectorsz;
ushort_t v_nparts;
unsigned long v_reserved[10];
struct partition v_part[V_NUMPAR];
time_t timestamp[V_NUMPAR];
char v_asciilabel[LEN_DKL_ASCII];
};
struct extpartition {
ushort_t p_tag;
ushort_t p_flag;
ushort_t p_pad[2];
diskaddr_t p_start;
diskaddr_t p_size;
};
struct extvtoc {
uint64_t v_bootinfo[3];
uint64_t v_sanity;
uint64_t v_version;
char v_volume[LEN_DKL_VVOL];
ushort_t v_sectorsz;
ushort_t v_nparts;
ushort_t pad[2];
uint64_t v_reserved[10];
struct extpartition v_part[V_NUMPAR];
uint64_t timestamp[V_NUMPAR];
char v_asciilabel[LEN_DKL_ASCII];
};
#ifdef _KERNEL
#define extvtoctovtoc(extv, v) \
{ \
int i; \
v.v_bootinfo[0] = (unsigned long)extv.v_bootinfo[0]; \
v.v_bootinfo[1] = (unsigned long)extv.v_bootinfo[1]; \
v.v_bootinfo[2] = (unsigned long)extv.v_bootinfo[2]; \
v.v_sanity = (unsigned long)extv.v_sanity; \
v.v_version = (unsigned long)extv.v_version; \
bcopy(extv.v_volume, v.v_volume, LEN_DKL_VVOL); \
v.v_sectorsz = extv.v_sectorsz; \
v.v_nparts = extv.v_nparts; \
for (i = 0; i < 10; i++) \
v.v_reserved[i] = (unsigned long)extv.v_reserved[i]; \
for (i = 0; i < V_NUMPAR; i++) { \
v.v_part[i].p_tag = extv.v_part[i].p_tag; \
v.v_part[i].p_flag = extv.v_part[i].p_flag; \
v.v_part[i].p_start = (daddr_t)extv.v_part[i].p_start; \
v.v_part[i].p_size = (long)extv.v_part[i].p_size; \
v.timestamp[i] = (time_t)extv.timestamp[i]; \
} \
bcopy(extv.v_asciilabel, v.v_asciilabel, LEN_DKL_ASCII); \
}
#define vtoctoextvtoc(v, extv) \
{ \
int i; \
extv.v_bootinfo[0] = (uint64_t)v.v_bootinfo[0]; \
extv.v_bootinfo[1] = (uint64_t)v.v_bootinfo[1]; \
extv.v_bootinfo[2] = (uint64_t)v.v_bootinfo[2]; \
extv.v_sanity = (uint64_t)v.v_sanity; \
extv.v_version = (uint64_t)v.v_version; \
bcopy(v.v_volume, extv.v_volume, LEN_DKL_VVOL); \
extv.v_sectorsz = v.v_sectorsz; \
extv.v_nparts = v.v_nparts; \
for (i = 0; i < 10; i++) \
extv.v_reserved[i] = (uint64_t)v.v_reserved[i]; \
for (i = 0; i < V_NUMPAR; i++) { \
extv.v_part[i].p_tag = v.v_part[i].p_tag; \
extv.v_part[i].p_flag = v.v_part[i].p_flag; \
extv.v_part[i].p_start = \
(diskaddr_t)(unsigned long)v.v_part[i].p_start; \
extv.v_part[i].p_size = \
(diskaddr_t)(unsigned long)v.v_part[i].p_size; \
extv.timestamp[i] = (uint64_t)v.timestamp[i]; \
} \
bcopy(v.v_asciilabel, extv.v_asciilabel, LEN_DKL_ASCII); \
}
#endif
#if defined(_SYSCALL32)
struct partition32 {
uint16_t p_tag;
uint16_t p_flag;
daddr32_t p_start;
int32_t p_size;
};
struct vtoc32 {
uint32_t v_bootinfo[3];
uint32_t v_sanity;
uint32_t v_version;
char v_volume[LEN_DKL_VVOL];
uint16_t v_sectorsz;
uint16_t v_nparts;
uint32_t v_reserved[10];
struct partition32 v_part[V_NUMPAR];
time32_t timestamp[V_NUMPAR];
char v_asciilabel[LEN_DKL_ASCII];
};
#define vtoc32tovtoc(v32, v) \
{ \
int i; \
v.v_bootinfo[0] = v32.v_bootinfo[0]; \
v.v_bootinfo[1] = v32.v_bootinfo[1]; \
v.v_bootinfo[2] = v32.v_bootinfo[2]; \
v.v_sanity = v32.v_sanity; \
v.v_version = v32.v_version; \
bcopy(v32.v_volume, v.v_volume, LEN_DKL_VVOL); \
v.v_sectorsz = v32.v_sectorsz; \
v.v_nparts = v32.v_nparts; \
v.v_version = v32.v_version; \
for (i = 0; i < 10; i++) \
v.v_reserved[i] = v32.v_reserved[i]; \
for (i = 0; i < V_NUMPAR; i++) { \
v.v_part[i].p_tag = (ushort_t)v32.v_part[i].p_tag; \
v.v_part[i].p_flag = (ushort_t)v32.v_part[i].p_flag; \
v.v_part[i].p_start = (unsigned)v32.v_part[i].p_start; \
v.v_part[i].p_size = (unsigned)v32.v_part[i].p_size; \
} \
for (i = 0; i < V_NUMPAR; i++) \
v.timestamp[i] = (time_t)v32.timestamp[i]; \
bcopy(v32.v_asciilabel, v.v_asciilabel, LEN_DKL_ASCII); \
}
#define vtoc32toextvtoc(v32, extv) \
{ \
int i; \
extv.v_bootinfo[0] = v32.v_bootinfo[0]; \
extv.v_bootinfo[1] = v32.v_bootinfo[1]; \
extv.v_bootinfo[2] = v32.v_bootinfo[2]; \
extv.v_sanity = v32.v_sanity; \
extv.v_version = v32.v_version; \
bcopy(v32.v_volume, extv.v_volume, LEN_DKL_VVOL); \
extv.v_sectorsz = v32.v_sectorsz; \
extv.v_nparts = v32.v_nparts; \
extv.v_version = v32.v_version; \
for (i = 0; i < 10; i++) \
extv.v_reserved[i] = v32.v_reserved[i]; \
for (i = 0; i < V_NUMPAR; i++) { \
extv.v_part[i].p_tag = (ushort_t)v32.v_part[i].p_tag; \
extv.v_part[i].p_flag = (ushort_t)v32.v_part[i].p_flag; \
extv.v_part[i].p_start = (diskaddr_t)v32.v_part[i].p_start; \
extv.v_part[i].p_size = (diskaddr_t)v32.v_part[i].p_size; \
extv.timestamp[i] = (time_t)v32.timestamp[i]; \
} \
bcopy(v32.v_asciilabel, extv.v_asciilabel, LEN_DKL_ASCII); \
}
#define vtoctovtoc32(v, v32) \
{ \
int i; \
v32.v_bootinfo[0] = (uint32_t)v.v_bootinfo[0]; \
v32.v_bootinfo[1] = (uint32_t)v.v_bootinfo[1]; \
v32.v_bootinfo[2] = (uint32_t)v.v_bootinfo[2]; \
v32.v_sanity = (uint32_t)v.v_sanity; \
v32.v_version = (uint32_t)v.v_version; \
bcopy(v.v_volume, v32.v_volume, LEN_DKL_VVOL); \
v32.v_sectorsz = v.v_sectorsz; \
v32.v_nparts = v.v_nparts; \
v32.v_version = (uint32_t)v.v_version; \
for (i = 0; i < 10; i++) \
v32.v_reserved[i] = v.v_reserved[i]; \
for (i = 0; i < V_NUMPAR; i++) { \
v32.v_part[i].p_tag = (ushort_t)v.v_part[i].p_tag; \
v32.v_part[i].p_flag = (ushort_t)v.v_part[i].p_flag; \
v32.v_part[i].p_start = (unsigned)v.v_part[i].p_start; \
v32.v_part[i].p_size = (unsigned)v.v_part[i].p_size; \
} \
for (i = 0; i < V_NUMPAR; i++) { \
if (v.timestamp[i] > TIME32_MAX) \
v32.timestamp[i] = TIME32_MAX; \
else \
v32.timestamp[i] = (time32_t)v.timestamp[i]; \
} \
bcopy(v.v_asciilabel, v32.v_asciilabel, LEN_DKL_ASCII); \
}
#define extvtoctovtoc32(extv, v32) \
{ \
int i; \
v32.v_bootinfo[0] = extv.v_bootinfo[0]; \
v32.v_bootinfo[1] = extv.v_bootinfo[1]; \
v32.v_bootinfo[2] = extv.v_bootinfo[2]; \
v32.v_sanity = extv.v_sanity; \
v32.v_version = extv.v_version; \
bcopy(extv.v_volume, v32.v_volume, LEN_DKL_VVOL); \
v32.v_sectorsz = extv.v_sectorsz; \
v32.v_nparts = extv.v_nparts; \
v32.v_version = extv.v_version; \
for (i = 0; i < 10; i++) \
v32.v_reserved[i] = extv.v_reserved[i]; \
for (i = 0; i < V_NUMPAR; i++) { \
v32.v_part[i].p_tag = (ushort_t)extv.v_part[i].p_tag; \
v32.v_part[i].p_flag = (ushort_t)extv.v_part[i].p_flag; \
v32.v_part[i].p_start = (unsigned)extv.v_part[i].p_start; \
v32.v_part[i].p_size = (unsigned)extv.v_part[i].p_size; \
} \
for (i = 0; i < V_NUMPAR; i++) { \
if (extv.timestamp[i] > TIME32_MAX) \
v32.timestamp[i] = TIME32_MAX; \
else \
v32.timestamp[i] = (time32_t)extv.timestamp[i]; \
} \
bcopy(extv.v_asciilabel, v32.v_asciilabel, LEN_DKL_ASCII); \
}
#endif
#define CK_CHECKSUM 0
#define CK_MAKESUM 1
extern int read_vtoc(int, struct vtoc *);
extern int write_vtoc(int, struct vtoc *);
extern int read_extvtoc(int, struct extvtoc *);
extern int write_extvtoc(int, struct extvtoc *);
#ifdef __cplusplus
}
#endif
#endif