Advertisement
smc_gamer

linux/arch/alpha/boot/tools/mkbb.iasm

Apr 28th, 2014
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.86 KB | None | 0 0
  1. // IronArc Port
  2. // linux/arch/alpha/boot/tools/mkbb.c
  3.  
  4. // Includes: fcntl, unistd, stdlib, stdio
  5. // MAXPARTITIONS = 8
  6. // u8 = unsigned char (byte)
  7. // u16 = unsigned short (ushort)
  8. // u32 = unsigned int (uint)
  9.  
  10. // Struct disklabel
  11. // u32 d_magic +0
  12. // u16 d_type +4
  13. // u16 d_subtype +6
  14. // u8 d_typename[16] +8
  15. // u8 d_packname[16] +24
  16. // u32 d_secsize +40
  17. // u32 d_nsectors +44
  18. // u32 d_ntracks +48
  19. // u32 d_ncylinders +52
  20. // u32 d_secpercyl +56
  21. // u32 d_secprtunit +60
  22. // u16 d_sparespertrack +64
  23. // u16 d_sparespercyl +66
  24. // u32 d_acylinders +68
  25. // u16 d_rpm +72
  26. // u16 d_interleave +74
  27. // u16 d_trackskew +76
  28. // u16 d_cylskew +78
  29. // u32 d_headswitch +80
  30. // u32 d_trkseek +84
  31. // u32 d_flags +88
  32. // u32 d_drivedata[5] +92
  33. // u32 d_spare[5] +112
  34. // u32 d_magic2 +132
  35. // u16 d_checksum +136
  36. // u16 d_npartitions +138
  37. // u32 d_bbsize +142
  38. // u32 d_sbsize +146
  39. // d_partition d_partitions[MAXPARTITIONS] +150
  40. // Total size: 286 bytes
  41.  
  42. // Struct d_partition
  43. // u32 p_size +0
  44. // u32 p_offset +4
  45. // u32 p_fsize +8
  46. // u8 p_fstype +12
  47. // u8 p_frag +13
  48. // u16 p_cpg +15
  49. // Total size: 17 bytes
  50.  
  51. // Union __bootblock
  52. // Implicit struct #1 __u1 +0
  53. // Implicit struct #2 __u2 +350
  54. // char bootblock_bytes[512] +0
  55. // unsigned long bootblock_quadwords[64] +0
  56. // Total size: 862 bytes
  57.  
  58. // Implicit struct #1
  59. // char __pad1[64] +0
  60. // struct disklabel __label +64
  61. // Total size: 350 bytes
  62.  
  63. // Implicit struct #2
  64. // unsigned long __pad2[63] +0
  65. // unsigned long __checksum +504
  66. // Total size: 512 bytes
  67.  
  68. // bootblock_label == __u1.__label (offset +64)
  69. // bootblock_checksum == __u2.checksum (offset +504)
  70.  
  71. // int main (int argc, char ** argv)
  72. main:
  73. // Args: **argv on stack[1], argc on stack[0]
  74.  
  75. // bootblock bootblock_from_disk;
  76. push 862
  77. call malloc
  78.  
  79. // bootblock bootloader_image;
  80. push 862
  81. call malloc
  82.  
  83. // int dev, fd;
  84. push 0
  85. push 0
  86.  
  87. // int i;
  88. push 0
  89.  
  90. // int nread;
  91. push 0
  92.  
  93. // if (argc != 3)
  94. mov stack[6] eax
  95. ineql eax 3 eax
  96. cjmp main__argc_ineq_3_true eax
  97. mov 0 eax
  98.  
  99. // dev = open(argv[1], O_RDWR)
  100. push 1
  101. mov stack[7] ebx
  102. mov *ebx ebx
  103. addl ebx 1 ebx
  104. mov *ebx ebx
  105. call open
  106. mov stack[0] stack[3]
  107. pop nul
  108.  
  109. // if (dev < 0)
  110. mov stack[2] eax
  111. ltl eax 0 eax
  112. cjmp main__dev_lt_0_true eax
  113. mov 0 eax
  114.  
  115. // fd = open(argv[2], O_RDONLY)
  116. push 0
  117. mov stack[7] ebx
  118. mov *ebx ebx
  119. addl ebx 2 ebx
  120. mov *ebx ebx
  121. call open
  122. mov stack[0] stack[4]
  123. pop nul
  124.  
  125. // if (fd < 0)
  126. mov stack[3] eax
  127. ltl eax 0 eax
  128. cjmp main__fd_lt_0_true
  129. mov 0 eax
  130.  
  131. // nread = read(fd, &bootloader_image, sizeof(bootblock))
  132. push 862
  133. push stack[5]
  134. push stack[5]
  135. call read
  136. mov stack[0] stack[1]
  137. pop nul
  138.  
  139. // if (nread != sizeof(bootblock))
  140. mov stack[0] eax
  141. ineql eax 862 eax
  142. cjmp main__nread_ineq_sizeof_bootblock_true eax
  143. mov 0 eax
  144.  
  145. // nread = read(dev, &bootblock_from_disk, sizeof(bootblock));
  146. push 862
  147. push stack[6]
  148. push stack[4]
  149. call read
  150. mov stack[0] stack[1]
  151. pop nul
  152.  
  153. // if (nread != sizeof(bootblock))
  154. mov stack[0] eax
  155. ineql eax 862 eax
  156. cjmp main__nread_ineql_sizeof_bootblock_2_true eax
  157. mov 0 eax
  158.  
  159. // bootloader_image.bootblock_label = bootblock_from_disk.bootblock_label;
  160. mov stack[4] eax
  161. mov stack[5] ebx
  162. addl eax 64 eax
  163. addl ebx 64 ebx
  164. mov 286 ecx
  165. main__loop_main:
  166. mov *ebx+1 *eax+1
  167. decl ecx
  168. cjmp main__loop_main ecx
  169. mov 0 eax
  170. mov 0 ebx
  171.  
  172. // bootloader_image.bootblock_checksum = 0;
  173. mov stack[4] eax
  174. addl eax 504 eax
  175. mov 0 *eax+8
  176.  
  177. // for (i = 0; i < 63; i++)
  178. // bootloader_image.bootblock_checksum += bootloader_image.bootblock_quadwords[i];
  179. main__loop2_main:
  180. mov stack[4] ebx
  181. mov stack[1] ecx
  182. multl ecx 8 ecx
  183. addl ebx ecx ebx
  184. addl *eax+8 *ebx+8 *eax
  185. incl stack[2]
  186. mov stack[2] ecx
  187. ltl ecx 63 ecx
  188. notl ecx ecx
  189. cjmp main__loop2_main ecx
  190. mov 0 eax
  191. mov 0 ebx
  192. mov 0 ecx
  193.  
  194. // lseek(dev, 0L, SEEK_SET);
  195. push 0
  196. push 0
  197. push stack[4]
  198. call lseek
  199.  
  200. // if (write(dev, &bootloader_image, sizeof(bootblock)) != sizeof (bootblock))
  201. push 862
  202. push stack[5]
  203. push stack[4]
  204. call write
  205. pop eax
  206. ineql eax 862 eax
  207. cjmp main__write_dev_bootloader_image_sizeof_bootblock_ineq_sizeof_bootblock eax
  208. mov 0 eax
  209.  
  210. // close(fd);
  211. push stack[3]
  212. call close
  213.  
  214. // close(dev)
  215. push stack[2]
  216. call close
  217.  
  218. // Cleanup
  219. pop nul
  220. pop nul
  221. pop nul
  222. pop nul
  223. pop nul
  224. pop nul
  225. pop nul
  226. pop nul
  227.  
  228. // exit(0);
  229. push 0
  230. call exit
  231.  
  232. main__argc_ineq_3_true:
  233. // fprintf(stderr, "Usage: %s device lxboot\n", argv[0]);
  234. mov stack[7] ebx
  235. mov *ebx ebx
  236. mov *ebx ebx
  237. push ebx
  238. push "Usage: %s device lxboot\n"
  239. push 2
  240. call fprintf
  241.  
  242. // exit(0);
  243. push 0
  244. call exit
  245.  
  246. main__dev_lt_0_true:
  247. // perror(argv[1]);
  248. mov stack[7] ebx
  249. mov *ebx ebx
  250. addl ebx 1 ebx
  251. mov *ebx ebx
  252. push ebx
  253. call perror
  254.  
  255. // exit(0);
  256. push 0
  257. call exit
  258.  
  259. main__fd_lt_0_true:
  260. // perror(argv[2])
  261. mov stack[7] eax
  262. mov *eax eax
  263. addl eax 2 eax
  264. mov *eax eax
  265. call perror
  266.  
  267. // close(dev)
  268. push stack[2]
  269. call close
  270.  
  271. // exit(0)
  272. push 0
  273. call exit
  274.  
  275. main__nread_ineq_sizeof_bootblock_true:
  276. // perror("lxboot read");
  277. push "lxboot read"
  278. call perror
  279.  
  280. // fprintf(stderr, "expected %zd, got %d\n", sizeof(bootblock), nread);
  281. push stack[0]
  282. push 862
  283. push "expected %zd, got %d\n"
  284. push 2
  285. call fprintf
  286.  
  287. // exit(0);
  288. push 0
  289. call exit
  290.  
  291. main__nread_ineq_sizeof_bootblock_2_true:
  292. // perror("bootblock read");
  293. push "bootblock read"
  294. call perror
  295.  
  296. // fprintf(stderr, "expected %zd, got %d\n, sizeof(bootblock), nread);
  297. push stack[0]
  298. push 862
  299. push "expected %zd, got %d\n"
  300. push 2
  301. call fprintf
  302.  
  303. // exit(0);
  304. push 0
  305. call exit
  306.  
  307. main__write_dev_bootloader_image_sizeof_bootblock_ineq_sizeof_bootblock
  308. // perror("bootblock write");
  309. push "bootblock write"
  310. call perror
  311.  
  312. // exit(0);
  313. push 0
  314. call exit
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement