v86 0.3.4 → 0.3.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (369) hide show
  1. package/Readme.md +4 -4
  2. package/bios/seabios/.config +113 -0
  3. package/bios/seabios/.config.old +114 -0
  4. package/bios/seabios/.gitignore +4 -0
  5. package/bios/seabios/COPYING +674 -0
  6. package/bios/seabios/COPYING.LESSER +165 -0
  7. package/bios/seabios/Makefile +286 -0
  8. package/bios/seabios/README +17 -0
  9. package/bios/seabios/docs/Build_overview.md +104 -0
  10. package/bios/seabios/docs/Contributing.md +20 -0
  11. package/bios/seabios/docs/Debugging.md +111 -0
  12. package/bios/seabios/docs/Developer_Documentation.md +25 -0
  13. package/bios/seabios/docs/Developer_links.md +86 -0
  14. package/bios/seabios/docs/Download.md +27 -0
  15. package/bios/seabios/docs/Execution_and_code_flow.md +178 -0
  16. package/bios/seabios/docs/Linking_overview.md +160 -0
  17. package/bios/seabios/docs/Mailinglist.md +8 -0
  18. package/bios/seabios/docs/Memory_Model.md +253 -0
  19. package/bios/seabios/docs/README +5 -0
  20. package/bios/seabios/docs/Releases.md +482 -0
  21. package/bios/seabios/docs/Runtime_config.md +193 -0
  22. package/bios/seabios/docs/SeaBIOS.md +17 -0
  23. package/bios/seabios/docs/SeaVGABIOS.md +39 -0
  24. package/bios/seabios/out/autoconf.h +117 -0
  25. package/bios/seabios/out/include/config/acpi/dsdt.h +0 -0
  26. package/bios/seabios/out/include/config/acpi.h +0 -0
  27. package/bios/seabios/out/include/config/ahci.h +0 -0
  28. package/bios/seabios/out/include/config/apmbios.h +0 -0
  29. package/bios/seabios/out/include/config/ata/dma.h +0 -0
  30. package/bios/seabios/out/include/config/ata/pio32.h +0 -0
  31. package/bios/seabios/out/include/config/ata.h +0 -0
  32. package/bios/seabios/out/include/config/auto.conf +69 -0
  33. package/bios/seabios/out/include/config/auto.conf.cmd +9 -0
  34. package/bios/seabios/out/include/config/boot.h +0 -0
  35. package/bios/seabios/out/include/config/bootorder.h +0 -0
  36. package/bios/seabios/out/include/config/build/vgabios.h +0 -0
  37. package/bios/seabios/out/include/config/call32/smm.h +0 -0
  38. package/bios/seabios/out/include/config/cdrom/boot.h +0 -0
  39. package/bios/seabios/out/include/config/cdrom/emu.h +0 -0
  40. package/bios/seabios/out/include/config/debug/level.h +0 -0
  41. package/bios/seabios/out/include/config/drives.h +0 -0
  42. package/bios/seabios/out/include/config/entry/extrastack.h +0 -0
  43. package/bios/seabios/out/include/config/esp/scsi.h +0 -0
  44. package/bios/seabios/out/include/config/flash/floppy.h +0 -0
  45. package/bios/seabios/out/include/config/floppy.h +0 -0
  46. package/bios/seabios/out/include/config/fw/romfile/load.h +0 -0
  47. package/bios/seabios/out/include/config/hardware/irq.h +0 -0
  48. package/bios/seabios/out/include/config/kbd/call/int15/4f.h +0 -0
  49. package/bios/seabios/out/include/config/keyboard.h +0 -0
  50. package/bios/seabios/out/include/config/lpt.h +0 -0
  51. package/bios/seabios/out/include/config/lsi/scsi.h +0 -0
  52. package/bios/seabios/out/include/config/malloc/uppermemory.h +0 -0
  53. package/bios/seabios/out/include/config/megasas.h +0 -0
  54. package/bios/seabios/out/include/config/mouse.h +0 -0
  55. package/bios/seabios/out/include/config/mpt/scsi.h +0 -0
  56. package/bios/seabios/out/include/config/mptable.h +0 -0
  57. package/bios/seabios/out/include/config/mtrr/init.h +0 -0
  58. package/bios/seabios/out/include/config/optionroms.h +0 -0
  59. package/bios/seabios/out/include/config/override/pci/id.h +0 -0
  60. package/bios/seabios/out/include/config/pcibios.h +0 -0
  61. package/bios/seabios/out/include/config/pirtable.h +0 -0
  62. package/bios/seabios/out/include/config/pmm.h +0 -0
  63. package/bios/seabios/out/include/config/pmtimer.h +0 -0
  64. package/bios/seabios/out/include/config/pnpbios.h +0 -0
  65. package/bios/seabios/out/include/config/ps2port.h +0 -0
  66. package/bios/seabios/out/include/config/pvscsi.h +0 -0
  67. package/bios/seabios/out/include/config/qemu/hardware.h +0 -0
  68. package/bios/seabios/out/include/config/qemu.h +0 -0
  69. package/bios/seabios/out/include/config/rom/size.h +0 -0
  70. package/bios/seabios/out/include/config/rtc/timer.h +0 -0
  71. package/bios/seabios/out/include/config/s3/resume.h +0 -0
  72. package/bios/seabios/out/include/config/sdcard.h +0 -0
  73. package/bios/seabios/out/include/config/serial.h +0 -0
  74. package/bios/seabios/out/include/config/tcgbios.h +0 -0
  75. package/bios/seabios/out/include/config/threads.h +0 -0
  76. package/bios/seabios/out/include/config/tristate.conf +4 -0
  77. package/bios/seabios/out/include/config/tsc/timer.h +0 -0
  78. package/bios/seabios/out/include/config/use/smm.h +0 -0
  79. package/bios/seabios/out/include/config/vga/allocate/extra/stack.h +0 -0
  80. package/bios/seabios/out/include/config/vga/bochs/stdvga.h +0 -0
  81. package/bios/seabios/out/include/config/vga/bochs.h +0 -0
  82. package/bios/seabios/out/include/config/vga/did.h +0 -0
  83. package/bios/seabios/out/include/config/vga/extra/stack/size.h +0 -0
  84. package/bios/seabios/out/include/config/vga/fixup/asm.h +0 -0
  85. package/bios/seabios/out/include/config/vga/pci.h +0 -0
  86. package/bios/seabios/out/include/config/vga/stdvga/ports.h +0 -0
  87. package/bios/seabios/out/include/config/vga/vbe.h +0 -0
  88. package/bios/seabios/out/include/config/vga/vid.h +0 -0
  89. package/bios/seabios/out/include/config/vgahooks.h +0 -0
  90. package/bios/seabios/out/include/config/virtio/blk.h +0 -0
  91. package/bios/seabios/out/include/config/virtio/scsi.h +0 -0
  92. package/bios/seabios/out/include/config/xen.h +0 -0
  93. package/bios/seabios/out/scripts/kconfig/conf +0 -0
  94. package/bios/seabios/out/scripts/kconfig/conf.o +0 -0
  95. package/bios/seabios/out/scripts/kconfig/zconf.hash.c +289 -0
  96. package/bios/seabios/out/scripts/kconfig/zconf.lex.c +2420 -0
  97. package/bios/seabios/out/scripts/kconfig/zconf.tab.c +2538 -0
  98. package/bios/seabios/out/scripts/kconfig/zconf.tab.o +0 -0
  99. package/bios/seabios/scripts/acpi_extract.py +366 -0
  100. package/bios/seabios/scripts/acpi_extract_preprocess.py +41 -0
  101. package/bios/seabios/scripts/buildrom.py +56 -0
  102. package/bios/seabios/scripts/buildversion.py +134 -0
  103. package/bios/seabios/scripts/checkrom.py +95 -0
  104. package/bios/seabios/scripts/checkstack.py +226 -0
  105. package/bios/seabios/scripts/checksum.py +16 -0
  106. package/bios/seabios/scripts/encodeint.py +21 -0
  107. package/bios/seabios/scripts/gen-offsets.sh +17 -0
  108. package/bios/seabios/scripts/kconfig/.gitignore +22 -0
  109. package/bios/seabios/scripts/kconfig/Makefile +331 -0
  110. package/bios/seabios/scripts/kconfig/POTFILES.in +12 -0
  111. package/bios/seabios/scripts/kconfig/check.sh +13 -0
  112. package/bios/seabios/scripts/kconfig/conf.c +718 -0
  113. package/bios/seabios/scripts/kconfig/confdata.c +1250 -0
  114. package/bios/seabios/scripts/kconfig/expr.c +1168 -0
  115. package/bios/seabios/scripts/kconfig/expr.h +241 -0
  116. package/bios/seabios/scripts/kconfig/gconf.c +1542 -0
  117. package/bios/seabios/scripts/kconfig/gconf.glade +661 -0
  118. package/bios/seabios/scripts/kconfig/images.c +326 -0
  119. package/bios/seabios/scripts/kconfig/kxgettext.c +235 -0
  120. package/bios/seabios/scripts/kconfig/lex.zconf.c +2430 -0
  121. package/bios/seabios/scripts/kconfig/list.h +131 -0
  122. package/bios/seabios/scripts/kconfig/lkc.h +200 -0
  123. package/bios/seabios/scripts/kconfig/lkc_proto.h +57 -0
  124. package/bios/seabios/scripts/kconfig/lxdialog/.gitignore +4 -0
  125. package/bios/seabios/scripts/kconfig/lxdialog/BIG.FAT.WARNING +4 -0
  126. package/bios/seabios/scripts/kconfig/lxdialog/check-lxdialog.sh +87 -0
  127. package/bios/seabios/scripts/kconfig/lxdialog/checklist.c +332 -0
  128. package/bios/seabios/scripts/kconfig/lxdialog/dialog.h +257 -0
  129. package/bios/seabios/scripts/kconfig/lxdialog/inputbox.c +301 -0
  130. package/bios/seabios/scripts/kconfig/lxdialog/menubox.c +437 -0
  131. package/bios/seabios/scripts/kconfig/lxdialog/textbox.c +408 -0
  132. package/bios/seabios/scripts/kconfig/lxdialog/util.c +713 -0
  133. package/bios/seabios/scripts/kconfig/lxdialog/yesno.c +114 -0
  134. package/bios/seabios/scripts/kconfig/mconf.c +1036 -0
  135. package/bios/seabios/scripts/kconfig/menu.c +697 -0
  136. package/bios/seabios/scripts/kconfig/merge_config.sh +150 -0
  137. package/bios/seabios/scripts/kconfig/nconf.c +1556 -0
  138. package/bios/seabios/scripts/kconfig/nconf.gui.c +656 -0
  139. package/bios/seabios/scripts/kconfig/nconf.h +96 -0
  140. package/bios/seabios/scripts/kconfig/qconf.cc +1795 -0
  141. package/bios/seabios/scripts/kconfig/qconf.h +338 -0
  142. package/bios/seabios/scripts/kconfig/streamline_config.pl +647 -0
  143. package/bios/seabios/scripts/kconfig/symbol.c +1373 -0
  144. package/bios/seabios/scripts/kconfig/util.c +157 -0
  145. package/bios/seabios/scripts/kconfig/zconf.gperf +48 -0
  146. package/bios/seabios/scripts/kconfig/zconf.hash.c_shipped +289 -0
  147. package/bios/seabios/scripts/kconfig/zconf.l +363 -0
  148. package/bios/seabios/scripts/kconfig/zconf.lex.c_shipped +2420 -0
  149. package/bios/seabios/scripts/kconfig/zconf.tab.c_shipped +2538 -0
  150. package/bios/seabios/scripts/kconfig/zconf.y +733 -0
  151. package/bios/seabios/scripts/layoutrom.py +705 -0
  152. package/bios/seabios/scripts/python23compat.py +14 -0
  153. package/bios/seabios/scripts/readserial.py +190 -0
  154. package/bios/seabios/scripts/tarball.sh +36 -0
  155. package/bios/seabios/scripts/test-build.sh +90 -0
  156. package/bios/seabios/scripts/transdump.py +53 -0
  157. package/bios/seabios/scripts/vgafixup.py +96 -0
  158. package/bios/seabios/src/Kconfig +579 -0
  159. package/bios/seabios/src/apm.c +215 -0
  160. package/bios/seabios/src/asm-offsets.c +23 -0
  161. package/bios/seabios/src/biosvar.h +130 -0
  162. package/bios/seabios/src/block.c +623 -0
  163. package/bios/seabios/src/block.h +121 -0
  164. package/bios/seabios/src/bmp.c +117 -0
  165. package/bios/seabios/src/boot.c +793 -0
  166. package/bios/seabios/src/bootsplash.c +255 -0
  167. package/bios/seabios/src/bregs.h +80 -0
  168. package/bios/seabios/src/byteorder.h +71 -0
  169. package/bios/seabios/src/cdrom.c +322 -0
  170. package/bios/seabios/src/clock.c +506 -0
  171. package/bios/seabios/src/code16gcc.s +1 -0
  172. package/bios/seabios/src/config.h +108 -0
  173. package/bios/seabios/src/cp437.c +275 -0
  174. package/bios/seabios/src/cp437.h +1 -0
  175. package/bios/seabios/src/disk.c +779 -0
  176. package/bios/seabios/src/e820map.c +152 -0
  177. package/bios/seabios/src/e820map.h +26 -0
  178. package/bios/seabios/src/entryfuncs.S +165 -0
  179. package/bios/seabios/src/farptr.h +208 -0
  180. package/bios/seabios/src/font.c +139 -0
  181. package/bios/seabios/src/fw/acpi-dsdt-cpu-hotplug.dsl +78 -0
  182. package/bios/seabios/src/fw/acpi-dsdt-dbug.dsl +26 -0
  183. package/bios/seabios/src/fw/acpi-dsdt-hpet.dsl +36 -0
  184. package/bios/seabios/src/fw/acpi-dsdt-isa.dsl +102 -0
  185. package/bios/seabios/src/fw/acpi-dsdt-pci-crs.dsl +90 -0
  186. package/bios/seabios/src/fw/acpi-dsdt.dsl +342 -0
  187. package/bios/seabios/src/fw/acpi-dsdt.hex +554 -0
  188. package/bios/seabios/src/fw/acpi.c +685 -0
  189. package/bios/seabios/src/fw/biostables.c +491 -0
  190. package/bios/seabios/src/fw/coreboot.c +569 -0
  191. package/bios/seabios/src/fw/csm.c +347 -0
  192. package/bios/seabios/src/fw/dev-pci.h +52 -0
  193. package/bios/seabios/src/fw/dev-piix.h +29 -0
  194. package/bios/seabios/src/fw/dev-q35.h +52 -0
  195. package/bios/seabios/src/fw/lzmadecode.c +398 -0
  196. package/bios/seabios/src/fw/lzmadecode.h +67 -0
  197. package/bios/seabios/src/fw/mptable.c +197 -0
  198. package/bios/seabios/src/fw/mtrr.c +105 -0
  199. package/bios/seabios/src/fw/multiboot.c +111 -0
  200. package/bios/seabios/src/fw/paravirt.c +624 -0
  201. package/bios/seabios/src/fw/paravirt.h +63 -0
  202. package/bios/seabios/src/fw/pciinit.c +1187 -0
  203. package/bios/seabios/src/fw/pirtable.c +103 -0
  204. package/bios/seabios/src/fw/q35-acpi-dsdt.dsl +450 -0
  205. package/bios/seabios/src/fw/romfile_loader.c +259 -0
  206. package/bios/seabios/src/fw/romfile_loader.h +91 -0
  207. package/bios/seabios/src/fw/shadow.c +208 -0
  208. package/bios/seabios/src/fw/smbios.c +585 -0
  209. package/bios/seabios/src/fw/smm.c +269 -0
  210. package/bios/seabios/src/fw/smp.c +194 -0
  211. package/bios/seabios/src/fw/ssdt-misc.dsl +104 -0
  212. package/bios/seabios/src/fw/ssdt-misc.hex +88 -0
  213. package/bios/seabios/src/fw/ssdt-pcihp.dsl +36 -0
  214. package/bios/seabios/src/fw/ssdt-pcihp.hex +38 -0
  215. package/bios/seabios/src/fw/ssdt-proc.dsl +48 -0
  216. package/bios/seabios/src/fw/ssdt-proc.hex +35 -0
  217. package/bios/seabios/src/fw/xen.c +149 -0
  218. package/bios/seabios/src/fw/xen.h +125 -0
  219. package/bios/seabios/src/gen-defs.h +19 -0
  220. package/bios/seabios/src/hw/ahci.c +697 -0
  221. package/bios/seabios/src/hw/ahci.h +201 -0
  222. package/bios/seabios/src/hw/ata.c +1046 -0
  223. package/bios/seabios/src/hw/ata.h +163 -0
  224. package/bios/seabios/src/hw/blockcmd.c +372 -0
  225. package/bios/seabios/src/hw/blockcmd.h +114 -0
  226. package/bios/seabios/src/hw/dma.c +67 -0
  227. package/bios/seabios/src/hw/esp-scsi.c +241 -0
  228. package/bios/seabios/src/hw/esp-scsi.h +8 -0
  229. package/bios/seabios/src/hw/floppy.c +741 -0
  230. package/bios/seabios/src/hw/lsi-scsi.c +221 -0
  231. package/bios/seabios/src/hw/lsi-scsi.h +8 -0
  232. package/bios/seabios/src/hw/megasas.c +405 -0
  233. package/bios/seabios/src/hw/megasas.h +8 -0
  234. package/bios/seabios/src/hw/mpt-scsi.c +319 -0
  235. package/bios/seabios/src/hw/mpt-scsi.h +8 -0
  236. package/bios/seabios/src/hw/nvme-int.h +199 -0
  237. package/bios/seabios/src/hw/nvme.c +708 -0
  238. package/bios/seabios/src/hw/nvme.h +17 -0
  239. package/bios/seabios/src/hw/pci.c +133 -0
  240. package/bios/seabios/src/hw/pci.h +47 -0
  241. package/bios/seabios/src/hw/pci_ids.h +2632 -0
  242. package/bios/seabios/src/hw/pci_regs.h +556 -0
  243. package/bios/seabios/src/hw/pcidevice.c +192 -0
  244. package/bios/seabios/src/hw/pcidevice.h +76 -0
  245. package/bios/seabios/src/hw/pic.c +115 -0
  246. package/bios/seabios/src/hw/pic.h +60 -0
  247. package/bios/seabios/src/hw/ps2port.c +543 -0
  248. package/bios/seabios/src/hw/ps2port.h +67 -0
  249. package/bios/seabios/src/hw/pvscsi.c +333 -0
  250. package/bios/seabios/src/hw/pvscsi.h +8 -0
  251. package/bios/seabios/src/hw/ramdisk.c +108 -0
  252. package/bios/seabios/src/hw/rtc.c +100 -0
  253. package/bios/seabios/src/hw/rtc.h +75 -0
  254. package/bios/seabios/src/hw/sdcard.c +572 -0
  255. package/bios/seabios/src/hw/serialio.c +113 -0
  256. package/bios/seabios/src/hw/serialio.h +29 -0
  257. package/bios/seabios/src/hw/timer.c +259 -0
  258. package/bios/seabios/src/hw/tpm_drivers.c +636 -0
  259. package/bios/seabios/src/hw/tpm_drivers.h +127 -0
  260. package/bios/seabios/src/hw/usb-ehci.c +650 -0
  261. package/bios/seabios/src/hw/usb-ehci.h +177 -0
  262. package/bios/seabios/src/hw/usb-hid.c +442 -0
  263. package/bios/seabios/src/hw/usb-hid.h +29 -0
  264. package/bios/seabios/src/hw/usb-hub.c +205 -0
  265. package/bios/seabios/src/hw/usb-hub.h +64 -0
  266. package/bios/seabios/src/hw/usb-msc.c +222 -0
  267. package/bios/seabios/src/hw/usb-msc.h +10 -0
  268. package/bios/seabios/src/hw/usb-ohci.c +568 -0
  269. package/bios/seabios/src/hw/usb-ohci.h +144 -0
  270. package/bios/seabios/src/hw/usb-uas.c +289 -0
  271. package/bios/seabios/src/hw/usb-uas.h +9 -0
  272. package/bios/seabios/src/hw/usb-uhci.c +571 -0
  273. package/bios/seabios/src/hw/usb-uhci.h +128 -0
  274. package/bios/seabios/src/hw/usb-xhci.c +1161 -0
  275. package/bios/seabios/src/hw/usb-xhci.h +133 -0
  276. package/bios/seabios/src/hw/usb.c +499 -0
  277. package/bios/seabios/src/hw/usb.h +254 -0
  278. package/bios/seabios/src/hw/virtio-blk.c +211 -0
  279. package/bios/seabios/src/hw/virtio-blk.h +43 -0
  280. package/bios/seabios/src/hw/virtio-pci.c +501 -0
  281. package/bios/seabios/src/hw/virtio-pci.h +151 -0
  282. package/bios/seabios/src/hw/virtio-ring.c +147 -0
  283. package/bios/seabios/src/hw/virtio-ring.h +121 -0
  284. package/bios/seabios/src/hw/virtio-scsi.c +220 -0
  285. package/bios/seabios/src/hw/virtio-scsi.h +47 -0
  286. package/bios/seabios/src/jpeg.c +1055 -0
  287. package/bios/seabios/src/kbd.c +599 -0
  288. package/bios/seabios/src/list.h +91 -0
  289. package/bios/seabios/src/malloc.c +561 -0
  290. package/bios/seabios/src/malloc.h +70 -0
  291. package/bios/seabios/src/memmap.h +21 -0
  292. package/bios/seabios/src/misc.c +195 -0
  293. package/bios/seabios/src/mouse.c +342 -0
  294. package/bios/seabios/src/optionroms.c +475 -0
  295. package/bios/seabios/src/output.c +584 -0
  296. package/bios/seabios/src/output.h +68 -0
  297. package/bios/seabios/src/pcibios.c +241 -0
  298. package/bios/seabios/src/pmm.c +176 -0
  299. package/bios/seabios/src/pnpbios.c +88 -0
  300. package/bios/seabios/src/post.c +337 -0
  301. package/bios/seabios/src/resume.c +157 -0
  302. package/bios/seabios/src/romfile.c +146 -0
  303. package/bios/seabios/src/romfile.h +21 -0
  304. package/bios/seabios/src/romlayout.S +698 -0
  305. package/bios/seabios/src/sercon.c +677 -0
  306. package/bios/seabios/src/serial.c +317 -0
  307. package/bios/seabios/src/sha1.c +147 -0
  308. package/bios/seabios/src/sha1.h +8 -0
  309. package/bios/seabios/src/stacks.c +771 -0
  310. package/bios/seabios/src/stacks.h +68 -0
  311. package/bios/seabios/src/std/LegacyBios.h +985 -0
  312. package/bios/seabios/src/std/acpi.h +323 -0
  313. package/bios/seabios/src/std/bda.h +174 -0
  314. package/bios/seabios/src/std/disk.h +175 -0
  315. package/bios/seabios/src/std/mptable.h +77 -0
  316. package/bios/seabios/src/std/multiboot.h +260 -0
  317. package/bios/seabios/src/std/optionrom.h +59 -0
  318. package/bios/seabios/src/std/pirtable.h +35 -0
  319. package/bios/seabios/src/std/pmm.h +19 -0
  320. package/bios/seabios/src/std/pnpbios.h +24 -0
  321. package/bios/seabios/src/std/smbios.h +167 -0
  322. package/bios/seabios/src/std/tcg.h +554 -0
  323. package/bios/seabios/src/std/vbe.h +156 -0
  324. package/bios/seabios/src/std/vga.h +63 -0
  325. package/bios/seabios/src/string.c +251 -0
  326. package/bios/seabios/src/string.h +31 -0
  327. package/bios/seabios/src/system.c +357 -0
  328. package/bios/seabios/src/tcgbios.c +2014 -0
  329. package/bios/seabios/src/tcgbios.h +19 -0
  330. package/bios/seabios/src/types.h +156 -0
  331. package/bios/seabios/src/util.h +251 -0
  332. package/bios/seabios/src/version.c +5 -0
  333. package/bios/seabios/src/vgahooks.c +355 -0
  334. package/bios/seabios/src/x86.c +23 -0
  335. package/bios/seabios/src/x86.h +277 -0
  336. package/bios/seabios/vgasrc/Kconfig +211 -0
  337. package/bios/seabios/vgasrc/bochsdisplay.c +59 -0
  338. package/bios/seabios/vgasrc/bochsvga.c +447 -0
  339. package/bios/seabios/vgasrc/bochsvga.h +57 -0
  340. package/bios/seabios/vgasrc/cbvga.c +337 -0
  341. package/bios/seabios/vgasrc/clext.c +627 -0
  342. package/bios/seabios/vgasrc/geodevga.c +434 -0
  343. package/bios/seabios/vgasrc/geodevga.h +89 -0
  344. package/bios/seabios/vgasrc/ramfb.c +163 -0
  345. package/bios/seabios/vgasrc/stdvga.c +485 -0
  346. package/bios/seabios/vgasrc/stdvga.h +81 -0
  347. package/bios/seabios/vgasrc/stdvgaio.c +186 -0
  348. package/bios/seabios/vgasrc/stdvgamodes.c +534 -0
  349. package/bios/seabios/vgasrc/swcursor.c +96 -0
  350. package/bios/seabios/vgasrc/vbe.c +432 -0
  351. package/bios/seabios/vgasrc/vgabios.c +1131 -0
  352. package/bios/seabios/vgasrc/vgabios.h +88 -0
  353. package/bios/seabios/vgasrc/vgaentry.S +161 -0
  354. package/bios/seabios/vgasrc/vgafb.c +661 -0
  355. package/bios/seabios/vgasrc/vgafb.h +42 -0
  356. package/bios/seabios/vgasrc/vgafonts.c +785 -0
  357. package/bios/seabios/vgasrc/vgahw.h +152 -0
  358. package/bios/seabios/vgasrc/vgainit.c +202 -0
  359. package/bios/seabios/vgasrc/vgalayout.lds.S +23 -0
  360. package/bios/seabios/vgasrc/vgautil.h +103 -0
  361. package/bios/seabios/vgasrc/vgaversion.c +6 -0
  362. package/build/binaries.js +1 -1
  363. package/build/index-debug.cjs +1 -1
  364. package/build/index-debug.js +1 -1
  365. package/build/index.cjs +1 -1
  366. package/build/index.js +1 -1
  367. package/build/v86-debug.wasm +0 -0
  368. package/build/v86.wasm +0 -0
  369. package/package.json +1 -1
@@ -0,0 +1,705 @@
1
+ #!/usr/bin/env python
2
+ # Script to analyze code and arrange ld sections.
3
+ #
4
+ # Copyright (C) 2008-2014 Kevin O'Connor <kevin@koconnor.net>
5
+ #
6
+ # This file may be distributed under the terms of the GNU GPLv3 license.
7
+
8
+ import operator
9
+ import sys
10
+
11
+ # LD script headers/trailers
12
+ COMMONHEADER = """
13
+ /* DO NOT EDIT! This is an autogenerated file. See scripts/layoutrom.py. */
14
+ OUTPUT_FORMAT("elf32-i386")
15
+ OUTPUT_ARCH("i386")
16
+ SECTIONS
17
+ {
18
+ """
19
+ COMMONTRAILER = """
20
+
21
+ /* Discard regular data sections to force a link error if
22
+ * code attempts to access data not marked with VAR16 (or other
23
+ * appropriate macro)
24
+ */
25
+ /DISCARD/ : {
26
+ *(.text*) *(.data*) *(.bss*) *(.rodata*)
27
+ *(COMMON) *(.discard*) *(.eh_frame) *(.note*)
28
+ }
29
+ }
30
+ """
31
+
32
+
33
+ ######################################################################
34
+ # Determine section locations
35
+ ######################################################################
36
+
37
+ # Align 'pos' up to 'alignbytes' offset
38
+ def alignpos(pos, alignbytes):
39
+ mask = alignbytes - 1
40
+ return (pos + mask) & ~mask
41
+
42
+ # Align 'pos' down to 'alignbytes' offset
43
+ def aligndown(pos, alignbytes):
44
+ mask = alignbytes - 1
45
+ return pos & ~mask
46
+
47
+ # Determine the final addresses for a list of sections that end at an
48
+ # address.
49
+ def setSectionsStart(sections, endaddr, minalign=1, segoffset=0):
50
+ totspace = 0
51
+ for section in sections:
52
+ minalign = max(minalign, section.align)
53
+ totspace = alignpos(totspace, section.align) + section.size
54
+ startaddr = int((endaddr - totspace) / minalign) * minalign
55
+ curaddr = startaddr
56
+ for section in sections:
57
+ curaddr = alignpos(curaddr, section.align)
58
+ section.finalloc = curaddr
59
+ section.finalsegloc = curaddr - segoffset
60
+ curaddr += section.size
61
+ return startaddr, minalign
62
+
63
+ # The 16bit code can't exceed 64K of space.
64
+ BUILD_BIOS_ADDR = 0xf0000
65
+ BUILD_BIOS_SIZE = 0x10000
66
+ BUILD_ROM_START = 0xc0000
67
+ BUILD_LOWRAM_END = 0xa0000
68
+ # Space to reserve in f-segment for dynamic allocations
69
+ BUILD_MIN_BIOSTABLE = 2048
70
+
71
+ # Layout the 16bit code. This ensures sections with fixed offset
72
+ # requirements are placed in the correct location. It also places the
73
+ # 16bit code as high as possible in the f-segment.
74
+ def fitSections(sections, fillsections):
75
+ # fixedsections = [(addr, section), ...]
76
+ fixedsections = []
77
+ for section in sections:
78
+ if section.name.startswith('.fixedaddr.'):
79
+ addr = int(section.name[11:], 16)
80
+ section.finalloc = addr + BUILD_BIOS_ADDR
81
+ section.finalsegloc = addr
82
+ fixedsections.append((addr, section))
83
+ if section.align != 1:
84
+ print("Error: Fixed section %s has non-zero alignment (%d)" % (
85
+ section.name, section.align))
86
+ sys.exit(1)
87
+ fixedsections.sort(key=operator.itemgetter(0))
88
+ firstfixed = fixedsections[0][0]
89
+
90
+ # Find freespace in fixed address area
91
+ # fixedAddr = [(freespace, section), ...]
92
+ fixedAddr = []
93
+ for i in range(len(fixedsections)):
94
+ fixedsectioninfo = fixedsections[i]
95
+ addr, section = fixedsectioninfo
96
+ if i == len(fixedsections) - 1:
97
+ nextaddr = BUILD_BIOS_SIZE
98
+ else:
99
+ nextaddr = fixedsections[i+1][0]
100
+ avail = nextaddr - addr - section.size
101
+ fixedAddr.append((avail, section))
102
+ fixedAddr.sort(key=operator.itemgetter(0))
103
+
104
+ # Attempt to fit other sections into fixed area
105
+ canrelocate = [(section.size, section.align, section.name, section)
106
+ for section in fillsections]
107
+ canrelocate.sort()
108
+ canrelocate = [section for size, align, name, section in canrelocate]
109
+ totalused = 0
110
+ for freespace, fixedsection in fixedAddr:
111
+ addpos = fixedsection.finalsegloc + fixedsection.size
112
+ totalused += fixedsection.size
113
+ nextfixedaddr = addpos + freespace
114
+ # print("Filling section %x uses %d, next=%x, available=%d" % (
115
+ # fixedsection.finalloc, fixedsection.size, nextfixedaddr, freespace))
116
+ while 1:
117
+ canfit = None
118
+ for fitsection in canrelocate:
119
+ if addpos + fitsection.size > nextfixedaddr:
120
+ # Can't fit and nothing else will fit.
121
+ break
122
+ fitnextaddr = alignpos(addpos, fitsection.align) + fitsection.size
123
+ # print("Test %s - %x vs %x" % (
124
+ # fitsection.name, fitnextaddr, nextfixedaddr))
125
+ if fitnextaddr > nextfixedaddr:
126
+ # This item can't fit.
127
+ continue
128
+ canfit = (fitnextaddr, fitsection)
129
+ if canfit is None:
130
+ break
131
+ # Found a section that can fit.
132
+ fitnextaddr, fitsection = canfit
133
+ canrelocate.remove(fitsection)
134
+ fitsection.finalloc = addpos + BUILD_BIOS_ADDR
135
+ fitsection.finalsegloc = addpos
136
+ addpos = fitnextaddr
137
+ totalused += fitsection.size
138
+ # print(" Adding %s (size %d align %d) pos=%x avail=%d" % (
139
+ # fitsection[2], fitsection[0], fitsection[1]
140
+ # , fitnextaddr, nextfixedaddr - fitnextaddr))
141
+
142
+ # Report stats
143
+ total = BUILD_BIOS_SIZE-firstfixed
144
+ slack = total - totalused
145
+ print ("Fixed space: 0x%x-0x%x total: %d slack: %d"
146
+ " Percent slack: %.1f%%" % (
147
+ firstfixed, BUILD_BIOS_SIZE, total, slack,
148
+ (float(slack) / total) * 100.0))
149
+
150
+ return firstfixed + BUILD_BIOS_ADDR
151
+
152
+ # Return the subset of sections with a given category
153
+ def getSectionsCategory(sections, category):
154
+ return [section for section in sections if section.category == category]
155
+
156
+ # Return the subset of sections with a given fileid
157
+ def getSectionsFileid(sections, fileid):
158
+ return [section for section in sections if section.fileid == fileid]
159
+
160
+ # Return the subset of sections with a given name prefix
161
+ def getSectionsPrefix(sections, prefix):
162
+ return [section for section in sections
163
+ if section.name.startswith(prefix)]
164
+
165
+ # The sections (and associated information) to be placed in output rom
166
+ class LayoutInfo:
167
+ sections = None
168
+ config = None
169
+ genreloc = None
170
+ sec32init_start = sec32init_end = sec32init_align = None
171
+ sec32low_start = sec32low_end = None
172
+ zonelow_base = final_sec32low_start = None
173
+ zonefseg_start = zonefseg_end = None
174
+ final_readonly_start = None
175
+ varlowsyms = entrysym = None
176
+
177
+ # Determine final memory addresses for sections
178
+ def doLayout(sections, config, genreloc):
179
+ li = LayoutInfo()
180
+ li.config = config
181
+ li.sections = sections
182
+ li.genreloc = genreloc
183
+ # Determine 16bit positions
184
+ sections16 = getSectionsCategory(sections, '16')
185
+ textsections = getSectionsPrefix(sections16, '.text.')
186
+ rodatasections = getSectionsPrefix(sections16, '.rodata')
187
+ datasections = getSectionsPrefix(sections16, '.data16.')
188
+ fixedsections = getSectionsCategory(sections, 'fixed')
189
+
190
+ firstfixed = fitSections(fixedsections, textsections)
191
+ remsections = [s for s in textsections+rodatasections+datasections
192
+ if s.finalloc is None]
193
+ sec16_start, sec16_align = setSectionsStart(
194
+ remsections, firstfixed, segoffset=BUILD_BIOS_ADDR)
195
+
196
+ # Determine 32seg positions
197
+ sections32seg = getSectionsCategory(sections, '32seg')
198
+ textsections = getSectionsPrefix(sections32seg, '.text.')
199
+ rodatasections = getSectionsPrefix(sections32seg, '.rodata')
200
+ datasections = getSectionsPrefix(sections32seg, '.data32seg.')
201
+
202
+ sec32seg_start, sec32seg_align = setSectionsStart(
203
+ textsections + rodatasections + datasections, sec16_start
204
+ , segoffset=BUILD_BIOS_ADDR)
205
+
206
+ # Determine 32bit "fseg memory" data positions
207
+ sections32textfseg = getSectionsCategory(sections, '32textfseg')
208
+ sec32textfseg_start, sec32textfseg_align = setSectionsStart(
209
+ sections32textfseg, sec32seg_start, 16)
210
+
211
+ sections32fseg = getSectionsCategory(sections, '32fseg')
212
+ sec32fseg_start, sec32fseg_align = setSectionsStart(
213
+ sections32fseg, sec32textfseg_start, 16
214
+ , segoffset=BUILD_BIOS_ADDR)
215
+
216
+ # Determine 32flat runtime positions
217
+ sections32flat = getSectionsCategory(sections, '32flat')
218
+ textsections = getSectionsPrefix(sections32flat, '.text.')
219
+ rodatasections = getSectionsPrefix(sections32flat, '.rodata')
220
+ datasections = getSectionsPrefix(sections32flat, '.data.')
221
+ bsssections = getSectionsPrefix(sections32flat, '.bss.')
222
+
223
+ sec32flat_start, sec32flat_align = setSectionsStart(
224
+ textsections + rodatasections + datasections + bsssections
225
+ , sec32fseg_start, 16)
226
+
227
+ # Determine 32flat init positions
228
+ sections32init = getSectionsCategory(sections, '32init')
229
+ init32_textsections = getSectionsPrefix(sections32init, '.text.')
230
+ init32_rodatasections = getSectionsPrefix(sections32init, '.rodata')
231
+ init32_datasections = getSectionsPrefix(sections32init, '.data.')
232
+ init32_bsssections = getSectionsPrefix(sections32init, '.bss.')
233
+
234
+ sec32init_start, sec32init_align = setSectionsStart(
235
+ init32_textsections + init32_rodatasections
236
+ + init32_datasections + init32_bsssections
237
+ , sec32flat_start, 16)
238
+
239
+ # Determine location of ZoneFSeg memory.
240
+ zonefseg_end = sec32flat_start
241
+ if not genreloc:
242
+ zonefseg_end = sec32init_start
243
+ zonefseg_start = BUILD_BIOS_ADDR
244
+ if zonefseg_start + BUILD_MIN_BIOSTABLE > zonefseg_end:
245
+ # Not enough ZoneFSeg space - force a minimum space.
246
+ zonefseg_end = sec32fseg_start
247
+ zonefseg_start = zonefseg_end - BUILD_MIN_BIOSTABLE
248
+ sec32flat_start, sec32flat_align = setSectionsStart(
249
+ textsections + rodatasections + datasections + bsssections
250
+ , zonefseg_start, 16)
251
+ sec32init_start, sec32init_align = setSectionsStart(
252
+ init32_textsections + init32_rodatasections
253
+ + init32_datasections + init32_bsssections
254
+ , sec32flat_start, 16)
255
+ li.sec32init_start = sec32init_start
256
+ li.sec32init_end = sec32flat_start
257
+ li.sec32init_align = sec32init_align
258
+ final_readonly_start = min(BUILD_BIOS_ADDR, sec32flat_start)
259
+ if not genreloc:
260
+ final_readonly_start = min(BUILD_BIOS_ADDR, sec32init_start)
261
+ li.zonefseg_start = zonefseg_start
262
+ li.zonefseg_end = zonefseg_end
263
+ li.final_readonly_start = final_readonly_start
264
+
265
+ # Determine "low memory" data positions
266
+ sections32low = getSectionsCategory(sections, '32low')
267
+ sec32low_end = sec32init_start
268
+ if config.get('CONFIG_MALLOC_UPPERMEMORY'):
269
+ final_sec32low_end = final_readonly_start
270
+ zonelow_base = final_sec32low_end - 64*1024
271
+ zonelow_base = max(BUILD_ROM_START, alignpos(zonelow_base, 2*1024))
272
+ else:
273
+ final_sec32low_end = BUILD_LOWRAM_END
274
+ zonelow_base = final_sec32low_end - 64*1024
275
+ relocdelta = final_sec32low_end - sec32low_end
276
+ li.sec32low_start, sec32low_align = setSectionsStart(
277
+ sections32low, sec32low_end, 16
278
+ , segoffset=zonelow_base - relocdelta)
279
+ li.sec32low_end = sec32low_end
280
+ li.zonelow_base = zonelow_base
281
+ li.final_sec32low_start = li.sec32low_start + relocdelta
282
+
283
+ # Print statistics
284
+ size16 = BUILD_BIOS_ADDR + BUILD_BIOS_SIZE - sec16_start
285
+ size32seg = sec16_start - sec32seg_start
286
+ size32textfseg = sec32seg_start - sec32textfseg_start
287
+ size32fseg = sec32textfseg_start - sec32fseg_start
288
+ size32flat = sec32fseg_start - sec32flat_start
289
+ size32init = sec32flat_start - sec32init_start
290
+ sizelow = li.sec32low_end - li.sec32low_start
291
+ print("16bit size: %d" % size16)
292
+ print("32bit segmented size: %d" % size32seg)
293
+ print("32bit flat size: %d" % (size32flat + size32textfseg))
294
+ print("32bit flat init size: %d" % size32init)
295
+ print("Lowmem size: %d" % sizelow)
296
+ print("f-segment var size: %d" % size32fseg)
297
+ return li
298
+
299
+
300
+ ######################################################################
301
+ # Linker script output
302
+ ######################################################################
303
+
304
+ # Write LD script includes for the given cross references
305
+ def outXRefs(sections, useseg=0, exportsyms=[], forcedelta=0):
306
+ xrefs = dict([(symbol.name, symbol) for symbol in exportsyms])
307
+ out = ""
308
+ for section in sections:
309
+ for reloc in section.relocs:
310
+ symbol = reloc.symbol
311
+ if (symbol.section is not None
312
+ and (symbol.section.fileid != section.fileid
313
+ or symbol.name != reloc.symbolname)):
314
+ xrefs[reloc.symbolname] = symbol
315
+ for symbolname, symbol in xrefs.items():
316
+ loc = symbol.section.finalloc
317
+ if useseg:
318
+ loc = symbol.section.finalsegloc
319
+ out += "%s = 0x%x ;\n" % (symbolname, loc + forcedelta + symbol.offset)
320
+ return out
321
+
322
+ # Write LD script includes for the given sections
323
+ def outSections(sections, useseg=0):
324
+ out = ""
325
+ for section in sections:
326
+ loc = section.finalloc
327
+ if useseg:
328
+ loc = section.finalsegloc
329
+ out += "%s 0x%x : { *(%s) }\n" % (section.name, loc, section.name)
330
+ return out
331
+
332
+ # Write LD script includes for the given sections using relative offsets
333
+ def outRelSections(sections, startsym, useseg=0):
334
+ sections = [(section.finalloc, section) for section in sections
335
+ if section.finalloc is not None]
336
+ sections.sort(key=operator.itemgetter(0))
337
+ out = ""
338
+ for addr, section in sections:
339
+ loc = section.finalloc
340
+ if useseg:
341
+ loc = section.finalsegloc
342
+ out += ". = ( 0x%x - %s ) ;\n" % (loc, startsym)
343
+ if section.name in ('.rodata.str1.1', '.rodata'):
344
+ out += "_rodata%s = . ;\n" % (section.fileid,)
345
+ out += "*%s.*(%s)\n" % (section.fileid, section.name)
346
+ return out
347
+
348
+ # Build linker script output for a list of relocations.
349
+ def strRelocs(outname, outrel, relocs):
350
+ relocs.sort()
351
+ return (" %s_start = ABSOLUTE(.) ;\n" % (outname,)
352
+ + "".join(["LONG(0x%x - %s)\n" % (pos, outrel)
353
+ for pos in relocs])
354
+ + " %s_end = ABSOLUTE(.) ;\n" % (outname,))
355
+
356
+ # Find relocations to the given sections
357
+ def getRelocs(sections, tosection, type=None):
358
+ return [section.finalloc + reloc.offset
359
+ for section in sections
360
+ for reloc in section.relocs
361
+ if (reloc.symbol.section in tosection
362
+ and (type is None or reloc.type == type))]
363
+
364
+ # Output the linker scripts for all required sections.
365
+ def writeLinkerScripts(li, out16, out32seg, out32flat):
366
+ # Write 16bit linker script
367
+ filesections16 = getSectionsFileid(li.sections, '16')
368
+ out = outXRefs(filesections16, useseg=1) + """
369
+ zonelow_base = 0x%x ;
370
+ _zonelow_seg = 0x%x ;
371
+
372
+ %s
373
+ """ % (li.zonelow_base,
374
+ int(li.zonelow_base / 16),
375
+ outSections(filesections16, useseg=1))
376
+ outfile = open(out16, 'w')
377
+ outfile.write(COMMONHEADER + out + COMMONTRAILER)
378
+ outfile.close()
379
+
380
+ # Write 32seg linker script
381
+ filesections32seg = getSectionsFileid(li.sections, '32seg')
382
+ out = (outXRefs(filesections32seg, useseg=1)
383
+ + outSections(filesections32seg, useseg=1))
384
+ outfile = open(out32seg, 'w')
385
+ outfile.write(COMMONHEADER + out + COMMONTRAILER)
386
+ outfile.close()
387
+
388
+ # Write 32flat linker script
389
+ sec32all_start = li.sec32low_start
390
+ relocstr = ""
391
+ if li.genreloc:
392
+ # Generate relocations
393
+ initsections = dict([
394
+ (s, 1) for s in getSectionsCategory(li.sections, '32init')])
395
+ noninitsections = dict([(s, 1) for s in li.sections
396
+ if s not in initsections])
397
+ absrelocs = getRelocs(initsections, initsections, type='R_386_32')
398
+ relrelocs = getRelocs(initsections, noninitsections, type='R_386_PC32')
399
+ initrelocs = getRelocs(noninitsections, initsections)
400
+ relocstr = (strRelocs("_reloc_abs", "code32init_start", absrelocs)
401
+ + strRelocs("_reloc_rel", "code32init_start", relrelocs)
402
+ + strRelocs("_reloc_init", "code32flat_start", initrelocs))
403
+ numrelocs = len(absrelocs + relrelocs + initrelocs)
404
+ sec32all_start -= numrelocs * 4
405
+ filesections32flat = getSectionsFileid(li.sections, '32flat')
406
+ out = outXRefs([], exportsyms=li.varlowsyms
407
+ , forcedelta=li.final_sec32low_start-li.sec32low_start)
408
+ multiboot_header = ""
409
+ if li.config.get('CONFIG_MULTIBOOT'):
410
+ multiboot_header = "LONG(0x1BADB002) LONG(0) LONG(-0x1BADB002)"
411
+ sec32all_start -= 3 * 4
412
+ sec32all_align = max([section.align for section in li.sections])
413
+ sec32all_start = aligndown(sec32all_start, sec32all_align)
414
+ out += outXRefs(filesections32flat, exportsyms=[li.entrysym]) + """
415
+ _reloc_min_align = 0x%x ;
416
+ zonefseg_start = 0x%x ;
417
+ zonefseg_end = 0x%x ;
418
+ zonelow_base = 0x%x ;
419
+ final_varlow_start = 0x%x ;
420
+ final_readonly_start = 0x%x ;
421
+ varlow_start = 0x%x ;
422
+ varlow_end = 0x%x ;
423
+ code32init_start = 0x%x ;
424
+ code32init_end = 0x%x ;
425
+
426
+ code32flat_start = 0x%x ;
427
+ .text code32flat_start : {
428
+ %s
429
+ %s
430
+ %s
431
+ code32flat_end = ABSOLUTE(.) ;
432
+ } :text
433
+ """ % (li.sec32init_align,
434
+ li.zonefseg_start,
435
+ li.zonefseg_end,
436
+ li.zonelow_base,
437
+ li.final_sec32low_start,
438
+ li.final_readonly_start,
439
+ li.sec32low_start,
440
+ li.sec32low_end,
441
+ li.sec32init_start,
442
+ li.sec32init_end,
443
+ sec32all_start,
444
+ multiboot_header,
445
+ relocstr,
446
+ outRelSections(li.sections, 'code32flat_start'))
447
+ out = COMMONHEADER + out + COMMONTRAILER + """
448
+ ENTRY(%s)
449
+ PHDRS
450
+ {
451
+ text PT_LOAD AT ( code32flat_start ) ;
452
+ }
453
+ """ % (li.entrysym.name,)
454
+ outfile = open(out32flat, 'w')
455
+ outfile.write(out)
456
+ outfile.close()
457
+
458
+
459
+ ######################################################################
460
+ # Detection of unused sections and init sections
461
+ ######################################################################
462
+
463
+ # Visit all sections reachable from a given set of start sections
464
+ def findReachable(anchorsections, checkreloc, data):
465
+ anchorsections = dict([(section, []) for section in anchorsections])
466
+ pending = list(anchorsections)
467
+ while pending:
468
+ section = pending.pop()
469
+ for reloc in section.relocs:
470
+ chain = anchorsections[section] + [section.name]
471
+ if not checkreloc(reloc, section, data, chain):
472
+ continue
473
+ nextsection = reloc.symbol.section
474
+ if nextsection not in anchorsections:
475
+ anchorsections[nextsection] = chain
476
+ pending.append(nextsection)
477
+ return anchorsections
478
+
479
+ # Find "runtime" sections (ie, not init only sections).
480
+ def checkRuntime(reloc, rsection, data, chain):
481
+ section = reloc.symbol.section
482
+ if section is None or '.init.' in section.name:
483
+ return 0
484
+ if '.data.varinit.' in section.name:
485
+ print("ERROR: %s is VARVERIFY32INIT but used from %s" % (
486
+ section.name, chain))
487
+ sys.exit(1)
488
+ return 1
489
+
490
+ # Find and keep the section associated with a symbol (if available).
491
+ def checkKeepSym(reloc, syms, fileid, isxref):
492
+ symbolname = reloc.symbolname
493
+ mustbecfunc = symbolname.startswith('_cfunc')
494
+ if mustbecfunc:
495
+ symprefix = '_cfunc' + fileid + '_'
496
+ if not symbolname.startswith(symprefix):
497
+ return 0
498
+ symbolname = symbolname[len(symprefix):]
499
+ symbol = syms.get(symbolname)
500
+ if (symbol is None or symbol.section is None
501
+ or symbol.section.name.startswith('.discard.')):
502
+ return 0
503
+ isdestcfunc = (symbol.section.name.startswith('.text.')
504
+ and not symbol.section.name.startswith('.text.asm.'))
505
+ if ((mustbecfunc and not isdestcfunc)
506
+ or (not mustbecfunc and isdestcfunc and isxref)):
507
+ return 0
508
+
509
+ reloc.symbol = symbol
510
+ return 1
511
+
512
+ # Resolve a relocation and check if it should be kept in the final binary.
513
+ def checkKeep(reloc, section, symbols, chain):
514
+ ret = checkKeepSym(reloc, symbols[section.fileid], section.fileid, 0)
515
+ if ret:
516
+ return ret
517
+ # Not in primary sections - it may be a cross 16/32 reference
518
+ for fileid in ('16', '32seg', '32flat'):
519
+ if fileid != section.fileid:
520
+ ret = checkKeepSym(reloc, symbols[fileid], fileid, 1)
521
+ if ret:
522
+ return ret
523
+ return 0
524
+
525
+
526
+ ######################################################################
527
+ # Startup and input parsing
528
+ ######################################################################
529
+
530
+ class Section:
531
+ name = size = alignment = fileid = relocs = None
532
+ finalloc = finalsegloc = category = None
533
+ class Reloc:
534
+ offset = type = symbolname = symbol = None
535
+ class Symbol:
536
+ name = offset = section = None
537
+
538
+ # Read in output from objdump
539
+ def parseObjDump(file, fileid):
540
+ # sections = [section, ...]
541
+ sections = []
542
+ sectionmap = {}
543
+ # symbols[symbolname] = symbol
544
+ symbols = {}
545
+
546
+ state = None
547
+ for line in file.readlines():
548
+ line = line.rstrip()
549
+ if line == 'Sections:':
550
+ state = 'section'
551
+ continue
552
+ if line == 'SYMBOL TABLE:':
553
+ state = 'symbol'
554
+ continue
555
+ if line.startswith('RELOCATION RECORDS FOR ['):
556
+ sectionname = line[24:-2]
557
+ if sectionname.startswith('.debug_'):
558
+ # Skip debugging sections (to reduce parsing time)
559
+ state = None
560
+ continue
561
+ state = 'reloc'
562
+ relocsection = sectionmap[sectionname]
563
+ continue
564
+
565
+ if state == 'section':
566
+ try:
567
+ idx, name, size, vma, lma, fileoff, align = line.split()
568
+ if align[:3] != '2**':
569
+ continue
570
+ section = Section()
571
+ section.name = name
572
+ section.size = int(size, 16)
573
+ section.align = 2**int(align[3:])
574
+ section.fileid = fileid
575
+ section.relocs = []
576
+ sections.append(section)
577
+ sectionmap[name] = section
578
+ except ValueError:
579
+ pass
580
+ continue
581
+ if state == 'symbol':
582
+ try:
583
+ parts = line[17:].split()
584
+ if len(parts) == 3:
585
+ sectionname, size, name = parts
586
+ elif len(parts) == 4 and parts[2] == '.hidden':
587
+ sectionname, size, hidden, name = parts
588
+ else:
589
+ continue
590
+ symbol = Symbol()
591
+ symbol.size = int(size, 16)
592
+ symbol.offset = int(line[:8], 16)
593
+ symbol.name = name
594
+ symbol.section = sectionmap.get(sectionname)
595
+ symbols[name] = symbol
596
+ except ValueError:
597
+ pass
598
+ continue
599
+ if state == 'reloc':
600
+ try:
601
+ off, type, symbolname = line.split()
602
+ reloc = Reloc()
603
+ reloc.offset = int(off, 16)
604
+ reloc.type = type
605
+ reloc.symbolname = symbolname
606
+ reloc.symbol = symbols.get(symbolname)
607
+ if reloc.symbol is None:
608
+ # Some binutils (2.20.1) give section name instead
609
+ # of a symbol - create a dummy symbol.
610
+ reloc.symbol = symbol = Symbol()
611
+ symbol.size = 0
612
+ symbol.offset = 0
613
+ symbol.name = symbolname
614
+ symbol.section = sectionmap.get(symbolname)
615
+ symbols[symbolname] = symbol
616
+ relocsection.relocs.append(reloc)
617
+ except ValueError:
618
+ pass
619
+ return sections, symbols
620
+
621
+ # Parser for constants in simple C header files.
622
+ def scanconfig(file):
623
+ f = open(file, 'r')
624
+ opts = {}
625
+ for l in f.readlines():
626
+ parts = l.split()
627
+ if len(parts) != 3:
628
+ continue
629
+ if parts[0] != '#define':
630
+ continue
631
+ value = parts[2]
632
+ if value.isdigit() or (value.startswith('0x') and value[2:].isdigit()):
633
+ value = int(value, 0)
634
+ opts[parts[1]] = value
635
+ return opts
636
+
637
+ def main():
638
+ # Get output name
639
+ in16, in32seg, in32flat, cfgfile, out16, out32seg, out32flat = sys.argv[1:]
640
+
641
+ # Read in the objdump information
642
+ infile16 = open(in16, 'r')
643
+ infile32seg = open(in32seg, 'r')
644
+ infile32flat = open(in32flat, 'r')
645
+
646
+ # infoX = (sections, symbols)
647
+ info16 = parseObjDump(infile16, '16')
648
+ info32seg = parseObjDump(infile32seg, '32seg')
649
+ info32flat = parseObjDump(infile32flat, '32flat')
650
+
651
+ # Read kconfig config file
652
+ config = scanconfig(cfgfile)
653
+
654
+ # Figure out which sections to keep.
655
+ allsections = info16[0] + info32seg[0] + info32flat[0]
656
+ symbols = {'16': info16[1], '32seg': info32seg[1], '32flat': info32flat[1]}
657
+ if config.get('CONFIG_COREBOOT'):
658
+ entrysym = symbols['16'].get('entry_elf')
659
+ elif config.get('CONFIG_CSM'):
660
+ entrysym = symbols['16'].get('entry_csm')
661
+ else:
662
+ entrysym = symbols['16'].get('reset_vector')
663
+ anchorsections = [entrysym.section] + [
664
+ section for section in allsections
665
+ if section.name.startswith('.fixedaddr.')]
666
+ keepsections = findReachable(anchorsections, checkKeep, symbols)
667
+ sections = [section for section in allsections if section in keepsections]
668
+
669
+ # Separate 32bit flat into runtime, init, and special variable parts
670
+ anchorsections = [
671
+ section for section in sections
672
+ if ('.data.varlow.' in section.name or '.data.varfseg.' in section.name
673
+ or '.fixedaddr.' in section.name or '.runtime.' in section.name)]
674
+ runtimesections = findReachable(anchorsections, checkRuntime, None)
675
+ for section in sections:
676
+ if section.name.startswith('.data.varlow.'):
677
+ section.category = '32low'
678
+ elif section.name.startswith('.data.varfseg.'):
679
+ section.category = '32fseg'
680
+ elif section.name.startswith('.text.32fseg.'):
681
+ section.category = '32textfseg'
682
+ elif section.name.startswith('.fixedaddr.'):
683
+ section.category = 'fixed'
684
+ elif section.fileid == '32flat' and section not in runtimesections:
685
+ section.category = '32init'
686
+ else:
687
+ section.category = section.fileid
688
+
689
+ # Determine the final memory locations of each kept section.
690
+ genreloc = '_reloc_abs_start' in symbols['32flat']
691
+ li = doLayout(sections, config, genreloc)
692
+
693
+ # Exported symbols
694
+ li.varlowsyms = [symbol for symbol in symbols['32flat'].values()
695
+ if (symbol.section is not None
696
+ and symbol.section.finalloc is not None
697
+ and '.data.varlow.' in symbol.section.name
698
+ and symbol.name != symbol.section.name)]
699
+ li.entrysym = entrysym
700
+
701
+ # Write out linker script files.
702
+ writeLinkerScripts(li, out16, out32seg, out32flat)
703
+
704
+ if __name__ == '__main__':
705
+ main()