Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // IronArc Port
- // linux/arch/alpha/boot/tools/mkbb.c
- // Includes: fcntl, unistd, stdlib, stdio
- // MAXPARTITIONS = 8
- // u8 = unsigned char (byte)
- // u16 = unsigned short (ushort)
- // u32 = unsigned int (uint)
- // Struct disklabel
- // u32 d_magic +0
- // u16 d_type +4
- // u16 d_subtype +6
- // u8 d_typename[16] +8
- // u8 d_packname[16] +24
- // u32 d_secsize +40
- // u32 d_nsectors +44
- // u32 d_ntracks +48
- // u32 d_ncylinders +52
- // u32 d_secpercyl +56
- // u32 d_secprtunit +60
- // u16 d_sparespertrack +64
- // u16 d_sparespercyl +66
- // u32 d_acylinders +68
- // u16 d_rpm +72
- // u16 d_interleave +74
- // u16 d_trackskew +76
- // u16 d_cylskew +78
- // u32 d_headswitch +80
- // u32 d_trkseek +84
- // u32 d_flags +88
- // u32 d_drivedata[5] +92
- // u32 d_spare[5] +112
- // u32 d_magic2 +132
- // u16 d_checksum +136
- // u16 d_npartitions +138
- // u32 d_bbsize +142
- // u32 d_sbsize +146
- // d_partition d_partitions[MAXPARTITIONS] +150
- // Total size: 286 bytes
- // Struct d_partition
- // u32 p_size +0
- // u32 p_offset +4
- // u32 p_fsize +8
- // u8 p_fstype +12
- // u8 p_frag +13
- // u16 p_cpg +15
- // Total size: 17 bytes
- // Union __bootblock
- // Implicit struct #1 __u1 +0
- // Implicit struct #2 __u2 +350
- // char bootblock_bytes[512] +0
- // unsigned long bootblock_quadwords[64] +0
- // Total size: 862 bytes
- // Implicit struct #1
- // char __pad1[64] +0
- // struct disklabel __label +64
- // Total size: 350 bytes
- // Implicit struct #2
- // unsigned long __pad2[63] +0
- // unsigned long __checksum +504
- // Total size: 512 bytes
- // bootblock_label == __u1.__label (offset +64)
- // bootblock_checksum == __u2.checksum (offset +504)
- // int main (int argc, char ** argv)
- main:
- // Args: **argv on stack[1], argc on stack[0]
- // bootblock bootblock_from_disk;
- push 862
- call malloc
- // bootblock bootloader_image;
- push 862
- call malloc
- // int dev, fd;
- push 0
- push 0
- // int i;
- push 0
- // int nread;
- push 0
- // if (argc != 3)
- mov stack[6] eax
- ineql eax 3 eax
- cjmp main__argc_ineq_3_true eax
- mov 0 eax
- // dev = open(argv[1], O_RDWR)
- push 1
- mov stack[7] ebx
- mov *ebx ebx
- addl ebx 1 ebx
- mov *ebx ebx
- call open
- mov stack[0] stack[3]
- pop nul
- // if (dev < 0)
- mov stack[2] eax
- ltl eax 0 eax
- cjmp main__dev_lt_0_true eax
- mov 0 eax
- // fd = open(argv[2], O_RDONLY)
- push 0
- mov stack[7] ebx
- mov *ebx ebx
- addl ebx 2 ebx
- mov *ebx ebx
- call open
- mov stack[0] stack[4]
- pop nul
- // if (fd < 0)
- mov stack[3] eax
- ltl eax 0 eax
- cjmp main__fd_lt_0_true
- mov 0 eax
- // nread = read(fd, &bootloader_image, sizeof(bootblock))
- push 862
- push stack[5]
- push stack[5]
- call read
- mov stack[0] stack[1]
- pop nul
- // if (nread != sizeof(bootblock))
- mov stack[0] eax
- ineql eax 862 eax
- cjmp main__nread_ineq_sizeof_bootblock_true eax
- mov 0 eax
- // nread = read(dev, &bootblock_from_disk, sizeof(bootblock));
- push 862
- push stack[6]
- push stack[4]
- call read
- mov stack[0] stack[1]
- pop nul
- // if (nread != sizeof(bootblock))
- mov stack[0] eax
- ineql eax 862 eax
- cjmp main__nread_ineql_sizeof_bootblock_2_true eax
- mov 0 eax
- // bootloader_image.bootblock_label = bootblock_from_disk.bootblock_label;
- mov stack[4] eax
- mov stack[5] ebx
- addl eax 64 eax
- addl ebx 64 ebx
- mov 286 ecx
- main__loop_main:
- mov *ebx+1 *eax+1
- decl ecx
- cjmp main__loop_main ecx
- mov 0 eax
- mov 0 ebx
- // bootloader_image.bootblock_checksum = 0;
- mov stack[4] eax
- addl eax 504 eax
- mov 0 *eax+8
- // for (i = 0; i < 63; i++)
- // bootloader_image.bootblock_checksum += bootloader_image.bootblock_quadwords[i];
- main__loop2_main:
- mov stack[4] ebx
- mov stack[1] ecx
- multl ecx 8 ecx
- addl ebx ecx ebx
- addl *eax+8 *ebx+8 *eax
- incl stack[2]
- mov stack[2] ecx
- ltl ecx 63 ecx
- notl ecx ecx
- cjmp main__loop2_main ecx
- mov 0 eax
- mov 0 ebx
- mov 0 ecx
- // lseek(dev, 0L, SEEK_SET);
- push 0
- push 0
- push stack[4]
- call lseek
- // if (write(dev, &bootloader_image, sizeof(bootblock)) != sizeof (bootblock))
- push 862
- push stack[5]
- push stack[4]
- call write
- pop eax
- ineql eax 862 eax
- cjmp main__write_dev_bootloader_image_sizeof_bootblock_ineq_sizeof_bootblock eax
- mov 0 eax
- // close(fd);
- push stack[3]
- call close
- // close(dev)
- push stack[2]
- call close
- // Cleanup
- pop nul
- pop nul
- pop nul
- pop nul
- pop nul
- pop nul
- pop nul
- pop nul
- // exit(0);
- push 0
- call exit
- main__argc_ineq_3_true:
- // fprintf(stderr, "Usage: %s device lxboot\n", argv[0]);
- mov stack[7] ebx
- mov *ebx ebx
- mov *ebx ebx
- push ebx
- push "Usage: %s device lxboot\n"
- push 2
- call fprintf
- // exit(0);
- push 0
- call exit
- main__dev_lt_0_true:
- // perror(argv[1]);
- mov stack[7] ebx
- mov *ebx ebx
- addl ebx 1 ebx
- mov *ebx ebx
- push ebx
- call perror
- // exit(0);
- push 0
- call exit
- main__fd_lt_0_true:
- // perror(argv[2])
- mov stack[7] eax
- mov *eax eax
- addl eax 2 eax
- mov *eax eax
- call perror
- // close(dev)
- push stack[2]
- call close
- // exit(0)
- push 0
- call exit
- main__nread_ineq_sizeof_bootblock_true:
- // perror("lxboot read");
- push "lxboot read"
- call perror
- // fprintf(stderr, "expected %zd, got %d\n", sizeof(bootblock), nread);
- push stack[0]
- push 862
- push "expected %zd, got %d\n"
- push 2
- call fprintf
- // exit(0);
- push 0
- call exit
- main__nread_ineq_sizeof_bootblock_2_true:
- // perror("bootblock read");
- push "bootblock read"
- call perror
- // fprintf(stderr, "expected %zd, got %d\n, sizeof(bootblock), nread);
- push stack[0]
- push 862
- push "expected %zd, got %d\n"
- push 2
- call fprintf
- // exit(0);
- push 0
- call exit
- main__write_dev_bootloader_image_sizeof_bootblock_ineq_sizeof_bootblock
- // perror("bootblock write");
- push "bootblock write"
- call perror
- // exit(0);
- push 0
- call exit
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement