]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[bios] Define macros for constructing partition table entries
authorMichael Brown <mcb30@ipxe.org>
Sun, 1 Mar 2020 11:58:47 +0000 (11:58 +0000)
committerMichael Brown <mcb30@ipxe.org>
Sun, 1 Mar 2020 12:34:45 +0000 (12:34 +0000)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/arch/x86/prefix/usbdisk.S

index 9676406e2064e5b82e5162840dea0ce5225080cb..830f3774c256390b479379bf784331d36974621b 100644 (file)
@@ -9,26 +9,53 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
 #include "mbr.S"
 
 /* Partition table: 64 heads, 32 sectors/track (ZIP-drive compatible) */
+#define HEADS 64
+#define SECTORS 32
+#define CYLADDR(cyl) ((((cyl) * HEADS + (((cyl) == 0) & 1)) * SECTORS) * 512)
+
+#define LOGSTART 0
+#define LOGCOUNT 1
+#define BOOTSTART 1
+#define BOOTCOUNT 2
+
+       /* Construct a C/H/S address */
+       .macro  chs cylinder, head, sector
+       .byte   \head
+       .byte   (((\cylinder & 0x300) >> 2) | \sector)
+       .byte   (\cylinder & 0x0ff)
+       .endm
+
+       /* Construct a linear address */
+       .macro  linear cylinders, heads, sectors
+       .long   ((((\cylinders * HEADS) + \heads) * SECTORS) + \sectors - 1)
+       .endm
+
+       /* Construct a partition table entry */
+       .macro  partition bootflag, type, start, count
+       .byte   \bootflag
+       chs     \start, ((\start == 0) & 1), 1
+       .byte   \type
+       chs     (\start + \count - 1), (HEADS - 1), SECTORS
+       linear  \start, ((\start == 0) & 1), 1
+       linear  \count, 0, (1 - (((\start == 0) & 1) * SECTORS))
+       .endm
+
+       /* Partition table */
        .org 446
        .space 16
        .space 16
        /* Partition 3: log partition (for CONSOLE_INT13) */
-       .byte 0x00, 0x01, 0x01, 0x00
-       .byte 0xe0, 0x3f, 0x20, 0x00
-       .long 0x00000020
-       .long 0x000007e0
+       partition 0x00, 0xe0, LOGSTART, LOGCOUNT
        /* Partition 4: boot partition */
-       .byte 0x80, 0x00, 0x01, 0x01
-       .byte 0xeb, 0x3f, 0x20, 0x02
-       .long 0x00000800
-       .long 0x00001000
+       partition 0x80, 0xeb, BOOTSTART, BOOTCOUNT
 
+       /* Disk signature */
        .org 510
        .byte 0x55, 0xaa
 
 /* Skip to start of log partition */
-       .org 32 * 512
+       .org CYLADDR(LOGSTART)
        .ascii "iPXE LOG\n\n"
 
 /* Skip to start of boot partition */
-       .org 2048 * 512
+       .org CYLADDR(BOOTSTART)