This is an old revision of the document!


A PCRE internal error occured. This might be caused by a faulty plugin

====== Daniel Verkamp: COMBOOT Support ====== ===== Journal ===== ==== Week 0 ==== ---- === 19 May 2008 === Journal created. === 21 May 2008 === * Image type detection by filename: check image->uri? * arch/i386/README.i386: use libpm for COM32 transitions, librm for 16-bit COMBOOT * hook_bios_interrupt -> hook the COMBOOT API ints (for 16-bit) with stubs that call back into gPXE? * REAL_CODE, PHYS_CODE in inline asm * memcpy_user, real_to_user * i386_all_regs, regs_t (ordered like PUSHA) types * _virt_to_phys to switch from etherboot-style virtual address space to flat physical addresses (COM32) * basemem_packet (BASEMEM_PACKET_LEN = 1514) * arch/i386/include/virtaddr.h: VIRTUAL/PHYSICAL/REAL_CS/DS * install_rm_callback_interface * Split COMBOOT and C32 or use the same image type for both? == TODO == * Check current PXE API support * Find out how to add config option for image type === 23 May 2008 === * Had meeting with mdc and mcb30; discussed basic architecture for COMBOOT support * Discovered how near RET from 16-bit COMBOOT works - INT 20h at byte 0 of segment (documented as part of PSP in COMBOOT spec) * Sample hook_bios_interrupt/call_prot code from mcb30; see [[soc/2008/dverkamp/notes/hook_bios_interrupt]] * Finished basic 16-bit COMBOOT loading and INT 20h and INT 21h AH=02h hooks {{:soc:2008:dverkamp:journal:dverkamp-may-23-2008.png|}} === 24 May 2008 === * Figured out and fixed why RET wasn't working - top of stack wasn't being cleared * Cleaned up and committed beginnings of COMBOOT API ==== Week 1 ==== ---- === 25-26 May 2008 === * Allow COMBOOT images to return via INT 20h - save the (far) return address during exec, then save the old stack address in the PSP, so in INT 20h handler, just change back to old stack and do RETF * Handle other termination API functions (INT 21h, AH=00h and AH=4Ch) - call INT 20h handler * Handle INT 21h, AH=09h (Write DOS String to Console) and AH=30h (Check DOS Version) === 29 May 2008 === * Add beginning of SYSLINUX AX=0001h (get version) and AX=0003h (run command) * Run command function was looping on itself (comboot executable ran again when "boot" executed?), so did similar "unregister image while running" like image/script.c === 30 May 2008 === * Meeting with mdc ==== Week 2 ==== ---- === 02 June 2008 === * Message to soc-mentors discussing implementation details; learned how to get available memory, test if key is hit, call protected-mode code with flat-memory setup, etc. * Finish COMBOOT API "Get Version" - return address of version and copyright strings [[ http://git.etherboot.org/?p=people/dverkamp/gpxe.git;a=commitdiff;h=4f02100d29583bd9586e4a832eb910f9192d304b | 4f02100d29583bd9586e4a832eb910f9192d304b ]] * Fill in correct value for available memory field in PSP header [[ http://git.etherboot.org/?p=people/dverkamp/gpxe.git;a=commit;h=c07e41f20e6ef9b89e290733d5c06a8fcadfb0e1 | c07e41f20e6ef9b89e290733d5c06a8fcadfb0e1 ]] === 03 June 2008 === * Initial try at COM32 support; helper functions are not implemented yet, so nothing really works [[ http://git.etherboot.org/?p=people/dverkamp/gpxe.git;a=commitdiff;h=6d18cc20c85e7a1a195705d1da6bd67c0917138f | 6d18cc20c85e7a1a195705d1da6bd67c0917138f ]] * Wrappers for COM32 helper functions to switch between flat mapping used by COM32 and the virtual address space used by gPXE (COM32 still mainly untested) [[ http://git.etherboot.org/?p=people/dverkamp/gpxe.git;a=commitdiff;h=d5e92f83c8fba51e0a2c803b9204bae7d86c9cd8 | d5e92f83c8fba51e0a2c803b9204bae7d86c9cd8 ]] * Some small fixes to COMBOOT (always load the image in the same place, and use that fact to locate the PSP even if the image changes segment registers) [[ http://git.etherboot.org/?p=people/dverkamp/gpxe.git;a=commitdiff;h=245547103ed490bfc380d94ea7f7634a6e46f11a | 245547103ed490bfc380d94ea7f7634a6e46f11a ]] TODO: * Find correct end of available memory value for ESP before executing COM32 images * Finish helper functions (copy between registers and com32sys_t structs) === 04 June 2008 === * Find end of memory value from walking memmap and pass it to COM32 programs [[ http://git.etherboot.org/?p=people/dverkamp/gpxe.git;a=commitdiff;h=164672592936bb3026b4ada3113b3e66f0e6f51c | 164672592936bb3026b4ada3113b3e66f0e6f51c ]] === 05 June 2008 === * Fix a lot of small things related to COM32; now ''hello.c32'' and ''hello2.c32'' run correctly! [[ http://git.etherboot.org/?p=people/dverkamp/gpxe.git;a=commitdiff;h=3876fad11e9f4ba3d8319eaadffce7c30aaaeaa6 | 3876fad11e9f4ba3d8319eaadffce7c30aaaeaa6 ]], [[ http://git.etherboot.org/?p=people/dverkamp/gpxe.git;a=commitdiff;h=bcb1ffca2899973f73381d36cdae88e7c13c0881 | bcb1ffca2899973f73381d36cdae88e7c13c0881 ]], [[ http://git.etherboot.org/?p=people/dverkamp/gpxe.git;a=commitdiff;h=32030bd5f16208b01441eed8ef0d101362770ef0 | 32030bd5f16208b01441eed8ef0d101362770ef0 ]], [[ http://git.etherboot.org/?p=people/dverkamp/gpxe.git;a=commitdiff;h=8f4adae9cb357b8f88beea16439fa2afdcc127d3 | 8f4adae9cb357b8f88beea16439fa2afdcc127d3 ]], [[ http://git.etherboot.org/?p=people/dverkamp/gpxe.git;a=commitdiff;h=f7a3b956e3eaa5689da98721d1bbb55910b5d6c1 | f7a3b956e3eaa5689da98721d1bbb55910b5d6c1 ]] {{:soc:2008:dverkamp:journal:jun-05-2008.png|}} * Only the intcall helper is implemented; the farcall and cfarcall helper functions are still unimplemented, but should be relatively easy now that intcall is working ==== Week 3 ==== ---- === 10 June 2008 === * Implement file I/O functions (open, read, close) based on gPXE's posix_io support [[ http://git.etherboot.org/?p=people/dverkamp/gpxe.git;a=commitdiff;h=dcf8448c1e922892ee8dc4cf7a238eaebca1a5df | dcf8448c1e922892ee8dc4cf7a238eaebca1a5df ]] === 11 June 2008 === * Finally debugged why my VGA test case (a 256-byte demo, [[ http://pouet.net/prod.php?which=3397 | tube by 3SC ]]) wasn't working - it was assuming that registers were 0, and I hadn't been clearing them; after taking care of that, it works fine in bochs, qemu, and real hardware: [[ http://git.etherboot.org/?p=people/dverkamp/gpxe.git;a=commitdiff;h=169e9975ba0aea887bf5515f9bbe32466bf3b5e0 | 169e9975ba0aea887bf5515f9bbe32466bf3b5e0 ]] {{:soc:2008:dverkamp:journal:jun-11-2008.png|}} * Fixed a bunch of small things in com32_call.c, after which basic file I/O (filetest.c32) works [[ http://git.etherboot.org/?p=people/dverkamp/gpxe.git;a=commitdiff;h=d645d491cf48d7ef48566057b9b8ad6c5418b5d9 | d645d491cf48d7ef48566057b9b8ad6c5418b5d9 ]] {{:soc:2008:dverkamp:journal:jun-11-2008.fileio.png| filetest.c32 reading a file over HTTP with a relative filename}} * Implement more INT 22h functions (AX = 0005h, AX = 0007h, AX = 0013h, AX = 0015h) [[ http://git.etherboot.org/?p=people/dverkamp/gpxe.git;a=commitdiff;h=068eb73795d962cc70336a8159e6e91ecbd5cb68 | 068eb73795d962cc70336a8159e6e91ecbd5cb68 ]] * Implement "Resolve hostname" function; resolv.c32 now works [[ http://git.etherboot.org/?p=people/dverkamp/gpxe.git;a=commitdiff;h=01fa277122c8ee33e26a35b7ef890e57b8b485e3 | 01fa277122c8ee33e26a35b7ef890e57b8b485e3 ]] === 12 June 2008 === * Map Enter key to 0x0D instead of 0x0A; now fancyhello.c32 works [[ http://git.etherboot.org/?p=people/dverkamp/gpxe.git;a=commitdiff;h=d5f9318b8570cf3c489e4d3f8dfe1955cb837024 | d5f9318b8570cf3c489e4d3f8dfe1955cb837024 ]] * Rebased comboot work on top of current upstream gPXE tree and pushed to [[ http://git.etherboot.org/?p=people/dverkamp/gpxe.git;a=shortlog;h=comboot-merge | comboot-merge branch ]] ==== Week 4 ==== ---- === 16 June 2008 === * Implemented "Call PXE Stack" (INT 22h AX=0009h) [[ http://git.etherboot.org/?p=people/dverkamp/gpxe.git;a=commitdiff;h=e55e13db55ad26d9f62e72ff3bc2a77006d74b40 | e55e13db55ad26d9f62e72ff3bc2a77006d74b40 ]] (untested!) * Implemented "Write Character to Serial Port" (INT 21h AH=04h) using stefanha's serial changes [[ http://git.etherboot.org/?p=people/dverkamp/gpxe.git;a=commitdiff;h=dac1de178042d2ffdacb772d265033cfc24c2441 | dac1de178042d2ffdacb772d265033cfc24c2441 ]] (untested!) * Implemented "Cleanup, shuffle and boot" (INT 22h AX=0012h) and related function "Maximum number of shuffle descriptors" (AX=0011h) [[ http://git.etherboot.org/?p=people/dverkamp/gpxe.git;a=commitdiff;h=9a4e36722ceaf02d8360c37401af4c1716ab2334 | 9a4e36722ceaf02d8360c37401af4c1716ab2334 ]] (untested!) === 18 June 2008 === * Discussed automated testing with mdc and stefanha; took a look at Expect; also qemu -nographic/-serial redirection and gPXE's CONSOLE_SERIAL for acquiring test output === 19 June 2008 === * Worked on test suite for COMBOOT (unfinished; 16-bit COMBOOT program that calls API functions and checks return values, CF, etc.; eventually will be integrated with qemu for automated testing) * Wrote a simple shuffle and boot testcase (which turned out to be incorrect, but worked anyway for some reason in bochs!?) - still work to do here; I think the implementation in gPXE is correct, but I need a correct testcase first to be sure. * Talked to hpa a bit about shuffle and boot - maybe it will not be possible to implement it correctly in gPXE (at least without some more complicated tricks, relocating the shuffle and boot code to below 0x7C00 before running it, or else the code might get overwritten by one of the copies..) === 20 June 2008 === * Met with mcb30 and mdc; decided shuffle and boot will be okay, since gPXE removes the memory regions it uses from the memory map, effectively hiding itself. * Fixed shuffle and boot testcase [[ http://git.etherboot.org/?p=people/dverkamp/gpxe.git;a=commitdiff;h=1d7e6b8cc3ec0b940c6fec2df61fb7969ec7e0af | 1d7e6b8cc3ec0b940c6fec2df61fb7969ec7e0af ]] - now it works in qemu * In the course of testing on real hardware, noticed that gtest.gpxe (tomsrtbt) no longer booted on a couple of my machines (both with tulip-based cards), so I tried git-bisect to determine what broke it. In the end it pointed at the latest commit, arbitrary script line lengths, but I think I did something wrong (or the build system did), as the first try on that checkout actually worked. When I did make clean and built again, it failed consistently, and after checking out the previous head, that worked consistently, so I'm pretty sure this is the culprit, but I did not determine what is wrong. * Got sidetracked into a bit of driver cleanup :) - reorganized and updated the PCI ID list of the [[ http://git.etherboot.org/?p=people/dverkamp/gpxe.git;a=shortlog;h=tulip | tulip driver ]], along with some whitespace/indentation cleanup first, as it was inconsistent. Maybe I will update this driver to the new API if I get some time...


Navigation

* [[:start|Home]] * [[:about|About our Project]] * [[:download|Download]] * [[:screenshots|Screenshots]] * Documentation * [[:howtos|HowTo Guides]] * [[:appnotes|Application Notes]] * [[:faq:|FAQs]] * [[:doc|General Doc]] * [[:talks|Videos, Talks, and Papers]] * [[:hardwareissues|Hardware Issues]] * [[:mailinglists|Mailing lists]] * [[http://support.etherboot.org/|Bugtracker]] * [[:contributing|Contributing]] * [[:editing_permission|Wiki Edit Permission]] * [[:wiki:syntax|Wiki Syntax]] * [[:contact|Contact]] * [[:relatedlinks|Related Links]] * [[:commerciallinks|Commercial Links]] * [[:acknowledgements|Acknowledgements]] * [[:logos|Logo Art]]

QR Code
QR Code soc:2008:dverkamp:journal:start (generated for current page)