[OpenBIOS] r509 - in cpu/x86/pc: . biosload

svn at openbios.org svn at openbios.org
Wed Aug 1 05:15:30 CEST 2007


Author: wmb
Date: 2007-08-01 05:15:29 +0200 (Wed, 01 Aug 2007)
New Revision: 509

Modified:
   cpu/x86/pc/biosload/addrs.fth
   cpu/x86/pc/biosload/config.fth
   cpu/x86/pc/biosload/fw.bth
   cpu/x86/pc/biosload/ofw.bth
   cpu/x86/pc/elfhdr.fth
   cpu/x86/pc/resetend.fth
Log:
Patch from Jens Freimann to support running OFW under LinuxBIOS on QEMU.


Modified: cpu/x86/pc/biosload/addrs.fth
===================================================================
--- cpu/x86/pc/biosload/addrs.fth	2007-08-01 03:13:15 UTC (rev 508)
+++ cpu/x86/pc/biosload/addrs.fth	2007-08-01 03:15:29 UTC (rev 509)
@@ -9,9 +9,15 @@
 \ copies it to get it out of the way of things like OS load areas.
 
 [ifdef] linuxbios-loaded
-h# fff8.0000 constant dropin-base  \ Location of payload in FLASH
-h#   08.0000 constant dropin-size
-dropin-base h# 80 + h# 20 +  constant ResetBase	\ Location of "reset" dropin in ROM
+  [ifdef] qemu-loaded
+    \ when running in qemu OFW is not in ROM but loaded to RAM by elfboot
+    h# 198.0080 constant dropin-base  \ Location of payload in RAM
+    dropin-base h# 20 +  constant ResetBase	\ Location of "reset" dropin in RAM
+  [else]
+    h# fff8.0000 constant dropin-base  \ Location of payload in FLASH
+    dropin-base h# 80 + h# 20 +  constant ResetBase	\ Location of "reset" dropin in ROM
+  [then]
+  h#   08.0000 constant dropin-size
 [then]
 
 \needs dropin-base  h# 198.0000 constant dropin-base

Modified: cpu/x86/pc/biosload/config.fth
===================================================================
--- cpu/x86/pc/biosload/config.fth	2007-08-01 03:13:15 UTC (rev 508)
+++ cpu/x86/pc/biosload/config.fth	2007-08-01 03:15:29 UTC (rev 509)
@@ -21,6 +21,9 @@
 \ - ELF format (no pheader) - ROM - LinuxBIOS direct
 \ create linuxbios-loaded
 
+\ Load and run in qemu
+\ create qemu-loaded 
+
 [ifdef] pc-serial
 create serial-console
 create pc

Modified: cpu/x86/pc/biosload/fw.bth
===================================================================
--- cpu/x86/pc/biosload/fw.bth	2007-08-01 03:13:15 UTC (rev 508)
+++ cpu/x86/pc/biosload/fw.bth	2007-08-01 03:15:29 UTC (rev 509)
@@ -257,7 +257,10 @@
 
    auto-banner?  if
       " Probing" ?type  probe-all
+      \ install-console doesn't work with qemu, use -serial `tty` instead
+      [ifndef] qemu-loaded
       " Install console" ?type  install-console
+      [then]
       banner
    then
 

Modified: cpu/x86/pc/biosload/ofw.bth
===================================================================
--- cpu/x86/pc/biosload/ofw.bth	2007-08-01 03:13:15 UTC (rev 508)
+++ cpu/x86/pc/biosload/ofw.bth	2007-08-01 03:15:29 UTC (rev 509)
@@ -32,21 +32,25 @@
 
 [ifdef] grub-loaded
   fload ${BP}/cpu/x86/pc/elfhdr.fth
-[ifdef] etherboot-variant
-  .( --- Saving as ofwnet.elf - GRUB multiboot format) cr
-  writing ofwnet.elf
-[else]
-  .( --- Saving as ofwgrub.elf - GRUB multiboot format) cr
-  writing ofwgrub.elf
+  [ifdef] etherboot-variant
+    .( --- Saving as ofwnet.elf - GRUB multiboot format) cr
+    writing ofwnet.elf
+  [else]
+    .( --- Saving as ofwgrub.elf - GRUB multiboot format) cr
+    writing ofwgrub.elf
+  [then]
+  elf-header /elf-header  ofd @ fputs
 [then]
-    elf-header /elf-header  ofd @ fputs
-[then]
 
 [ifdef] linuxbios-loaded
   .( --- Saving as ofwlb.elf - LinuxBIOS payload format) cr
   fload ${BP}/cpu/x86/pc/elfhdr.fth
   writing ofwlb.elf
+  [ifdef] qemu-loaded
+    elf-header /elf-header ofd @ fputs
+  [else]
     elf-header /elf-header  0  " elf-header"  write-dropin
+  [then]
 [then]
 
 [ifdef] syslinux-loaded
@@ -118,4 +122,12 @@
    pad 4 ofd @ fputs        \ Patch file size
    pad 4 ofd @ fputs        \ Patch memory size
 [then]
+
+[ifdef] qemu-loaded
+   ofd @ fsize pad !        \ file size; store in memory for convenience below
+   h# 44 ofd @ fseek        \ Seek to file size field; see elfhdr.bth
+   pad 4 ofd @ fputs        \ Patch file size
+   pad 4 ofd @ fputs        \ Patch memory size
+[then]
+
 ofd @ fclose

Modified: cpu/x86/pc/elfhdr.fth
===================================================================
--- cpu/x86/pc/elfhdr.fth	2007-08-01 03:13:15 UTC (rev 508)
+++ cpu/x86/pc/elfhdr.fth	2007-08-01 03:15:29 UTC (rev 509)
@@ -18,6 +18,10 @@
    \ elf-header is not a dropin, so we only need to skip OBMD header of reset
    \ we adjust the load-address below at position 0x40
   dropin-base  h# 20 +  l,  \ 0x18 entry point virtual address
+[then]
+[ifdef] qemu-loaded
+   \ skip OBMD header but keep elf-header because elfboot in LinuxBIOS needs it
+   dropin-base h# 20 +  l, \ 0x18 entry point virtual address
 [else]
    \ Skip this ELF dropin (80) + the OBMD header of the next dropin (20)
   dropin-base  h# 80 + h# 20 +  l,  \ 0x18 entry point virtual address
@@ -29,6 +33,9 @@
   h# 20        w,  \ 0x2a program header table entry size
 [ifdef] grub-loaded
   1            w,  \ 0x2c program header table entry count (one pheader)
+[then]
+[ifdef] qemu-loaded 
+  1            w,  \ 0x2c program header table entry count (one pheader)
 [else]
   0            w,  \ 0x2c program header table entry count (no pheaders)
 [then]
@@ -41,22 +48,39 @@
   1            l,  \ 0x34 entry type PT_LOAD
   h# 54        l,  \ 0x38 file offset
   0            l,  \ 0x3c vaddr
+[then]
+
+[ifdef] qemu-loaded \ Pheader causes elfboot to copy us to RAM
+  \ 0x34  Pheader
+  1            l,  \ 0x34 entry type PT_LOAD
+  0            l,  \ 0x38 file offset
+  dropin-base 80 -  l,  \ 0x3c vaddr
+[then]
+
 [ifdef] etherboot-variant
    \ we need to skip what left of elf-hdr. to get it to point to a dropin
    \ why is it 0x14 ?  I would have thought it should be the size of the multiboot header
    \ which is 0x0c
   dropin-base  h# 14 - l,  \ 0x40 paddr         \ Where to put the bits
+[then]
+
+[ifdef] qemu-loaded
+  dropin-base h# 80 -  l,  \ 0x40 paddr         \ Where to put the bits
 [else]
   dropin-base  l,  \ 0x40 paddr         \ Where to put the bits
 [then]
   h# ffffffff  l,  \ 0x44 file size     \ backpatched later
   h# ffffffff  l,  \ 0x48 memory size   \ backpatched later
+
+[ifndef] qemu-loaded
   0            l,
   0            l,
+[then]
   7            l,  \ 0x4c entry flags RWX
   0            l,  \ 0x50 alignment
                    \ 0x54 End of pheader
-
+[then]
+[ifdef] grub-loaded 
   \ "Multiboot" header that GRUB looks for
   h# 1BADB002 ,         \ 0x54
   h#        0 ,         \ 0x58

Modified: cpu/x86/pc/resetend.fth
===================================================================
--- cpu/x86/pc/resetend.fth	2007-08-01 03:13:15 UTC (rev 508)
+++ cpu/x86/pc/resetend.fth	2007-08-01 03:15:29 UTC (rev 509)
@@ -4,6 +4,7 @@
    \ The memory layout information from the start dropin is stored in low
    \ memory.
 
+[ifndef] qemu-loaded
    \ Move GDT to low memory.  We use the first location at gdt-pa as
    \ scratch memory for sgdt, and put the actual gdt at gdt-pa + 0x10
    gdt-pa # ax mov
@@ -30,10 +31,10 @@
    \ Next time segment registers are changed, they will be
    \ reloaded from memory.
 
+   \ qemu hangs when trying to do this
    here asm-base - ResetBase +  7 +   h# 60  #)  far jmp  \ 7-byte instruction
    \ nop nop nop nop
 
-   h# 20 # al mov  al h# 80 # out
 \ begin again
    h# 68 # ax mov
    ax ds  mov
@@ -41,7 +42,10 @@
    ax fs  mov
    ax gs  mov
    ax ss  mov
+[then]
 
+   h# 20 # al mov  al h# 80 # out
+
 [ifdef] mem-info-pa
    gdt-pa /page round-up #  ax  mov	\ Current low-memory high water mark
    ax     mem-info-pa 2 la+ #)  mov	\ Store in memory info area




More information about the OpenBIOS mailing list