📄 bootblock.h
字号:
/*
* (x86) BIOS Parameter Block for FAT32
*/
struct mbr_bpbFAT32 {
uint16_t bpbBytesPerSec; /* bytes per sector */
uint8_t bpbSecPerClust; /* sectors per cluster */
uint16_t bpbResSectors; /* number of reserved sectors */
uint8_t bpbFATs; /* number of FATs */
uint16_t bpbRootDirEnts; /* number of root directory entries */
uint16_t bpbSectors; /* total number of sectors */
uint8_t bpbMedia; /* media descriptor */
uint16_t bpbFATsecs; /* number of sectors per FAT */
uint16_t bpbSecPerTrack; /* sectors per track */
uint16_t bpbHeads; /* number of heads */
uint32_t bpbHiddenSecs; /* # of hidden sectors */
uint32_t bpbHugeSectors; /* # of sectors if bpbSectors == 0 */
uint32_t bpbBigFATsecs; /* like bpbFATsecs for FAT32 */
uint16_t bpbExtFlags; /* extended flags: */
#define MBR_FAT32_FATNUM 0x0F /* mask for numbering active FAT */
#define MBR_FAT32_FATMIRROR 0x80 /* FAT is mirrored (as previously) */
uint16_t bpbFSVers; /* filesystem version */
#define MBR_FAT32_FSVERS 0 /* currently only 0 is understood */
uint32_t bpbRootClust; /* start cluster for root directory */
uint16_t bpbFSInfo; /* filesystem info structure sector */
uint16_t bpbBackup; /* backup boot sector */
uint8_t bsReserved[12]; /* Reserved for future expansion */
uint8_t bsDrvNum; /* Int 0x13 drive number (e.g. 0x80) */
uint8_t bsReserved1; /* Reserved; set to 0 */
uint8_t bsBootSig; /* 0x29 if next 3 fields are present */
uint8_t bsVolID[4]; /* Volume serial number */
uint8_t bsVolLab[11]; /* Volume label */
uint8_t bsFileSysType[8]; /* "FAT32 " */
}; /* __attribute__((__packed__)); */
/*
* (x86) MBR boot selector
*/
struct mbr_bootsel {
uint8_t mbrbs_defkey;
uint8_t mbrbs_flags;
uint16_t mbrbs_timeo;
uint8_t mbrbs_nametab[MBR_PART_COUNT][MBR_BS_PARTNAMESIZE + 1];
}; /* __attribute__((__packed__)); */
/*
* MBR partition
*/
struct mbr_partition {
uint8_t mbrp_flag; /* MBR partition flags */
uint8_t mbrp_shd; /* Starting head */
uint8_t mbrp_ssect; /* Starting sector */
uint8_t mbrp_scyl; /* Starting cylinder */
uint8_t mbrp_type; /* Partition type (see below) */
uint8_t mbrp_ehd; /* End head */
uint8_t mbrp_esect; /* End sector */
uint8_t mbrp_ecyl; /* End cylinder */
uint32_t mbrp_start; /* Absolute starting sector number */
uint32_t mbrp_size; /* Partition size in sectors */
}; /* __attribute__((__packed__)); */
int xlat_mbr_fstype(int); /* in sys/lib/libkern/xlat_mbr_fstype.c */
/*
* MBR boot sector.
* This is used by both the MBR (Master Boot Record) in sector 0 of the disk
* and the PBR (Partition Boot Record) in sector 0 of an MBR partition.
*/
struct mbr_sector {
/* Jump instruction to boot code. */
/* Usually 0xE9nnnn or 0xEBnn90 */
uint8_t mbr_jmpboot[3];
/* OEM name and version */
uint8_t mbr_oemname[8];
union { /* BIOS Parameter Block */
struct mbr_bpbFAT12 bpb12;
struct mbr_bpbFAT16 bpb16;
struct mbr_bpbFAT32 bpb32;
} mbr_bpb;
/* Boot code */
uint8_t mbr_bootcode[310];
/* Config for /usr/mdec/mbr_bootsel */
struct mbr_bootsel mbr_bootsel;
/* NT Drive Serial Number */
uint32_t mbr_dsn;
/* mbr_bootsel magic */
uint16_t mbr_bootsel_magic;
/* MBR partition table */
struct mbr_partition mbr_parts[MBR_PART_COUNT];
/* MBR magic (0xaa55) */
uint16_t mbr_magic;
}; /* __attribute__((__packed__)); */
#endif /* !defined(__ASSEMBLER__) */ /* } */
#pragma pack()
/* ------------------------------------------
* shared --
* definitions shared by many platforms
*/
#if !defined(__ASSEMBLER__) /* { */
/* Maximum # of blocks in bbi_block_table, each bbi_block_size long */
#define SHARED_BBINFO_MAXBLOCKS 118 /* so sizeof(shared_bbinfo) == 512 */
struct shared_bbinfo {
uint8_t bbi_magic[32];
int32_t bbi_block_size;
int32_t bbi_block_count;
int32_t bbi_block_table[SHARED_BBINFO_MAXBLOCKS];
};
#if 0 /* XXX ffsdrv */
/* ------------------------------------------
* alpha --
* Alpha (disk, but also tape) Boot Block.
*
* See Section (III) 3.6.1 of the Alpha Architecture Reference Manual.
*/
struct alpha_boot_block {
uint64_t bb_data[63]; /* data (disklabel, also as below) */
uint64_t bb_cksum; /* checksum of the boot block,
* taken as uint64_t's
*/
};
#define bb_secsize bb_data[60] /* secondary size (blocks) */
#define bb_secstart bb_data[61] /* secondary start (blocks) */
#define bb_flags bb_data[62] /* unknown flags (set to zero) */
#define ALPHA_BOOT_BLOCK_OFFSET 0 /* offset of boot block. */
#define ALPHA_BOOT_BLOCK_BLOCKSIZE 512 /* block size for sector
* size/start, and for boot
* block itself.
*/
#define ALPHA_BOOT_BLOCK_CKSUM(bb,cksum) \
do { \
const struct alpha_boot_block *_bb = (bb); \
uint64_t _cksum; \
int _i; \
\
_cksum = 0; \
for (_i = 0; \
_i < (sizeof _bb->bb_data / sizeof _bb->bb_data[0]); \
_i++) \
_cksum += _bb->bb_data[_i]; \
*(cksum) = _cksum; \
} while (/*CONSTCOND*/ 0)
/* ------------------------------------------
* apple --
* Apple computers boot block related information
*/
/*
* Driver Descriptor Map, from Inside Macintosh: Devices, SCSI Manager
* pp 12-13. The driver descriptor map always resides on physical block 0.
*/
struct apple_drvr_descriptor {
uint32_t descBlock; /* first block of driver */
uint16_t descSize; /* driver size in blocks */
uint16_t descType; /* system type */
};
/*
* system types; Apple reserves 0-15
*/
#define APPLE_DRVR_TYPE_MACINTOSH 1
#define APPLE_DRVR_MAP_MAGIC 0x4552
#define APPLE_DRVR_MAP_MAX_DESCRIPTORS 61
struct apple_drvr_map {
uint16_t sbSig; /* map signature */
uint16_t sbBlockSize; /* block size of device */
uint32_t sbBlkCount; /* number of blocks on device */
uint16_t sbDevType; /* (used internally by ROM) */
uint16_t sbDevID; /* (used internally by ROM) */
uint32_t sbData; /* (used internally by ROM) */
uint16_t sbDrvrCount; /* number of driver descriptors */
struct apple_drvr_descriptor sb_dd[APPLE_DRVR_MAP_MAX_DESCRIPTORS];
uint16_t pad[3];
} __attribute__((__packed__));
/*
* Partition map structure from Inside Macintosh: Devices, SCSI Manager
* pp. 13-14. The partition map always begins on physical block 1.
*
* With the exception of block 0, all blocks on the disk must belong to
* exactly one partition. The partition map itself belongs to a partition
* of type `APPLE_PARTITION_MAP', and is not limited in size by anything
* other than available disk space. The partition map is not necessarily
* the first partition listed.
*/
#define APPLE_PART_MAP_ENTRY_MAGIC 0x504d
struct apple_part_map_entry {
uint16_t pmSig; /* partition signature */
uint16_t pmSigPad; /* (reserved) */
uint32_t pmMapBlkCnt; /* number of blocks in partition map */
uint32_t pmPyPartStart; /* first physical block of partition */
uint32_t pmPartBlkCnt; /* number of blocks in partition */
uint8_t pmPartName[32]; /* partition name */
uint8_t pmPartType[32]; /* partition type */
uint32_t pmLgDataStart; /* first logical block of data area */
uint32_t pmDataCnt; /* number of blocks in data area */
uint32_t pmPartStatus; /* partition status information */
uint32_t pmLgBootStart; /* first logical block of boot code */
uint32_t pmBootSize; /* size of boot code, in bytes */
uint32_t pmBootLoad; /* boot code load address */
uint32_t pmBootLoad2; /* (reserved) */
uint32_t pmBootEntry; /* boot code entry point */
uint32_t pmBootEntry2; /* (reserved) */
uint32_t pmBootCksum; /* boot code checksum */
int8_t pmProcessor[16]; /* processor type (e.g. "68020") */
uint8_t pmBootArgs[128]; /* A/UX boot arguments */
uint8_t pad[248]; /* pad to end of block */
};
#define APPLE_PART_TYPE_DRIVER "APPLE_DRIVER"
#define APPLE_PART_TYPE_DRIVER43 "APPLE_DRIVER43"
#define APPLE_PART_TYPE_DRIVERATA "APPLE_DRIVER_ATA"
#define APPLE_PART_TYPE_DRIVERIOKIT "APPLE_DRIVER_IOKIT"
#define APPLE_PART_TYPE_FWDRIVER "APPLE_FWDRIVER"
#define APPLE_PART_TYPE_FWB_COMPONENT "FWB DRIVER COMPONENTS"
#define APPLE_PART_TYPE_FREE "APPLE_FREE"
#define APPLE_PART_TYPE_MAC "APPLE_HFS"
#define APPLE_PART_TYPE_NETBSD "NETBSD"
#define APPLE_PART_TYPE_NBSD_PPCBOOT "NETBSD/MACPPC"
#define APPLE_PART_TYPE_NBSD_68KBOOT "NETBSD/MAC68K"
#define APPLE_PART_TYPE_PATCHES "APPLE_PATCHES"
#define APPLE_PART_TYPE_PARTMAP "APPLE_PARTITION_MAP"
#define APPLE_PART_TYPE_PATCHES "APPLE_PATCHES"
#define APPLE_PART_TYPE_SCRATCH "APPLE_SCRATCH"
#define APPLE_PART_TYPE_UNIX "APPLE_UNIX_SVR2"
/*
* "pmBootArgs" for APPLE_UNIX_SVR2 partition.
* NetBSD/mac68k only uses Magic, Cluster, Type, and Flags.
*/
struct apple_blockzeroblock {
uint32_t bzbMagic;
uint8_t bzbCluster;
uint8_t bzbType;
uint16_t bzbBadBlockInode;
uint16_t bzbFlags;
uint16_t bzbReserved;
uint32_t bzbCreationTime;
uint32_t bzbMountTime;
uint32_t bzbUMountTime;
};
#define APPLE_BZB_MAGIC 0xABADBABE
#define APPLE_BZB_TYPEFS 1
#define APPLE_BZB_TYPESWAP 3
#define APPLE_BZB_ROOTFS 0x8000
#define APPLE_BZB_USRFS 0x4000
/* ------------------------------------------
* hp300
*
*/
/* volume header for "LIF" format volumes */
struct hp300_lifvol {
int16_t vol_id;
char vol_label[6];
int32_t vol_addr;
int16_t vol_oct;
int16_t vol_dummy;
int32_t vol_dirsize;
int16_t vol_version;
int16_t vol_zero;
int32_t vol_huh1;
int32_t vol_huh2;
int32_t vol_length;
};
/* LIF directory entry format */
struct hp300_lifdir {
char dir_name[10];
int16_t dir_type;
int32_t dir_addr;
int32_t dir_length;
char dir_toc[6];
int16_t dir_flag;
int32_t dir_exec;
};
/* load header for boot rom */
struct hp300_load {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -