[OpenBIOS] [commit] r708 - in trunk/openbios-devel: arch/amd64 arch/sparc32 arch/sparc64 arch/x86 forth/debugging

repository service svn at openbios.org
Fri Mar 26 22:17:33 CET 2010


Author: mcayland
Date: Fri Mar 26 22:17:32 2010
New Revision: 708
URL: http://tracker.coreboot.org/trac/openbios/changeset/708

Log:
Introduce the concept of the OF saved-program-state structure and modify all of the loaders (except PPC) to make use of it.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland at siriusit.co.uk>

Modified:
   trunk/openbios-devel/arch/amd64/elfload.c
   trunk/openbios-devel/arch/sparc32/aoutload.c
   trunk/openbios-devel/arch/sparc32/elfload.c
   trunk/openbios-devel/arch/sparc32/forthload.c
   trunk/openbios-devel/arch/sparc64/aoutload.c
   trunk/openbios-devel/arch/sparc64/elfload.c
   trunk/openbios-devel/arch/sparc64/fcodeload.c
   trunk/openbios-devel/arch/sparc64/forthload.c
   trunk/openbios-devel/arch/x86/elfload.c
   trunk/openbios-devel/arch/x86/forthload.c
   trunk/openbios-devel/forth/debugging/client.fs

Modified: trunk/openbios-devel/arch/amd64/elfload.c
==============================================================================
--- trunk/openbios-devel/arch/amd64/elfload.c	Fri Mar 26 21:25:04 2010	(r707)
+++ trunk/openbios-devel/arch/amd64/elfload.c	Fri Mar 26 22:17:32 2010	(r708)
@@ -311,6 +311,9 @@
 
     image_name = image_version = 0;
 
+    /* Mark the saved-program-state as invalid */
+    feval("0 state-valid !");
+
     if (!file_open(filename))
 	goto out;
 
@@ -368,6 +371,16 @@
 
     debug("entry point is %#x\n", ehdr.e_entry);
     printf("Jumping to entry point...\n");
+
+    // Initialise saved-program-state
+    PUSH(ehdr.e_entry);
+    feval("saved-program-state >sps.entry !");
+    PUSH(file_size);
+    feval("saved-program-state >sps.file-size !");
+    feval("elf-boot saved-program-state >sps.file-type !");
+
+    feval("-1 state-valid !");
+
     image_retval = start_elf(ehdr.e_entry, virt_to_phys(boot_notes));
 
     // console_init(); FIXME

Modified: trunk/openbios-devel/arch/sparc32/aoutload.c
==============================================================================
--- trunk/openbios-devel/arch/sparc32/aoutload.c	Fri Mar 26 21:25:04 2010	(r707)
+++ trunk/openbios-devel/arch/sparc32/aoutload.c	Fri Mar 26 22:17:32 2010	(r708)
@@ -7,6 +7,7 @@
 #include "kernel/kernel.h"
 #include "arch/common/a.out.h"
 #include "libopenbios/sys_info.h"
+#include "libopenbios/bindings.h"
 #include "libc/diskio.h"
 #include "boot.h"
 #define printf printk
@@ -62,6 +63,9 @@
 
     image_name = image_version = NULL;
 
+    /* Mark the saved-program-state as invalid */
+    feval("0 state-valid !");
+
     fd = open_io(filename);
     if (!fd)
 	goto out;
@@ -119,8 +123,17 @@
     }
 
     debug("Loaded %lu bytes\n", size);
-
     debug("entry point is %#lx\n", start);
+
+    // Initialise saved-program-state
+    PUSH(addr_fixup(start));
+    feval("saved-program-state >sps.entry !");
+    PUSH(size);
+    feval("saved-program-state >sps.file-size !");
+    feval("aout saved-program-state >sps.file-type !");
+
+    feval("-1 state-valid !");
+
     printf("Jumping to entry point...\n");
 
 #if 1

Modified: trunk/openbios-devel/arch/sparc32/elfload.c
==============================================================================
--- trunk/openbios-devel/arch/sparc32/elfload.c	Fri Mar 26 21:25:04 2010	(r707)
+++ trunk/openbios-devel/arch/sparc32/elfload.c	Fri Mar 26 22:17:32 2010	(r708)
@@ -10,6 +10,7 @@
 #include "arch/common/elf_boot.h"
 #include "libopenbios/sys_info.h"
 #include "libopenbios/ipchecksum.h"
+#include "libopenbios/bindings.h"
 #include "libc/diskio.h"
 #include "boot.h"
 #define printf printk
@@ -135,13 +136,12 @@
 
 static int load_segments(Elf_phdr *phdr, int phnum,
                          unsigned long checksum_offset,
-                         unsigned int offset)
+                         unsigned int offset, unsigned long *bytes)
 {
-    unsigned long bytes;
     //unsigned int start_time, time;
     int i;
 
-    bytes = 0;
+    *bytes = 0;
     // start_time = currticks();
     for (i = 0; i < phnum; i++) {
 	if (phdr[i].p_type != PT_LOAD)
@@ -155,7 +155,7 @@
 	    printf("Can't read program segment %d\n", i);
 	    return 0;
 	}
-	bytes += phdr[i].p_filesz;
+	*bytes += phdr[i].p_filesz;
 	debug("clearing... ");
 	memset(phys_to_virt(addr_fixup(phdr[i].p_paddr) + phdr[i].p_filesz), 0,
 		phdr[i].p_memsz - phdr[i].p_filesz);
@@ -171,7 +171,7 @@
     // time = currticks() - start_time;
     //debug("Loaded %lu bytes in %ums (%luKB/s)\n", bytes, time,
     //	    time? bytes/time : 0);
-    debug("Loaded %lu bytes \n", bytes);
+    debug("Loaded %lu bytes \n", *bytes);
 
     return 1;
 }
@@ -308,7 +308,7 @@
     Elf_ehdr ehdr;
     Elf_phdr *phdr = NULL;
     unsigned long phdr_size;
-    unsigned long checksum_offset;
+    unsigned long checksum_offset, file_size;
     unsigned short checksum = 0;
     Elf_Bhdr *boot_notes = NULL;
     int retval = -1;
@@ -317,6 +317,9 @@
 
     image_name = image_version = NULL;
 
+    /* Mark the saved-program-state as invalid */
+    feval("0 state-valid !");
+
     fd = open_io(filename);
     if (!fd)
 	goto out;
@@ -368,7 +371,7 @@
 	printf(" version %s", image_version);
     printf("...\n");
 
-    if (!load_segments(phdr, ehdr.e_phnum, checksum_offset, offset))
+    if (!load_segments(phdr, ehdr.e_phnum, checksum_offset, offset, &file_size))
 	goto out;
 
     if (checksum_offset) {
@@ -381,6 +384,16 @@
     //debug("current time: %lu\n", currticks());
 
     debug("entry point is %#x\n", addr_fixup(ehdr.e_entry));
+
+    // Initialise saved-program-state
+    PUSH(addr_fixup(ehdr.e_entry));
+    feval("saved-program-state >sps.entry !");
+    PUSH(file_size);
+    feval("saved-program-state >sps.file-size !");
+    feval("elf-boot saved-program-state >sps.file-type !");
+
+    feval("-1 state-valid !");
+
     printf("Jumping to entry point...\n");
 
 #if 1

Modified: trunk/openbios-devel/arch/sparc32/forthload.c
==============================================================================
--- trunk/openbios-devel/arch/sparc32/forthload.c	Fri Mar 26 21:25:04 2010	(r707)
+++ trunk/openbios-devel/arch/sparc32/forthload.c	Fri Mar 26 22:17:32 2010	(r708)
@@ -24,6 +24,9 @@
     unsigned long forthsize;
     int retval = -1;
 
+    /* Mark the saved-program-state as invalid */
+    feval("0 state-valid !");
+
     fd = open_io(filename);
     if (!fd)
 	goto out;
@@ -54,6 +57,17 @@
     forthtext[forthsize]=0;
     printk("ok\n");
 
+    close_io(fd);
+
+    // Initialise saved-program-state
+    PUSH((ucell)forthtext);
+    feval("saved-program-state >sps.entry !");
+    PUSH((ucell)forthsize);
+    feval("saved-program-state >sps.file-size !");
+    feval("forth saved-program-state >sps.file-type !");
+
+    feval("-1 state-valid !");
+
     PUSH ( (ucell)forthtext );
     PUSH ( (ucell)forthsize );
     fword("eval2");

Modified: trunk/openbios-devel/arch/sparc64/aoutload.c
==============================================================================
--- trunk/openbios-devel/arch/sparc64/aoutload.c	Fri Mar 26 21:25:04 2010	(r707)
+++ trunk/openbios-devel/arch/sparc64/aoutload.c	Fri Mar 26 22:17:32 2010	(r708)
@@ -8,6 +8,7 @@
 #define CONFIG_SPARC64_PAGE_SIZE_8KB
 #include "arch/common/a.out.h"
 #include "libopenbios/sys_info.h"
+#include "libopenbios/bindings.h"
 #include "libc/diskio.h"
 #include "boot.h"
 #define printf printk
@@ -63,6 +64,9 @@
 
     image_name = image_version = NULL;
 
+    /* Mark the saved-program-state as invalid */
+    feval("0 state-valid !");
+
     fd = open_io(filename);
     if (!fd)
 	goto out;
@@ -123,8 +127,17 @@
     }
 
     debug("Loaded %lu bytes\n", size);
-
     debug("entry point is %#lx\n", start);
+
+    // Initialise saved-program-state
+    PUSH(addr_fixup(start));
+    feval("saved-program-state >sps.entry !");
+    PUSH(size);
+    feval("saved-program-state >sps.file-size !");
+    feval("aout saved-program-state >sps.file-type !");
+
+    feval("-1 state-valid !");
+
     printf("Jumping to entry point...\n");
 
     {

Modified: trunk/openbios-devel/arch/sparc64/elfload.c
==============================================================================
--- trunk/openbios-devel/arch/sparc64/elfload.c	Fri Mar 26 21:25:04 2010	(r707)
+++ trunk/openbios-devel/arch/sparc64/elfload.c	Fri Mar 26 22:17:32 2010	(r708)
@@ -10,6 +10,7 @@
 #include "arch/common/elf_boot.h"
 #include "libopenbios/sys_info.h"
 #include "libopenbios/ipchecksum.h"
+#include "libopenbios/bindings.h"
 #include "libc/diskio.h"
 #include "boot.h"
 #define printf printk
@@ -135,13 +136,12 @@
 
 static int load_segments(Elf_phdr *phdr, int phnum,
                          unsigned long checksum_offset,
-                         unsigned int offset)
+                         unsigned int offset, unsigned long *bytes)
 {
-    unsigned long bytes;
     //unsigned int start_time, time;
     int i;
 
-    bytes = 0;
+    *bytes = 0;
     // start_time = currticks();
     for (i = 0; i < phnum; i++) {
 	if (phdr[i].p_type != PT_LOAD)
@@ -155,7 +155,7 @@
 	    printf("Can't read program segment %d\n", i);
 	    return 0;
 	}
-	bytes += phdr[i].p_filesz;
+	*bytes += phdr[i].p_filesz;
 	debug("clearing... ");
 	memset(phys_to_virt(addr_fixup(phdr[i].p_paddr) + phdr[i].p_filesz), 0,
 		phdr[i].p_memsz - phdr[i].p_filesz);
@@ -171,7 +171,7 @@
     // time = currticks() - start_time;
     //debug("Loaded %lu bytes in %ums (%luKB/s)\n", bytes, time,
     //	    time? bytes/time : 0);
-    debug("Loaded %lu bytes \n", bytes);
+    debug("Loaded %lu bytes \n", *bytes);
 
     return 1;
 }
@@ -307,7 +307,7 @@
     Elf_ehdr ehdr;
     Elf_phdr *phdr = NULL;
     unsigned long phdr_size;
-    unsigned long checksum_offset;
+    unsigned long checksum_offset, file_size;
     unsigned short checksum = 0;
     Elf_Bhdr *boot_notes = NULL;
     int retval = -1;
@@ -316,6 +316,9 @@
 
     image_name = image_version = NULL;
 
+    /* Mark the saved-program-state as invalid */
+    feval("0 state-valid !");
+
     fd = open_io(filename);
     if (!fd)
 	goto out;
@@ -367,7 +370,7 @@
 	printf(" version %s", image_version);
     printf("...\n");
 
-    if (!load_segments(phdr, ehdr.e_phnum, checksum_offset, offset))
+    if (!load_segments(phdr, ehdr.e_phnum, checksum_offset, offset, &file_size))
 	goto out;
 
     if (checksum_offset) {
@@ -380,6 +383,16 @@
     //debug("current time: %lu\n", currticks());
 
     debug("entry point is %#llx\n", addr_fixup(ehdr.e_entry));
+
+    // Initialise saved-program-state
+    PUSH(addr_fixup(ehdr.e_entry));
+    feval("saved-program-state >sps.entry !");
+    PUSH(file_size);
+    feval("saved-program-state >sps.file-size !");
+    feval("elf-boot saved-program-state >sps.file-type !");
+
+    feval("-1 state-valid !");
+
     printf("Jumping to entry point...\n");
 
 #if 0

Modified: trunk/openbios-devel/arch/sparc64/fcodeload.c
==============================================================================
--- trunk/openbios-devel/arch/sparc64/fcodeload.c	Fri Mar 26 21:25:04 2010	(r707)
+++ trunk/openbios-devel/arch/sparc64/fcodeload.c	Fri Mar 26 22:17:32 2010	(r708)
@@ -20,6 +20,9 @@
     unsigned long start, size;
     unsigned int offset;
 
+    /* Mark the saved-program-state as invalid */
+    feval("0 state-valid !");
+
     fd = open_io(filename);
     if (!fd)
         goto out;
@@ -62,8 +65,15 @@
     }
 
     debug("Loaded %lu bytes\n", size);
-
     debug("entry point is %#lx\n", start);
+
+    // Initialise saved-program-state
+    PUSH(start);
+    feval("saved-program-state >sps.entry !");
+    PUSH(size);
+    feval("saved-program-state >sps.file-size !");
+    feval("fcode saved-program-state >sps.file-type !");
+
     printf("Evaluating FCode...\n");
 
     PUSH(start);

Modified: trunk/openbios-devel/arch/sparc64/forthload.c
==============================================================================
--- trunk/openbios-devel/arch/sparc64/forthload.c	Fri Mar 26 21:25:04 2010	(r707)
+++ trunk/openbios-devel/arch/sparc64/forthload.c	Fri Mar 26 22:17:32 2010	(r708)
@@ -24,6 +24,9 @@
     unsigned long forthsize;
     int retval = -1;
 
+    /* Mark the saved-program-state as invalid */
+    feval("0 state-valid !");
+
     fd = open_io(filename);
     if (!fd)
 	goto out;
@@ -56,6 +59,15 @@
 
     close_io(fd);
 
+    // Initialise saved-program-state
+    PUSH((ucell)forthtext);
+    feval("saved-program-state >sps.entry !");
+    PUSH((ucell)forthsize);
+    feval("saved-program-state >sps.file-size !");
+    feval("forth saved-program-state >sps.file-type !");
+
+    feval("-1 state-valid !");
+
     PUSH ( (ucell)forthtext );
     PUSH ( (ucell)forthsize );
     fword("eval2");

Modified: trunk/openbios-devel/arch/x86/elfload.c
==============================================================================
--- trunk/openbios-devel/arch/x86/elfload.c	Fri Mar 26 21:25:04 2010	(r707)
+++ trunk/openbios-devel/arch/x86/elfload.c	Fri Mar 26 22:17:32 2010	(r708)
@@ -10,6 +10,7 @@
 #include "arch/common/elf_boot.h"
 #include "libopenbios/sys_info.h"
 #include "libopenbios/ipchecksum.h"
+#include "libopenbios/bindings.h"
 #include "libc/diskio.h"
 #include "boot.h"
 
@@ -137,13 +138,12 @@
 }
 
 static int load_segments(Elf_phdr *phdr, int phnum,
-	unsigned long checksum_offset)
+	unsigned long checksum_offset, unsigned long *bytes)
 {
-    unsigned long bytes;
     //unsigned int start_time, time;
     int i;
 
-    bytes = 0;
+    *bytes = 0;
     // start_time = currticks();
     for (i = 0; i < phnum; i++) {
 	if (phdr[i].p_type != PT_LOAD)
@@ -157,7 +157,7 @@
 	    printk("Can't read program segment %d\n", i);
 	    return 0;
 	}
-	bytes += phdr[i].p_filesz;
+	*bytes += phdr[i].p_filesz;
 	debug("clearing... ");
 	memset(phys_to_virt(phdr[i].p_paddr + phdr[i].p_filesz), 0,
 		phdr[i].p_memsz - phdr[i].p_filesz);
@@ -173,7 +173,7 @@
     // time = currticks() - start_time;
     //debug("Loaded %lu bytes in %ums (%luKB/s)\n", bytes, time,
     //	    time? bytes/time : 0);
-    debug("Loaded %lu bytes \n", bytes);
+    debug("Loaded %lu bytes \n", *bytes);
 
     return 1;
 }
@@ -309,7 +309,7 @@
     Elf_ehdr ehdr;
     Elf_phdr *phdr = NULL;
     unsigned long phdr_size;
-    unsigned long checksum_offset;
+    unsigned long checksum_offset, file_size;
     unsigned short checksum = 0;
     Elf_Bhdr *boot_notes = NULL;
     int retval = -1;
@@ -317,6 +317,9 @@
 
     image_name = image_version = NULL;
 
+    /* Mark the saved-program-state as invalid */
+    feval("0 state-valid !");
+
     fd = open_io(filename);
     if (!fd)
 	goto out;
@@ -361,7 +364,7 @@
 	printk(" version %s", image_version);
     printk("...\n");
 
-    if (!load_segments(phdr, ehdr.e_phnum, checksum_offset))
+    if (!load_segments(phdr, ehdr.e_phnum, checksum_offset, &file_size))
 	goto out;
 
     if (checksum_offset) {
@@ -374,6 +377,16 @@
     //debug("current time: %lu\n", currticks());
 
     debug("entry point is %#x\n", ehdr.e_entry);
+
+    // Initialise saved-program-state
+    PUSH(ehdr.e_entry);
+    feval("saved-program-state >sps.entry !");
+    PUSH(file_size);
+    feval("saved-program-state >sps.file-size !");
+    feval("elf-boot saved-program-state >sps.file-type !");
+
+    feval("-1 state-valid !");
+
     printk("Jumping to entry point...\n");
     image_retval = start_elf(ehdr.e_entry & ADDRMASK, virt_to_phys(boot_notes));
 

Modified: trunk/openbios-devel/arch/x86/forthload.c
==============================================================================
--- trunk/openbios-devel/arch/x86/forthload.c	Fri Mar 26 21:25:04 2010	(r707)
+++ trunk/openbios-devel/arch/x86/forthload.c	Fri Mar 26 22:17:32 2010	(r708)
@@ -24,6 +24,9 @@
     unsigned long forthsize;
     int retval = -1;
 
+    /* Mark the saved-program-state as invalid */
+    feval("0 state-valid !");
+
     fd = open_io(filename);
     if (!fd)
 	goto out;
@@ -54,6 +57,17 @@
     forthtext[forthsize]=0;
     printk("ok\n");
 
+    close_io(fd);
+
+    // Initialise saved-program-state
+    PUSH((ucell)forthtext);
+    feval("saved-program-state >sps.entry !");
+    PUSH((ucell)forthsize);
+    feval("saved-program-state >sps.file-size !");
+    feval("forth saved-program-state >sps.file-type !");
+
+    feval("-1 state-valid !");
+
     PUSH ( (ucell)forthtext );
     PUSH ( (ucell)forthsize );
     fword("eval2");

Modified: trunk/openbios-devel/forth/debugging/client.fs
==============================================================================
--- trunk/openbios-devel/forth/debugging/client.fs	Fri Mar 26 21:25:04 2010	(r707)
+++ trunk/openbios-devel/forth/debugging/client.fs	Fri Mar 26 22:17:32 2010	(r708)
@@ -16,6 +16,12 @@
 
 
 \ 7.6.2    Program download and execute
+struct ( saved-program-state )
+  /n field >sps.entry
+  /n field >sps.file-size
+  /n field >sps.file-type
+constant saved-program-state.size
+create saved-program-state saved-program-state.size allot
 
 variable state-valid
 0 state-valid !
@@ -28,10 +34,14 @@
 
 variable file-type
 
-0 constant elf
-1 constant bootinfo
-2 constant xcoff
-3 constant pe
+0  constant elf-boot
+1  constant elf
+2  constant bootinfo
+3  constant xcoff
+4  constant pe
+5  constant aout
+10 constant fcode
+11 constant forth
 
 \ Array indexes and values for e_type
 



More information about the OpenBIOS mailing list