v86 0.3.6 → 0.4.0

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 +17 -6
  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,163 @@
1
+ #ifndef __ATA_H
2
+ #define __ATA_H
3
+
4
+ #include "block.h" // struct drive_s
5
+ #include "config.h" // CONFIG_MAX_ATA_INTERFACES
6
+ #include "types.h" // u8
7
+
8
+ struct ata_channel_s {
9
+ u16 iobase1;
10
+ u16 iobase2;
11
+ u16 iomaster;
12
+ u8 irq;
13
+ u8 chanid;
14
+ u8 ataid;
15
+ int pci_bdf;
16
+ struct pci_device *pci_tmp;
17
+ };
18
+
19
+ struct atadrive_s {
20
+ struct drive_s drive;
21
+ struct ata_channel_s *chan_gf;
22
+ u8 slave;
23
+ };
24
+
25
+ // ata.c
26
+ char *ata_extract_model(char *model, u32 size, u16 *buffer);
27
+ int ata_extract_version(u16 *buffer);
28
+ int ata_process_op(struct disk_op_s *op);
29
+ int ata_atapi_process_op(struct disk_op_s *op);
30
+ void ata_setup(void);
31
+
32
+ #define PORT_ATA2_CMD_BASE 0x0170
33
+ #define PORT_ATA1_CMD_BASE 0x01f0
34
+ #define PORT_ATA2_CTRL_BASE 0x0374
35
+ #define PORT_ATA1_CTRL_BASE 0x03f4
36
+
37
+ // Global defines -- ATA register and register bits.
38
+ // command block & control block regs
39
+ #define ATA_CB_DATA 0 // data reg in/out pio_base_addr1+0
40
+ #define ATA_CB_ERR 1 // error in pio_base_addr1+1
41
+ #define ATA_CB_FR 1 // feature reg out pio_base_addr1+1
42
+ #define ATA_CB_SC 2 // sector count in/out pio_base_addr1+2
43
+ #define ATA_CB_SN 3 // sector number in/out pio_base_addr1+3
44
+ #define ATA_CB_CL 4 // cylinder low in/out pio_base_addr1+4
45
+ #define ATA_CB_CH 5 // cylinder high in/out pio_base_addr1+5
46
+ #define ATA_CB_DH 6 // device head in/out pio_base_addr1+6
47
+ #define ATA_CB_STAT 7 // primary status in pio_base_addr1+7
48
+ #define ATA_CB_CMD 7 // command out pio_base_addr1+7
49
+
50
+ #define ATA_CB_ASTAT 2 // alternate status in pio_base_addr2+2
51
+ #define ATA_CB_DC 2 // device control out pio_base_addr2+2
52
+ #define ATA_CB_DA 3 // device address in pio_base_addr2+3
53
+
54
+ #define ATA_CB_ER_ICRC 0x80 // ATA Ultra DMA bad CRC
55
+ #define ATA_CB_ER_BBK 0x80 // ATA bad block
56
+ #define ATA_CB_ER_UNC 0x40 // ATA uncorrected error
57
+ #define ATA_CB_ER_MC 0x20 // ATA media change
58
+ #define ATA_CB_ER_IDNF 0x10 // ATA id not found
59
+ #define ATA_CB_ER_MCR 0x08 // ATA media change request
60
+ #define ATA_CB_ER_ABRT 0x04 // ATA command aborted
61
+ #define ATA_CB_ER_NTK0 0x02 // ATA track 0 not found
62
+ #define ATA_CB_ER_NDAM 0x01 // ATA address mark not found
63
+
64
+ #define ATA_CB_ER_P_SNSKEY 0xf0 // ATAPI sense key (mask)
65
+ #define ATA_CB_ER_P_MCR 0x08 // ATAPI Media Change Request
66
+ #define ATA_CB_ER_P_ABRT 0x04 // ATAPI command abort
67
+ #define ATA_CB_ER_P_EOM 0x02 // ATAPI End of Media
68
+ #define ATA_CB_ER_P_ILI 0x01 // ATAPI Illegal Length Indication
69
+
70
+ // ATAPI Interrupt Reason bits in the Sector Count reg (CB_SC)
71
+ #define ATA_CB_SC_P_TAG 0xf8 // ATAPI tag (mask)
72
+ #define ATA_CB_SC_P_REL 0x04 // ATAPI release
73
+ #define ATA_CB_SC_P_IO 0x02 // ATAPI I/O
74
+ #define ATA_CB_SC_P_CD 0x01 // ATAPI C/D
75
+
76
+ // bits 7-4 of the device/head (CB_DH) reg
77
+ #define ATA_CB_DH_DEV0 0xa0 // select device 0
78
+ #define ATA_CB_DH_DEV1 0xb0 // select device 1
79
+ #define ATA_CB_DH_LBA 0x40 // use LBA
80
+
81
+ // status reg (CB_STAT and CB_ASTAT) bits
82
+ #define ATA_CB_STAT_BSY 0x80 // busy
83
+ #define ATA_CB_STAT_RDY 0x40 // ready
84
+ #define ATA_CB_STAT_DF 0x20 // device fault
85
+ #define ATA_CB_STAT_WFT 0x20 // write fault (old name)
86
+ #define ATA_CB_STAT_SKC 0x10 // seek complete
87
+ #define ATA_CB_STAT_SERV 0x10 // service
88
+ #define ATA_CB_STAT_DRQ 0x08 // data request
89
+ #define ATA_CB_STAT_CORR 0x04 // corrected
90
+ #define ATA_CB_STAT_IDX 0x02 // index
91
+ #define ATA_CB_STAT_ERR 0x01 // error (ATA)
92
+ #define ATA_CB_STAT_CHK 0x01 // check (ATAPI)
93
+
94
+ // device control reg (CB_DC) bits
95
+ #define ATA_CB_DC_HD15 0x08 // bit should always be set to one
96
+ #define ATA_CB_DC_SRST 0x04 // soft reset
97
+ #define ATA_CB_DC_NIEN 0x02 // disable interrupts
98
+
99
+ // Most mandtory and optional ATA commands (from ATA-3),
100
+ #define ATA_CMD_NOP 0x00
101
+ #define ATA_CMD_CFA_REQUEST_EXT_ERR_CODE 0x03
102
+ #define ATA_CMD_DEVICE_RESET 0x08
103
+ #define ATA_CMD_RECALIBRATE 0x10
104
+ #define ATA_CMD_READ_SECTORS 0x20
105
+ #define ATA_CMD_READ_SECTORS_EXT 0x24
106
+ #define ATA_CMD_READ_DMA_EXT 0x25
107
+ #define ATA_CMD_READ_DMA_QUEUED_EXT 0x26
108
+ #define ATA_CMD_READ_NATIVE_MAX_ADDRESS_EXT 0x27
109
+ #define ATA_CMD_READ_MULTIPLE_EXT 0x29
110
+ #define ATA_CMD_READ_LOG_EXT 0x2F
111
+ #define ATA_CMD_WRITE_SECTORS 0x30
112
+ #define ATA_CMD_WRITE_SECTORS_EXT 0x34
113
+ #define ATA_CMD_WRITE_DMA_EXT 0x35
114
+ #define ATA_CMD_WRITE_DMA_QUEUED_EXT 0x36
115
+ #define ATA_CMD_SET_MAX_ADDRESS_EXT 0x37
116
+ #define ATA_CMD_CFA_WRITE_SECTORS_WO_ERASE 0x38
117
+ #define ATA_CMD_WRITE_MULTIPLE_EXT 0x39
118
+ #define ATA_CMD_WRITE_VERIFY 0x3C
119
+ #define ATA_CMD_WRITE_LOG_EXT 0x3F
120
+ #define ATA_CMD_READ_VERIFY_SECTORS 0x40
121
+ #define ATA_CMD_READ_VERIFY_SECTORS_EXT 0x42
122
+ #define ATA_CMD_FORMAT_TRACK 0x50
123
+ #define ATA_CMD_SEEK 0x70
124
+ #define ATA_CMD_CFA_TRANSLATE_SECTOR 0x87
125
+ #define ATA_CMD_EXECUTE_DEVICE_DIAGNOSTIC 0x90
126
+ #define ATA_CMD_INITIALIZE_DEVICE_PARAMETERS 0x91
127
+ #define ATA_CMD_STANDBY_IMMEDIATE2 0x94
128
+ #define ATA_CMD_IDLE_IMMEDIATE2 0x95
129
+ #define ATA_CMD_STANDBY2 0x96
130
+ #define ATA_CMD_IDLE2 0x97
131
+ #define ATA_CMD_CHECK_POWER_MODE2 0x98
132
+ #define ATA_CMD_SLEEP2 0x99
133
+ #define ATA_CMD_PACKET 0xA0
134
+ #define ATA_CMD_IDENTIFY_PACKET_DEVICE 0xA1
135
+ #define ATA_CMD_CFA_ERASE_SECTORS 0xC0
136
+ #define ATA_CMD_READ_MULTIPLE 0xC4
137
+ #define ATA_CMD_WRITE_MULTIPLE 0xC5
138
+ #define ATA_CMD_SET_MULTIPLE_MODE 0xC6
139
+ #define ATA_CMD_READ_DMA_QUEUED 0xC7
140
+ #define ATA_CMD_READ_DMA 0xC8
141
+ #define ATA_CMD_WRITE_DMA 0xCA
142
+ #define ATA_CMD_WRITE_DMA_QUEUED 0xCC
143
+ #define ATA_CMD_CFA_WRITE_MULTIPLE_WO_ERASE 0xCD
144
+ #define ATA_CMD_STANDBY_IMMEDIATE 0xE0
145
+ #define ATA_CMD_IDLE_IMMEDIATE 0xE1
146
+ #define ATA_CMD_STANDBY 0xE2
147
+ #define ATA_CMD_IDLE 0xE3
148
+ #define ATA_CMD_READ_BUFFER 0xE4
149
+ #define ATA_CMD_CHECK_POWER_MODE 0xE5
150
+ #define ATA_CMD_SLEEP 0xE6
151
+ #define ATA_CMD_FLUSH_CACHE 0xE7
152
+ #define ATA_CMD_WRITE_BUFFER 0xE8
153
+ #define ATA_CMD_IDENTIFY_DEVICE 0xEC
154
+ #define ATA_CMD_SET_FEATURES 0xEF
155
+ #define ATA_CMD_READ_NATIVE_MAX_ADDRESS 0xF8
156
+ #define ATA_CMD_SET_MAX 0xF9
157
+
158
+ #define ATA_SET_FEATRUE_TRANSFER_MODE 0x03
159
+ #define ATA_TRANSFER_MODE_ULTRA_DMA 0x40
160
+ #define ATA_TRANSFER_MODE_MULTIWORD_DMA 0x20
161
+ #define ATA_TRANSFER_MODE_PIO_FLOW_CTRL 0x08
162
+ #define ATA_TRANSFER_MODE_DEFAULT_PIO 0x00
163
+ #endif // ata.h
@@ -0,0 +1,372 @@
1
+ // Support for several common scsi like command data block requests
2
+ //
3
+ // Copyright (C) 2010 Kevin O'Connor <kevin@koconnor.net>
4
+ // Copyright (C) 2002 MandrakeSoft S.A.
5
+ //
6
+ // This file may be distributed under the terms of the GNU LGPLv3 license.
7
+
8
+ #include "block.h" // struct disk_op_s
9
+ #include "blockcmd.h" // struct cdb_request_sense
10
+ #include "byteorder.h" // be32_to_cpu
11
+ #include "farptr.h" // GET_FLATPTR
12
+ #include "output.h" // dprintf
13
+ #include "std/disk.h" // DISK_RET_EPARAM
14
+ #include "string.h" // memset
15
+ #include "util.h" // timer_calc
16
+ #include "malloc.h"
17
+
18
+
19
+ /****************************************************************
20
+ * Low level command requests
21
+ ****************************************************************/
22
+
23
+ static int
24
+ cdb_get_inquiry(struct disk_op_s *op, struct cdbres_inquiry *data)
25
+ {
26
+ struct cdb_request_sense cmd;
27
+ memset(&cmd, 0, sizeof(cmd));
28
+ cmd.command = CDB_CMD_INQUIRY;
29
+ cmd.length = sizeof(*data);
30
+ op->command = CMD_SCSI;
31
+ op->count = 1;
32
+ op->buf_fl = data;
33
+ op->cdbcmd = &cmd;
34
+ op->blocksize = sizeof(*data);
35
+ return process_op(op);
36
+ }
37
+
38
+ // Request SENSE
39
+ static int
40
+ cdb_get_sense(struct disk_op_s *op, struct cdbres_request_sense *data)
41
+ {
42
+ struct cdb_request_sense cmd;
43
+ memset(&cmd, 0, sizeof(cmd));
44
+ cmd.command = CDB_CMD_REQUEST_SENSE;
45
+ cmd.length = sizeof(*data);
46
+ op->command = CMD_SCSI;
47
+ op->count = 1;
48
+ op->buf_fl = data;
49
+ op->cdbcmd = &cmd;
50
+ op->blocksize = sizeof(*data);
51
+ return process_op(op);
52
+ }
53
+
54
+ // Test unit ready
55
+ static int
56
+ cdb_test_unit_ready(struct disk_op_s *op)
57
+ {
58
+ struct cdb_request_sense cmd;
59
+ memset(&cmd, 0, sizeof(cmd));
60
+ cmd.command = CDB_CMD_TEST_UNIT_READY;
61
+ op->command = CMD_SCSI;
62
+ op->count = 0;
63
+ op->buf_fl = NULL;
64
+ op->cdbcmd = &cmd;
65
+ op->blocksize = 0;
66
+ return process_op(op);
67
+ }
68
+
69
+ // Request capacity
70
+ static int
71
+ cdb_read_capacity(struct disk_op_s *op, struct cdbres_read_capacity *data)
72
+ {
73
+ struct cdb_read_capacity cmd;
74
+ memset(&cmd, 0, sizeof(cmd));
75
+ cmd.command = CDB_CMD_READ_CAPACITY;
76
+ op->command = CMD_SCSI;
77
+ op->count = 1;
78
+ op->buf_fl = data;
79
+ op->cdbcmd = &cmd;
80
+ op->blocksize = sizeof(*data);
81
+ return process_op(op);
82
+ }
83
+
84
+ // Mode sense, geometry page.
85
+ static int
86
+ cdb_mode_sense_geom(struct disk_op_s *op, struct cdbres_mode_sense_geom *data)
87
+ {
88
+ struct cdb_mode_sense cmd;
89
+ memset(&cmd, 0, sizeof(cmd));
90
+ cmd.command = CDB_CMD_MODE_SENSE;
91
+ cmd.flags = 8; /* DBD */
92
+ cmd.page = MODE_PAGE_HD_GEOMETRY;
93
+ cmd.count = cpu_to_be16(sizeof(*data));
94
+ op->command = CMD_SCSI;
95
+ op->count = 1;
96
+ op->buf_fl = data;
97
+ op->cdbcmd = &cmd;
98
+ op->blocksize = sizeof(*data);
99
+ return process_op(op);
100
+ }
101
+
102
+
103
+ /****************************************************************
104
+ * Main SCSI commands
105
+ ****************************************************************/
106
+
107
+ // Create a scsi command request from a disk_op_s request
108
+ int
109
+ scsi_fill_cmd(struct disk_op_s *op, void *cdbcmd, int maxcdb)
110
+ {
111
+ switch (op->command) {
112
+ case CMD_READ:
113
+ case CMD_WRITE: ;
114
+ struct cdb_rwdata_10 *cmd = cdbcmd;
115
+ memset(cmd, 0, maxcdb);
116
+ cmd->command = (op->command == CMD_READ ? CDB_CMD_READ_10
117
+ : CDB_CMD_WRITE_10);
118
+ cmd->lba = cpu_to_be32(op->lba);
119
+ cmd->count = cpu_to_be16(op->count);
120
+ return GET_FLATPTR(op->drive_fl->blksize);
121
+ case CMD_SCSI:
122
+ if (MODESEGMENT)
123
+ return -1;
124
+ memcpy(cdbcmd, op->cdbcmd, maxcdb);
125
+ return op->blocksize;
126
+ default:
127
+ return -1;
128
+ }
129
+ }
130
+
131
+ // Determine if the command is a request to pull data from the device
132
+ int
133
+ scsi_is_read(struct disk_op_s *op)
134
+ {
135
+ return op->command == CMD_READ || (
136
+ !MODESEGMENT && op->command == CMD_SCSI && op->blocksize);
137
+ }
138
+
139
+ // Check if a SCSI device is ready to receive commands
140
+ int
141
+ scsi_is_ready(struct disk_op_s *op)
142
+ {
143
+ ASSERT32FLAT();
144
+ dprintf(6, "scsi_is_ready (drive=%p)\n", op->drive_fl);
145
+
146
+ /* Retry TEST UNIT READY for 5 seconds unless MEDIUM NOT PRESENT is
147
+ * reported by the device. If the device reports "IN PROGRESS",
148
+ * 30 seconds is added. */
149
+ int in_progress = 0;
150
+ u32 end = timer_calc(5000);
151
+ for (;;) {
152
+ if (timer_check(end)) {
153
+ dprintf(1, "test unit ready failed\n");
154
+ return -1;
155
+ }
156
+
157
+ int ret = cdb_test_unit_ready(op);
158
+ if (!ret)
159
+ // Success
160
+ break;
161
+
162
+ struct cdbres_request_sense sense;
163
+ ret = cdb_get_sense(op, &sense);
164
+ if (ret)
165
+ // Error - retry.
166
+ continue;
167
+
168
+ // Sense succeeded.
169
+ if (sense.asc == 0x3a) { /* MEDIUM NOT PRESENT */
170
+ dprintf(1, "Device reports MEDIUM NOT PRESENT\n");
171
+ return -1;
172
+ }
173
+
174
+ if (sense.asc == 0x04 && sense.ascq == 0x01 && !in_progress) {
175
+ /* IN PROGRESS OF BECOMING READY */
176
+ dprintf(1, "Waiting for device to detect medium... ");
177
+ /* Allow 30 seconds more */
178
+ end = timer_calc(30000);
179
+ in_progress = 1;
180
+ }
181
+ }
182
+ return 0;
183
+ }
184
+
185
+ #define CDB_CMD_REPORT_LUNS 0xA0
186
+
187
+ struct cdb_report_luns {
188
+ u8 command;
189
+ u8 reserved_01[5];
190
+ u32 length;
191
+ u8 pad[6];
192
+ } PACKED;
193
+
194
+ struct scsi_lun {
195
+ u16 lun[4];
196
+ };
197
+
198
+ struct cdbres_report_luns {
199
+ u32 length;
200
+ u32 reserved;
201
+ struct scsi_lun luns[];
202
+ };
203
+
204
+ static u64 scsilun2u64(struct scsi_lun *scsi_lun)
205
+ {
206
+ int i;
207
+ u64 ret = 0;
208
+ for (i = 0; i < ARRAY_SIZE(scsi_lun->lun); i++)
209
+ ret |= be16_to_cpu(scsi_lun->lun[i]) << (16 * i);
210
+ return ret;
211
+ }
212
+
213
+ // Issue REPORT LUNS on a temporary drive and iterate reported luns calling
214
+ // @add_lun for each
215
+ int scsi_rep_luns_scan(struct drive_s *tmp_drive, scsi_add_lun add_lun)
216
+ {
217
+ int ret = -1;
218
+ /* start with the smallest possible buffer, otherwise some devices in QEMU
219
+ * may (incorrectly) error out on returning less data than fits in it */
220
+ u32 maxluns = 1;
221
+ u32 nluns, i;
222
+ struct cdb_report_luns cdb = {
223
+ .command = CDB_CMD_REPORT_LUNS,
224
+ };
225
+ struct disk_op_s op = {
226
+ .drive_fl = tmp_drive,
227
+ .command = CMD_SCSI,
228
+ .count = 1,
229
+ .cdbcmd = &cdb,
230
+ };
231
+ struct cdbres_report_luns *resp;
232
+
233
+ ASSERT32FLAT();
234
+
235
+ while (1) {
236
+ op.blocksize = sizeof(struct cdbres_report_luns) +
237
+ maxluns * sizeof(struct scsi_lun);
238
+ op.buf_fl = malloc_tmp(op.blocksize);
239
+ if (!op.buf_fl) {
240
+ warn_noalloc();
241
+ return -1;
242
+ }
243
+
244
+ cdb.length = cpu_to_be32(op.blocksize);
245
+ if (process_op(&op) != DISK_RET_SUCCESS)
246
+ goto out;
247
+
248
+ resp = op.buf_fl;
249
+ nluns = be32_to_cpu(resp->length) / sizeof(struct scsi_lun);
250
+ if (nluns <= maxluns)
251
+ break;
252
+
253
+ free(op.buf_fl);
254
+ maxluns = nluns;
255
+ }
256
+
257
+ for (i = 0, ret = 0; i < nluns; i++) {
258
+ u64 lun = scsilun2u64(&resp->luns[i]);
259
+ if (lun >> 32)
260
+ continue;
261
+ ret += !add_lun((u32)lun, tmp_drive);
262
+ }
263
+ out:
264
+ free(op.buf_fl);
265
+ return ret;
266
+ }
267
+
268
+ // Iterate LUNs on the target and call @add_lun for each
269
+ int scsi_sequential_scan(struct drive_s *tmp_drive, u32 maxluns,
270
+ scsi_add_lun add_lun)
271
+ {
272
+ int ret;
273
+ u32 lun;
274
+
275
+ for (lun = 0, ret = 0; lun < maxluns; lun++)
276
+ ret += !add_lun(lun, tmp_drive);
277
+ return ret;
278
+ }
279
+
280
+ // Validate drive, find block size / sector count, and register drive.
281
+ int
282
+ scsi_drive_setup(struct drive_s *drive, const char *s, int prio)
283
+ {
284
+ ASSERT32FLAT();
285
+ struct disk_op_s dop;
286
+ memset(&dop, 0, sizeof(dop));
287
+ dop.drive_fl = drive;
288
+ struct cdbres_inquiry data;
289
+ int ret = cdb_get_inquiry(&dop, &data);
290
+ if (ret)
291
+ return ret;
292
+ char vendor[sizeof(data.vendor)+1], product[sizeof(data.product)+1];
293
+ char rev[sizeof(data.rev)+1];
294
+ strtcpy(vendor, data.vendor, sizeof(vendor));
295
+ nullTrailingSpace(vendor);
296
+ strtcpy(product, data.product, sizeof(product));
297
+ nullTrailingSpace(product);
298
+ strtcpy(rev, data.rev, sizeof(rev));
299
+ nullTrailingSpace(rev);
300
+ int pdt = data.pdt & 0x1f;
301
+ int removable = !!(data.removable & 0x80);
302
+ dprintf(1, "%s vendor='%s' product='%s' rev='%s' type=%d removable=%d\n"
303
+ , s, vendor, product, rev, pdt, removable);
304
+ drive->removable = removable;
305
+
306
+ if (pdt == SCSI_TYPE_CDROM) {
307
+ drive->blksize = CDROM_SECTOR_SIZE;
308
+ drive->sectors = (u64)-1;
309
+
310
+ char *desc = znprintf(MAXDESCSIZE, "DVD/CD [%s Drive %s %s %s]"
311
+ , s, vendor, product, rev);
312
+ boot_add_cd(drive, desc, prio);
313
+ return 0;
314
+ }
315
+
316
+ if (pdt != SCSI_TYPE_DISK)
317
+ return -1;
318
+
319
+ ret = scsi_is_ready(&dop);
320
+ if (ret) {
321
+ dprintf(1, "scsi_is_ready returned %d\n", ret);
322
+ return ret;
323
+ }
324
+
325
+ struct cdbres_read_capacity capdata;
326
+ ret = cdb_read_capacity(&dop, &capdata);
327
+ if (ret)
328
+ return ret;
329
+
330
+ // READ CAPACITY returns the address of the last block.
331
+ // We do not bother with READ CAPACITY(16) because BIOS does not support
332
+ // 64-bit LBA anyway.
333
+ drive->blksize = be32_to_cpu(capdata.blksize);
334
+ if (drive->blksize != DISK_SECTOR_SIZE) {
335
+ dprintf(1, "%s: unsupported block size %d\n", s, drive->blksize);
336
+ return -1;
337
+ }
338
+ drive->sectors = (u64)be32_to_cpu(capdata.sectors) + 1;
339
+ dprintf(1, "%s blksize=%d sectors=%u\n"
340
+ , s, drive->blksize, (unsigned)drive->sectors);
341
+
342
+ // We do not recover from USB stalls, so try to be safe and avoid
343
+ // sending the command if the (obsolete, but still provided by QEMU)
344
+ // fixed disk geometry page may not be supported.
345
+ //
346
+ // We could also send the command only to small disks (e.g. <504MiB)
347
+ // but some old USB keys only support a very small subset of SCSI which
348
+ // does not even include the MODE SENSE command!
349
+ //
350
+ if (CONFIG_QEMU_HARDWARE && memcmp(vendor, "QEMU", 5) == 0) {
351
+ struct cdbres_mode_sense_geom geomdata;
352
+ ret = cdb_mode_sense_geom(&dop, &geomdata);
353
+ if (ret == 0) {
354
+ u32 cylinders;
355
+ cylinders = geomdata.cyl[0] << 16;
356
+ cylinders |= geomdata.cyl[1] << 8;
357
+ cylinders |= geomdata.cyl[2];
358
+ if (cylinders && geomdata.heads &&
359
+ drive->sectors <= 0xFFFFFFFFULL &&
360
+ ((u32)drive->sectors % (geomdata.heads * cylinders) == 0)) {
361
+ drive->pchs.cylinder = cylinders;
362
+ drive->pchs.head = geomdata.heads;
363
+ drive->pchs.sector = (u32)drive->sectors / (geomdata.heads * cylinders);
364
+ }
365
+ }
366
+ }
367
+
368
+ char *desc = znprintf(MAXDESCSIZE, "%s Drive %s %s %s"
369
+ , s, vendor, product, rev);
370
+ boot_add_hd(drive, desc, prio);
371
+ return 0;
372
+ }
@@ -0,0 +1,114 @@
1
+ // Definitions for SCSI style command data blocks.
2
+ #ifndef __BLOCKCMD_H
3
+ #define __BLOCKCMD_H
4
+
5
+ #include "types.h" // u8
6
+
7
+ #define CDB_CMD_READ_10 0x28
8
+ #define CDB_CMD_VERIFY_10 0x2f
9
+ #define CDB_CMD_WRITE_10 0x2a
10
+
11
+ struct cdb_rwdata_10 {
12
+ u8 command;
13
+ u8 flags;
14
+ u32 lba;
15
+ u8 resreved_06;
16
+ u16 count;
17
+ u8 reserved_09;
18
+ u8 pad[6];
19
+ } PACKED;
20
+
21
+ #define CDB_CMD_READ_CAPACITY 0x25
22
+
23
+ struct cdb_read_capacity {
24
+ u8 command;
25
+ u8 flags;
26
+ u8 resreved_02[8];
27
+ u8 pad[6];
28
+ } PACKED;
29
+
30
+ struct cdbres_read_capacity {
31
+ u32 sectors;
32
+ u32 blksize;
33
+ } PACKED;
34
+
35
+ #define CDB_CMD_TEST_UNIT_READY 0x00
36
+ #define CDB_CMD_INQUIRY 0x12
37
+ #define CDB_CMD_REQUEST_SENSE 0x03
38
+
39
+ struct cdb_request_sense {
40
+ u8 command;
41
+ u8 flags;
42
+ u16 reserved_02;
43
+ u8 length;
44
+ u8 reserved_05;
45
+ u8 pad[10];
46
+ } PACKED;
47
+
48
+ struct cdbres_request_sense {
49
+ u8 errcode;
50
+ u8 segment;
51
+ u8 flags;
52
+ u32 info;
53
+ u8 additional;
54
+ u32 specific;
55
+ u8 asc;
56
+ u8 ascq;
57
+ u32 reserved_0e;
58
+ } PACKED;
59
+
60
+ #define SCSI_TYPE_DISK 0x00
61
+ #define SCSI_TYPE_CDROM 0x05
62
+
63
+ struct cdbres_inquiry {
64
+ u8 pdt;
65
+ u8 removable;
66
+ u8 reserved_02[2];
67
+ u8 additional;
68
+ u8 reserved_05[3];
69
+ char vendor[8];
70
+ char product[16];
71
+ char rev[4];
72
+ } PACKED;
73
+
74
+ #define CDB_CMD_MODE_SENSE 0x5A
75
+ #define MODE_PAGE_HD_GEOMETRY 0x04
76
+
77
+ struct cdb_mode_sense {
78
+ u8 command;
79
+ u8 flags;
80
+ u8 page;
81
+ u32 reserved_03;
82
+ u16 count;
83
+ u8 reserved_09;
84
+ u8 pad[6];
85
+ } PACKED;
86
+
87
+ struct cdbres_mode_sense_geom {
88
+ u8 unused_00[3];
89
+ u8 read_only;
90
+ u32 unused_04;
91
+ u8 page;
92
+ u8 length;
93
+ u8 cyl[3];
94
+ u8 heads;
95
+ u8 precomp[3];
96
+ u8 reduced[3];
97
+ u16 step_rate;
98
+ u8 landing[3];
99
+ u16 rpm;
100
+ } PACKED;
101
+
102
+ // blockcmd.c
103
+ struct disk_op_s;
104
+ int scsi_fill_cmd(struct disk_op_s *op, void *cdbcmd, int maxcdb);
105
+ int scsi_is_read(struct disk_op_s *op);
106
+ int scsi_is_ready(struct disk_op_s *op);
107
+ struct drive_s;
108
+ int scsi_drive_setup(struct drive_s *drive, const char *s, int prio);
109
+ typedef int (*scsi_add_lun)(u32 lun, struct drive_s *tmpl_drv);
110
+ int scsi_rep_luns_scan(struct drive_s *tmp_drive, scsi_add_lun add_lun);
111
+ int scsi_sequential_scan(struct drive_s *tmp_drive, u32 maxluns,
112
+ scsi_add_lun add_lun);
113
+
114
+ #endif // blockcmd.h