OpenBIOS
Threads by month
- ----- 2026 -----
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2000 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1999 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1998 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1997 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1996 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1995 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1994 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1993 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1992 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1991 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1990 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1989 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1988 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1987 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1986 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1985 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1984 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1983 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1982 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1981 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1980 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1979 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1978 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1977 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1976 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1975 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1974 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1973 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1972 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1971 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1970 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1969 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1968 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1967 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1966 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1965 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1964 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1963 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1962 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1961 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1960 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1959 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1958 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1957 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1956 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1955 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1954 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1953 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1952 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1951 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1950 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1949 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1948 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1947 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1946 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1945 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1944 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1943 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1942 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1941 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1940 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1939 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1938 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1937 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1936 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1935 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1934 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1933 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1932 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1931 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1930 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1929 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1928 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1927 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1926 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1925 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1924 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1923 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1922 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1921 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1920 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1919 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1918 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1917 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1916 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1915 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1914 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1913 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1912 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1911 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1910 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1909 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1908 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1907 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1906 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1905 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1904 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
March 2010
- 11 participants
- 56 discussions
[commit] r708 - in trunk/openbios-devel: arch/amd64 arch/sparc32 arch/sparc64 arch/x86 forth/debugging
by repository service March 26, 2010
by repository service March 26, 2010
March 26, 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(a)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
1
0
[commit] r707 - in trunk/openbios-devel/arch: amd64 sparc32 sparc64 x86
by repository service March 26, 2010
by repository service March 26, 2010
March 26, 2010
Author: mcayland
Date: Fri Mar 26 21:25:04 2010
New Revision: 707
URL: http://tracker.coreboot.org/trac/openbios/changeset/707
Log:
Remove loadfs.c and loadfs.h from all of the various architectures. They appear to be almost non-existent wrappers which add an
extra layer of indirection without much benefit.
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland(a)siriusit.co.uk>
Deleted:
trunk/openbios-devel/arch/amd64/loadfs.c
trunk/openbios-devel/arch/amd64/loadfs.h
trunk/openbios-devel/arch/sparc32/loadfs.c
trunk/openbios-devel/arch/sparc32/loadfs.h
trunk/openbios-devel/arch/sparc64/loadfs.c
trunk/openbios-devel/arch/sparc64/loadfs.h
trunk/openbios-devel/arch/x86/loadfs.c
trunk/openbios-devel/arch/x86/loadfs.h
Modified:
trunk/openbios-devel/arch/sparc32/aoutload.c
trunk/openbios-devel/arch/sparc32/build.xml
trunk/openbios-devel/arch/sparc32/elfload.c
trunk/openbios-devel/arch/sparc32/forthload.c
trunk/openbios-devel/arch/sparc32/linux_load.c
trunk/openbios-devel/arch/sparc64/aoutload.c
trunk/openbios-devel/arch/sparc64/build.xml
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/sparc64/linux_load.c
trunk/openbios-devel/arch/x86/build.xml
trunk/openbios-devel/arch/x86/elfload.c
trunk/openbios-devel/arch/x86/forthload.c
trunk/openbios-devel/arch/x86/linux_load.c
Modified: trunk/openbios-devel/arch/sparc32/aoutload.c
==============================================================================
--- trunk/openbios-devel/arch/sparc32/aoutload.c Thu Mar 25 22:14:00 2010 (r706)
+++ trunk/openbios-devel/arch/sparc32/aoutload.c Fri Mar 26 21:25:04 2010 (r707)
@@ -7,7 +7,7 @@
#include "kernel/kernel.h"
#include "arch/common/a.out.h"
#include "libopenbios/sys_info.h"
-#include "loadfs.h"
+#include "libc/diskio.h"
#include "boot.h"
#define printf printk
#define debug printk
@@ -15,6 +15,7 @@
#define addr_fixup(addr) ((addr) & 0x00ffffff)
static char *image_name, *image_version;
+static int fd;
static int check_mem_ranges(struct sys_info *info,
unsigned long start,
@@ -61,12 +62,13 @@
image_name = image_version = NULL;
- if (!file_open(filename))
+ fd = open_io(filename);
+ if (!fd)
goto out;
- file_seek(offset);
+ seek_io(fd, offset);
- if (lfile_read(&ehdr, sizeof ehdr) != sizeof ehdr) {
+ if (read_io(fd, &ehdr, sizeof ehdr) != sizeof ehdr) {
debug("Can't read a.out header\n");
retval = LOADER_NOT_SUPPORT;
goto out;
@@ -98,19 +100,19 @@
printf("Loading a.out %s...\n", image_name ? image_name : "image");
- file_seek(offset + N_TXTOFF(ehdr));
+ seek_io(fd, offset + N_TXTOFF(ehdr));
if (N_MAGIC(ehdr) == NMAGIC) {
- if ((unsigned long)lfile_read((void *)start, ehdr.a_text) != ehdr.a_text) {
+ if ((unsigned long)read_io(fd, (void *)start, ehdr.a_text) != ehdr.a_text) {
printf("Can't read program text segment (size 0x%lx)\n", ehdr.a_text);
goto out;
}
- if ((unsigned long)lfile_read((void *)(start + N_DATADDR(ehdr)), ehdr.a_data) != ehdr.a_data) {
+ if ((unsigned long)read_io(fd, (void *)(start + N_DATADDR(ehdr)), ehdr.a_data) != ehdr.a_data) {
printf("Can't read program data segment (size 0x%lx)\n", ehdr.a_data);
goto out;
}
} else {
- if ((unsigned long)lfile_read((void *)start, size) != size) {
+ if ((unsigned long)read_io(fd, (void *)start, size) != size) {
printf("Can't read program (size 0x%lx)\n", size);
goto out;
}
@@ -134,6 +136,6 @@
retval = 0;
out:
- file_close();
+ close_io(fd);
return retval;
}
Modified: trunk/openbios-devel/arch/sparc32/build.xml
==============================================================================
--- trunk/openbios-devel/arch/sparc32/build.xml Thu Mar 25 22:14:00 2010 (r706)
+++ trunk/openbios-devel/arch/sparc32/build.xml Fri Mar 26 21:25:04 2010 (r707)
@@ -18,7 +18,6 @@
<object source="elfload.c"/>
<object source="aoutload.c"/>
<object source="forthload.c"/>
- <object source="loadfs.c"/>
<object source="romvec.c"/>
<object source="entry.S"/>
<object source="vectors.S"/>
Modified: trunk/openbios-devel/arch/sparc32/elfload.c
==============================================================================
--- trunk/openbios-devel/arch/sparc32/elfload.c Thu Mar 25 22:14:00 2010 (r706)
+++ trunk/openbios-devel/arch/sparc32/elfload.c Fri Mar 26 21:25:04 2010 (r707)
@@ -10,7 +10,7 @@
#include "arch/common/elf_boot.h"
#include "libopenbios/sys_info.h"
#include "libopenbios/ipchecksum.h"
-#include "loadfs.h"
+#include "libc/diskio.h"
#include "boot.h"
#define printf printk
#define debug printk
@@ -18,6 +18,7 @@
#define addr_fixup(addr) ((addr) & 0x00ffffff)
static char *image_name, *image_version;
+static int fd;
static void *calloc(size_t nmemb, size_t size)
{
@@ -90,8 +91,8 @@
if (phdr[i].p_type != PT_NOTE)
continue;
buf = malloc(phdr[i].p_filesz);
- file_seek(offset + phdr[i].p_offset);
- if ((uint32_t)lfile_read(buf, phdr[i].p_filesz) != phdr[i].p_filesz) {
+ seek_io(fd, offset + phdr[i].p_offset);
+ if ((uint32_t)read_io(fd, buf, phdr[i].p_filesz) != phdr[i].p_filesz) {
printf("Can't read note segment\n");
goto out;
}
@@ -126,7 +127,7 @@
}
}
out:
- file_close();
+ close_io(fd);
if (buf)
free(buf);
return retval;
@@ -147,9 +148,9 @@
continue;
debug("segment %d addr:%#x file:%#x mem:%#x ",
i, addr_fixup(phdr[i].p_paddr), phdr[i].p_filesz, phdr[i].p_memsz);
- file_seek(offset + phdr[i].p_offset);
+ seek_io(fd, offset + phdr[i].p_offset);
debug("loading... ");
- if ((uint32_t)lfile_read(phys_to_virt(addr_fixup(phdr[i].p_paddr)), phdr[i].p_filesz)
+ if ((uint32_t)read_io(fd, phys_to_virt(addr_fixup(phdr[i].p_paddr)), phdr[i].p_filesz)
!= phdr[i].p_filesz) {
printf("Can't read program segment %d\n", i);
return 0;
@@ -316,11 +317,12 @@
image_name = image_version = NULL;
- if (!file_open(filename))
+ fd = open_io(filename);
+ if (!fd)
goto out;
for (offset = 0; offset < 16 * 512; offset += 512) {
- if (lfile_read(&ehdr, sizeof ehdr) != sizeof ehdr) {
+ if (read_io(fd, &ehdr, sizeof ehdr) != sizeof ehdr) {
debug("Can't read ELF header\n");
retval = LOADER_NOT_SUPPORT;
goto out;
@@ -329,7 +331,7 @@
if (ehdr.e_ident[EI_MAG0] == ELFMAG0)
break;
- file_seek(offset);
+ seek_io(fd, offset);
}
if (ehdr.e_ident[EI_MAG0] != ELFMAG0
@@ -350,8 +352,8 @@
phdr_size = ehdr.e_phnum * sizeof *phdr;
phdr = malloc(phdr_size);
- file_seek(offset + ehdr.e_phoff);
- if ((uint32_t)lfile_read(phdr, phdr_size) != phdr_size) {
+ seek_io(fd, offset + ehdr.e_phoff);
+ if ((uint32_t)read_io(fd, phdr, phdr_size) != phdr_size) {
printf("Can't read program header\n");
goto out;
}
@@ -397,7 +399,7 @@
retval = 0;
out:
- file_close();
+ close_io(fd);
if (phdr)
free(phdr);
if (boot_notes)
Modified: trunk/openbios-devel/arch/sparc32/forthload.c
==============================================================================
--- trunk/openbios-devel/arch/sparc32/forthload.c Thu Mar 25 22:14:00 2010 (r706)
+++ trunk/openbios-devel/arch/sparc32/forthload.c Fri Mar 26 21:25:04 2010 (r707)
@@ -10,12 +10,13 @@
#include "kernel/kernel.h"
#include "libopenbios/bindings.h"
#include "libopenbios/sys_info.h"
-#include "loadfs.h"
+#include "libc/diskio.h"
#include "boot.h"
#define printk printk
#define debug printk
static char *forthtext=NULL;
+static int fd;
int forth_load(const char *filename)
{
@@ -23,10 +24,11 @@
unsigned long forthsize;
int retval = -1;
- if (!file_open(filename))
+ fd = open_io(filename);
+ if (!fd)
goto out;
- if (lfile_read(magic, 2) != 2) {
+ if (read_io(fd, magic, 2) != 2) {
debug("Can't read magic header\n");
retval = LOADER_NOT_SUPPORT;
goto out;
@@ -38,13 +40,14 @@
goto out;
}
- forthsize = file_size();
-
+ /* Calculate the file size by seeking to the end of the file */
+ seek_io(fd, -1);
+ forthsize = tell(fd);
forthtext = malloc(forthsize+1);
- file_seek(0);
+ seek_io(fd, 0);
printk("Loading forth source ...");
- if ((unsigned long)lfile_read(forthtext, forthsize) != forthsize) {
+ if ((unsigned long)read_io(fd, forthtext, forthsize) != forthsize) {
printk("Can't read forth text\n");
goto out;
}
Modified: trunk/openbios-devel/arch/sparc32/linux_load.c
==============================================================================
--- trunk/openbios-devel/arch/sparc32/linux_load.c Thu Mar 25 22:14:00 2010 (r706)
+++ trunk/openbios-devel/arch/sparc32/linux_load.c Fri Mar 26 21:25:04 2010 (r707)
@@ -13,7 +13,7 @@
#include "libopenbios/bindings.h"
#include "libopenbios/sys_info.h"
#include "context.h"
-#include "loadfs.h"
+#include "libc/diskio.h"
#include "boot.h"
#define printf printk
@@ -157,6 +157,25 @@
};
static uint64_t forced_memsize;
+static int fd;
+
+static unsigned long file_size(void)
+{
+ llong fpos, fsize;
+
+ /* Save current position */
+ fpos = tell(fd);
+
+ /* Go to end of file and get position */
+ seek_io(fd, -1);
+ fsize = tell(fd);
+
+ /* Go back to old position */
+ seek_io(fd, 0);
+ seek_io(fd, fpos);
+
+ return fsize;
+}
/* Load the first part the file and check if it's Linux */
static uint32_t load_linux_header(struct linux_header *hdr)
@@ -164,7 +183,7 @@
int load_high;
uint32_t kern_addr;
- if (lfile_read(hdr, sizeof *hdr) != sizeof *hdr) {
+ if (read_io(fd, hdr, sizeof *hdr) != sizeof *hdr) {
debug("Can't read Linux header\n");
return 0;
}
@@ -191,8 +210,8 @@
printf("Found Linux");
if (hdr->protocol_version >= 0x200 && hdr->kver_addr) {
char kver[256];
- file_seek(hdr->kver_addr + 0x200);
- if (lfile_read(kver, sizeof kver) != 0) {
+ seek_io(fd, hdr->kver_addr + 0x200);
+ if (read_io(fd, kver, sizeof kver) != 0) {
kver[255] = 0;
printf(" version %s", kver);
}
@@ -412,7 +431,7 @@
if (hdr->setup_sects == 0)
hdr->setup_sects = 4;
kern_offset = (hdr->setup_sects + 1) * 512;
- file_seek(kern_offset);
+ seek_io(fd, kern_offset);
kern_size = file_size() - kern_offset;
debug("offset=%#x addr=%#x size=%#x\n", kern_offset, kern_addr, kern_size);
@@ -425,7 +444,7 @@
#endif
printf("Loading kernel... ");
- if ((uint32_t)lfile_read(phys_to_virt(kern_addr), kern_size) != kern_size) {
+ if ((uint32_t)read_io(fd, phys_to_virt(kern_addr), kern_size) != kern_size) {
printf("Can't read kernel\n");
return 0;
}
@@ -441,7 +460,8 @@
uint32_t start, end, size;
uint64_t forced;
- if (!file_open(initrd_file)) {
+ fd = open_io(initrd_file);
+ if (!fd) {
printf("Can't open initrd: %s\n", initrd_file);
return -1;
}
@@ -498,7 +518,7 @@
}
printf("Loading initrd... ");
- if ((uint32_t)lfile_read(phys_to_virt(start), size) != size) {
+ if ((uint32_t)read_io(fd, phys_to_virt(start), size) != size) {
printf("Can't read initrd\n");
return -1;
}
@@ -507,6 +527,8 @@
params->initrd_start = start;
params->initrd_size = size;
+ close_io(fd);
+
return 0;
}
@@ -586,12 +608,13 @@
uint32_t kern_addr, kern_size;
char *initrd_file = NULL;
- if (!file_open(file))
+ fd = open_io(file);
+ if (!fd)
return -1;
kern_addr = load_linux_header(&hdr);
if (kern_addr == 0) {
- file_close();
+ close_io(fd);
return LOADER_NOT_SUPPORT;
}
Modified: trunk/openbios-devel/arch/sparc64/aoutload.c
==============================================================================
--- trunk/openbios-devel/arch/sparc64/aoutload.c Thu Mar 25 22:14:00 2010 (r706)
+++ trunk/openbios-devel/arch/sparc64/aoutload.c Fri Mar 26 21:25:04 2010 (r707)
@@ -8,7 +8,7 @@
#define CONFIG_SPARC64_PAGE_SIZE_8KB
#include "arch/common/a.out.h"
#include "libopenbios/sys_info.h"
-#include "loadfs.h"
+#include "libc/diskio.h"
#include "boot.h"
#define printf printk
#define debug printk
@@ -16,6 +16,7 @@
#define addr_fixup(addr) ((addr) & 0x00ffffff)
static char *image_name, *image_version;
+static int fd;
static int check_mem_ranges(struct sys_info *info,
unsigned long start,
@@ -62,12 +63,13 @@
image_name = image_version = NULL;
- if (!file_open(filename))
+ fd = open_io(filename);
+ if (!fd)
goto out;
for (offset = 0; offset < 16 * 512; offset += 512) {
- file_seek(offset);
- if (lfile_read(&ehdr, sizeof ehdr) != sizeof ehdr) {
+ seek_io(fd, offset);
+ if (read_io(fd, &ehdr, sizeof ehdr) != sizeof ehdr) {
debug("Can't read a.out header\n");
retval = LOADER_NOT_SUPPORT;
goto out;
@@ -102,19 +104,19 @@
printf("Loading a.out %s...\n", image_name ? image_name : "image");
- file_seek(offset + N_TXTOFF(ehdr));
+ seek_io(fd, offset + N_TXTOFF(ehdr));
if (N_MAGIC(ehdr) == NMAGIC) {
- if ((unsigned long)lfile_read((void *)start, ehdr.a_text) != ehdr.a_text) {
+ if ((unsigned long)read_io(fd, (void *)start, ehdr.a_text) != ehdr.a_text) {
printf("Can't read program text segment (size 0x%x)\n", ehdr.a_text);
goto out;
}
- if ((unsigned long)lfile_read((void *)(start + N_DATADDR(ehdr)), ehdr.a_data) != ehdr.a_data) {
+ if ((unsigned long)read_io(fd, (void *)(start + N_DATADDR(ehdr)), ehdr.a_data) != ehdr.a_data) {
printf("Can't read program data segment (size 0x%x)\n", ehdr.a_data);
goto out;
}
} else {
- if ((unsigned long)lfile_read((void *)start, size) != size) {
+ if ((unsigned long)read_io(fd, (void *)start, size) != size) {
printf("Can't read program (size 0x%lx)\n", size);
goto out;
}
@@ -134,6 +136,6 @@
retval = 0;
out:
- file_close();
+ close_io(fd);
return retval;
}
Modified: trunk/openbios-devel/arch/sparc64/build.xml
==============================================================================
--- trunk/openbios-devel/arch/sparc64/build.xml Thu Mar 25 22:14:00 2010 (r706)
+++ trunk/openbios-devel/arch/sparc64/build.xml Fri Mar 26 21:25:04 2010 (r707)
@@ -18,7 +18,6 @@
<object source="aoutload.c"/>
<object source="forthload.c"/>
<object source="fcodeload.c"/>
- <object source="loadfs.c"/>
<object source="ofmem_sparc64.c"/>
<object source="entry.S"/>
<object source="vectors.S"/>
Modified: trunk/openbios-devel/arch/sparc64/elfload.c
==============================================================================
--- trunk/openbios-devel/arch/sparc64/elfload.c Thu Mar 25 22:14:00 2010 (r706)
+++ trunk/openbios-devel/arch/sparc64/elfload.c Fri Mar 26 21:25:04 2010 (r707)
@@ -10,7 +10,7 @@
#include "arch/common/elf_boot.h"
#include "libopenbios/sys_info.h"
#include "libopenbios/ipchecksum.h"
-#include "loadfs.h"
+#include "libc/diskio.h"
#include "boot.h"
#define printf printk
#define debug printk
@@ -18,6 +18,7 @@
#define addr_fixup(addr) ((addr) & 0x00ffffff)
static char *image_name, *image_version;
+static int fd;
static void *calloc(size_t nmemb, size_t size)
{
@@ -90,8 +91,8 @@
if (phdr[i].p_type != PT_NOTE)
continue;
buf = malloc(phdr[i].p_filesz);
- file_seek(offset + phdr[i].p_offset);
- if ((uint64_t)lfile_read(buf, phdr[i].p_filesz) != phdr[i].p_filesz) {
+ seek_io(fd, offset + phdr[i].p_offset);
+ if ((uint64_t)read_io(fd, buf, phdr[i].p_filesz) != phdr[i].p_filesz) {
printf("Can't read note segment\n");
goto out;
}
@@ -126,7 +127,7 @@
}
}
out:
- file_close();
+ close_io(fd);
if (buf)
free(buf);
return retval;
@@ -147,9 +148,9 @@
continue;
debug("segment %d addr:%#llx file:%#llx mem:%#llx ",
i, addr_fixup(phdr[i].p_paddr), phdr[i].p_filesz, phdr[i].p_memsz);
- file_seek(offset + phdr[i].p_offset);
+ seek_io(fd, offset + phdr[i].p_offset);
debug("loading... ");
- if ((uint64_t)lfile_read(phys_to_virt(addr_fixup(phdr[i].p_paddr)), phdr[i].p_filesz)
+ if ((uint64_t)read_io(fd, phys_to_virt(addr_fixup(phdr[i].p_paddr)), phdr[i].p_filesz)
!= phdr[i].p_filesz) {
printf("Can't read program segment %d\n", i);
return 0;
@@ -315,11 +316,12 @@
image_name = image_version = NULL;
- if (!file_open(filename))
+ fd = open_io(filename);
+ if (!fd)
goto out;
for (offset = 0; offset < 16 * 512; offset += 512) {
- if ((size_t)lfile_read(&ehdr, sizeof ehdr) != sizeof ehdr) {
+ if ((size_t)read_io(fd, &ehdr, sizeof ehdr) != sizeof ehdr) {
debug("Can't read ELF header\n");
retval = LOADER_NOT_SUPPORT;
goto out;
@@ -328,7 +330,7 @@
if (ehdr.e_ident[EI_MAG0] == ELFMAG0)
break;
- file_seek(offset);
+ seek_io(fd, offset);
}
if (ehdr.e_ident[EI_MAG0] != ELFMAG0
@@ -349,8 +351,8 @@
phdr_size = ehdr.e_phnum * sizeof *phdr;
phdr = malloc(phdr_size);
- file_seek(offset + ehdr.e_phoff);
- if ((unsigned long)lfile_read(phdr, phdr_size) != phdr_size) {
+ seek_io(fd, offset + ehdr.e_phoff);
+ if ((unsigned long)read_io(fd, phdr, phdr_size) != phdr_size) {
printf("Can't read program header\n");
goto out;
}
@@ -402,7 +404,7 @@
retval = 0;
out:
- file_close();
+ close_io(fd);
if (phdr)
free(phdr);
if (boot_notes)
Modified: trunk/openbios-devel/arch/sparc64/fcodeload.c
==============================================================================
--- trunk/openbios-devel/arch/sparc64/fcodeload.c Thu Mar 25 22:14:00 2010 (r706)
+++ trunk/openbios-devel/arch/sparc64/fcodeload.c Fri Mar 26 21:25:04 2010 (r707)
@@ -6,11 +6,13 @@
#include "kernel/kernel.h"
#include "libopenbios/bindings.h"
#include "libopenbios/sys_info.h"
-#include "loadfs.h"
+#include "libc/diskio.h"
#include "boot.h"
#define printf printk
#define debug printk
+static int fd;
+
int fcode_load(const char *filename)
{
int retval = -1;
@@ -18,12 +20,13 @@
unsigned long start, size;
unsigned int offset;
- if (!file_open(filename))
+ fd = open_io(filename);
+ if (!fd)
goto out;
for (offset = 0; offset < 16 * 512; offset += 512) {
- file_seek(offset);
- if (lfile_read(&fcode_header, sizeof(fcode_header))
+ seek_io(fd, offset);
+ if (read_io(fd, &fcode_header, sizeof(fcode_header))
!= sizeof(fcode_header)) {
debug("Can't read FCode header from file %s\n", filename);
retval = LOADER_NOT_SUPPORT;
@@ -51,9 +54,9 @@
printf("Loading FCode image...\n");
- file_seek(offset + sizeof(fcode_header));
+ seek_io(fd, offset + sizeof(fcode_header));
- if ((unsigned long)lfile_read((void *)start, size) != size) {
+ if ((unsigned long)read_io(fd, (void *)start, size) != size) {
printf("Can't read file (size 0x%lx)\n", size);
goto out;
}
@@ -70,6 +73,6 @@
retval = 0;
out:
- file_close();
+ close_io(fd);
return retval;
}
Modified: trunk/openbios-devel/arch/sparc64/forthload.c
==============================================================================
--- trunk/openbios-devel/arch/sparc64/forthload.c Thu Mar 25 22:14:00 2010 (r706)
+++ trunk/openbios-devel/arch/sparc64/forthload.c Fri Mar 26 21:25:04 2010 (r707)
@@ -10,22 +10,25 @@
#include "kernel/kernel.h"
#include "libopenbios/bindings.h"
#include "libopenbios/sys_info.h"
-#include "loadfs.h"
+#include "libc/diskio.h"
#include "boot.h"
#define printk printk
#define debug printk
static char *forthtext=NULL;
+static int fd;
+
int forth_load(const char *filename)
{
char magic[2];
unsigned long forthsize;
int retval = -1;
- if (!file_open(filename))
+ fd = open_io(filename);
+ if (!fd)
goto out;
- if (lfile_read(magic, 2) != 2) {
+ if (read_io(fd, magic, 2) != 2) {
debug("Can't read magic header\n");
retval = LOADER_NOT_SUPPORT;
goto out;
@@ -37,19 +40,22 @@
goto out;
}
- forthsize = file_size();
-
+ /* Calculate the file size by seeking to the end of the file */
+ seek_io(fd, -1);
+ forthsize = tell(fd);
forthtext = malloc(forthsize+1);
- file_seek(0);
+ seek_io(fd, 0);
printk("Loading forth source ...");
- if ((unsigned long)lfile_read(forthtext, forthsize) != forthsize) {
+ if ((unsigned long)read_io(fd, forthtext, forthsize) != forthsize) {
printk("Can't read forth text\n");
goto out;
}
forthtext[forthsize]=0;
printk("ok\n");
+ close_io(fd);
+
PUSH ( (ucell)forthtext );
PUSH ( (ucell)forthsize );
fword("eval2");
Modified: trunk/openbios-devel/arch/sparc64/linux_load.c
==============================================================================
--- trunk/openbios-devel/arch/sparc64/linux_load.c Thu Mar 25 22:14:00 2010 (r706)
+++ trunk/openbios-devel/arch/sparc64/linux_load.c Fri Mar 26 21:25:04 2010 (r707)
@@ -13,7 +13,7 @@
#include "libopenbios/bindings.h"
#include "libopenbios/sys_info.h"
#include "context.h"
-#include "loadfs.h"
+#include "libc/diskio.h"
#include "boot.h"
#define printf printk
@@ -157,6 +157,25 @@
};
static uint64_t forced_memsize;
+static int fd;
+
+static unsigned long file_size(void)
+{
+ llong fpos, fsize;
+
+ /* Save current position */
+ fpos = tell(fd);
+
+ /* Go to end of file and get position */
+ seek_io(fd, -1);
+ fsize = tell(fd);
+
+ /* Go back to old position */
+ seek_io(fd, 0);
+ seek_io(fd, fpos);
+
+ return fsize;
+}
/* Load the first part the file and check if it's Linux */
static uint32_t load_linux_header(struct linux_header *hdr)
@@ -164,7 +183,7 @@
int load_high;
uint32_t kern_addr;
- if (lfile_read(hdr, sizeof *hdr) != sizeof *hdr) {
+ if (read_io(fd, hdr, sizeof *hdr) != sizeof *hdr) {
debug("Can't read Linux header\n");
return 0;
}
@@ -191,8 +210,8 @@
printf("Found Linux");
if (hdr->protocol_version >= 0x200 && hdr->kver_addr) {
char kver[256];
- file_seek(hdr->kver_addr + 0x200);
- if (lfile_read(kver, sizeof kver) != 0) {
+ seek_io(fd, hdr->kver_addr + 0x200);
+ if (read_io(fd, kver, sizeof kver) != 0) {
kver[255] = 0;
printf(" version %s", kver);
}
@@ -412,7 +431,7 @@
if (hdr->setup_sects == 0)
hdr->setup_sects = 4;
kern_offset = (hdr->setup_sects + 1) * 512;
- file_seek(kern_offset);
+ seek_io(fd, kern_offset);
kern_size = file_size() - kern_offset;
debug("offset=%#x addr=%#x size=%#x\n", kern_offset, kern_addr, kern_size);
@@ -425,7 +444,7 @@
#endif
printf("Loading kernel... ");
- if ((uint32_t)lfile_read(phys_to_virt(kern_addr), kern_size) != kern_size) {
+ if ((uint32_t)read_io(fd, phys_to_virt(kern_addr), kern_size) != kern_size) {
printf("Can't read kernel\n");
return 0;
}
@@ -441,7 +460,8 @@
uint32_t start, end, size;
uint64_t forced;
- if (!file_open(initrd_file)) {
+ fd = open_io(initrd_file);
+ if (!fd) {
printf("Can't open initrd: %s\n", initrd_file);
return -1;
}
@@ -498,7 +518,7 @@
}
printf("Loading initrd... ");
- if ((uint32_t)lfile_read(phys_to_virt(start), size) != size) {
+ if ((uint32_t)read_io(fd, phys_to_virt(start), size) != size) {
printf("Can't read initrd\n");
return -1;
}
@@ -507,6 +527,8 @@
params->initrd_start = start;
params->initrd_size = size;
+ close_io(fd);
+
return 0;
}
@@ -586,12 +608,13 @@
uint32_t kern_addr, kern_size;
char *initrd_file = NULL;
- if (!file_open(file))
+ fd = open_io(file);
+ if (!fd)
return -1;
kern_addr = load_linux_header(&hdr);
if (kern_addr == 0) {
- file_close();
+ close_io(fd);
return LOADER_NOT_SUPPORT;
}
Modified: trunk/openbios-devel/arch/x86/build.xml
==============================================================================
--- trunk/openbios-devel/arch/x86/build.xml Thu Mar 25 22:14:00 2010 (r706)
+++ trunk/openbios-devel/arch/x86/build.xml Fri Mar 26 21:25:04 2010 (r707)
@@ -16,7 +16,6 @@
<object source="sys_info.c"/>
<object source="elfload.c"/>
<object source="forthload.c"/>
- <object source="loadfs.c"/>
<object source="entry.S"/>
<object source="xbox/console.c" condition="XBOX"/>
<object source="xbox/methods.c" condition="XBOX"/>
Modified: trunk/openbios-devel/arch/x86/elfload.c
==============================================================================
--- trunk/openbios-devel/arch/x86/elfload.c Thu Mar 25 22:14:00 2010 (r706)
+++ trunk/openbios-devel/arch/x86/elfload.c Fri Mar 26 21:25:04 2010 (r707)
@@ -10,7 +10,7 @@
#include "arch/common/elf_boot.h"
#include "libopenbios/sys_info.h"
#include "libopenbios/ipchecksum.h"
-#include "loadfs.h"
+#include "libc/diskio.h"
#include "boot.h"
#define debug printk
@@ -22,6 +22,7 @@
extern char _start, _end;
static char *image_name, *image_version;
+static int fd;
static void *calloc(size_t nmemb, size_t size)
{
@@ -94,8 +95,8 @@
if (phdr[i].p_type != PT_NOTE)
continue;
buf = malloc(phdr[i].p_filesz);
- file_seek(phdr[i].p_offset);
- if (lfile_read(buf, phdr[i].p_filesz) != phdr[i].p_filesz) {
+ seek_io(fd, phdr[i].p_offset);
+ if (read_io(fd, buf, phdr[i].p_filesz) != phdr[i].p_filesz) {
printk("Can't read note segment\n");
goto out;
}
@@ -149,9 +150,9 @@
continue;
debug("segment %d addr:%#x file:%#x mem:%#x ",
i, phdr[i].p_paddr, phdr[i].p_filesz, phdr[i].p_memsz);
- file_seek(phdr[i].p_offset);
+ seek_io(fd, phdr[i].p_offset);
debug("loading... ");
- if (lfile_read(phys_to_virt(phdr[i].p_paddr & ADDRMASK), phdr[i].p_filesz)
+ if (read_io(fd, phys_to_virt(phdr[i].p_paddr & ADDRMASK), phdr[i].p_filesz)
!= phdr[i].p_filesz) {
printk("Can't read program segment %d\n", i);
return 0;
@@ -316,10 +317,11 @@
image_name = image_version = NULL;
- if (!file_open(filename))
+ fd = open_io(filename);
+ if (!fd)
goto out;
- if (lfile_read(&ehdr, sizeof ehdr) != sizeof ehdr) {
+ if (read_io(fd, &ehdr, sizeof ehdr) != sizeof ehdr) {
debug("Can't read ELF header\n");
retval = LOADER_NOT_SUPPORT;
goto out;
@@ -343,8 +345,8 @@
phdr_size = ehdr.e_phnum * sizeof *phdr;
phdr = malloc(phdr_size);
- file_seek(ehdr.e_phoff);
- if (lfile_read(phdr, phdr_size) != phdr_size) {
+ seek_io(fd, ehdr.e_phoff);
+ if (read_io(fd, phdr, phdr_size) != phdr_size) {
printk("Can't read program header\n");
goto out;
}
Modified: trunk/openbios-devel/arch/x86/forthload.c
==============================================================================
--- trunk/openbios-devel/arch/x86/forthload.c Thu Mar 25 22:14:00 2010 (r706)
+++ trunk/openbios-devel/arch/x86/forthload.c Fri Mar 26 21:25:04 2010 (r707)
@@ -10,22 +10,25 @@
#include "kernel/kernel.h"
#include "libopenbios/bindings.h"
#include "libopenbios/sys_info.h"
-#include "loadfs.h"
+#include "libc/diskio.h"
#include "boot.h"
#define printk printk
#define debug printk
static char *forthtext=NULL;
+static int fd;
+
int forth_load(struct sys_info *info, const char *filename, const char *cmdline)
{
char magic[2];
unsigned long forthsize;
int retval = -1;
- if (!file_open(filename))
+ fd = open_io(filename);
+ if (!fd)
goto out;
- if (lfile_read(magic, 2) != 2) {
+ if (read_io(fd, magic, 2) != 2) {
debug("Can't read magic header\n");
retval = LOADER_NOT_SUPPORT;
goto out;
@@ -37,13 +40,14 @@
goto out;
}
- forthsize = file_size();
-
+ /* Calculate the file size by seeking to the end of the file */
+ seek_io(fd, -1);
+ forthsize = tell(fd);
forthtext = malloc(forthsize+1);
- file_seek(0);
+ seek_io(fd, 0);
printk("Loading forth source ...");
- if (lfile_read(forthtext, forthsize) != forthsize) {
+ if (read_io(fd, forthtext, forthsize) != forthsize) {
printk("Can't read forth text\n");
goto out;
}
Modified: trunk/openbios-devel/arch/x86/linux_load.c
==============================================================================
--- trunk/openbios-devel/arch/x86/linux_load.c Thu Mar 25 22:14:00 2010 (r706)
+++ trunk/openbios-devel/arch/x86/linux_load.c Fri Mar 26 21:25:04 2010 (r707)
@@ -14,7 +14,7 @@
#include "libopenbios/sys_info.h"
#include "context.h"
#include "segment.h"
-#include "loadfs.h"
+#include "libc/diskio.h"
#include "boot.h"
#define printf printk
@@ -158,6 +158,25 @@
};
static uint64_t forced_memsize;
+static int fd;
+
+static unsigned long file_size(void)
+{
+ llong fpos, fsize;
+
+ /* Save current position */
+ fpos = tell(fd);
+
+ /* Go to end of file and get position */
+ seek_io(fd, -1);
+ fsize = tell(fd);
+
+ /* Go back to old position */
+ seek_io(fd, 0);
+ seek_io(fd, fpos);
+
+ return fsize;
+}
/* Load the first part the file and check if it's Linux */
static uint32_t load_linux_header(struct linux_header *hdr)
@@ -165,7 +184,7 @@
int load_high;
uint32_t kern_addr;
- if (lfile_read(hdr, sizeof *hdr) != sizeof *hdr) {
+ if (read_io(fd, hdr, sizeof *hdr) != sizeof *hdr) {
debug("Can't read Linux header\n");
return 0;
}
@@ -192,8 +211,8 @@
printf("Found Linux");
if (hdr->protocol_version >= 0x200 && hdr->kver_addr) {
char kver[256];
- file_seek(hdr->kver_addr + 0x200);
- if (lfile_read(kver, sizeof kver) != 0) {
+ seek_io(fd, hdr->kver_addr + 0x200);
+ if (read_io(fd, kver, sizeof kver) != 0) {
kver[255] = 0;
printf(" version %s", kver);
}
@@ -413,7 +432,7 @@
if (hdr->setup_sects == 0)
hdr->setup_sects = 4;
kern_offset = (hdr->setup_sects + 1) * 512;
- file_seek(kern_offset);
+ seek_io(fd, kern_offset);
kern_size = file_size() - kern_offset;
debug("offset=%#x addr=%#x size=%#x\n", kern_offset, kern_addr, kern_size);
@@ -426,7 +445,7 @@
#endif
printf("Loading kernel... ");
- if (lfile_read(phys_to_virt(kern_addr), kern_size) != kern_size) {
+ if (read_io(fd, phys_to_virt(kern_addr), kern_size) != kern_size) {
printf("Can't read kernel\n");
return 0;
}
@@ -443,7 +462,8 @@
uint64_t forced;
extern char _start[], _end[];
- if (!file_open(initrd_file)) {
+ fd = open_io(initrd_file);
+ if (!fd) {
printf("Can't open initrd: %s\n", initrd_file);
return -1;
}
@@ -500,7 +520,7 @@
}
printf("Loading initrd... ");
- if (lfile_read(phys_to_virt(start), size) != size) {
+ if (read_io(fd, phys_to_virt(start), size) != size) {
printf("Can't read initrd\n");
return -1;
}
@@ -509,6 +529,8 @@
params->initrd_start = start;
params->initrd_size = size;
+ close_io(fd);
+
return 0;
}
@@ -612,7 +634,8 @@
uint32_t kern_addr, kern_size;
char *initrd_file = NULL;
- if (!file_open(file))
+ fd = open_io(file);
+ if (!fd)
return -1;
kern_addr = load_linux_header(&hdr);
1
0
Hi folks,
With my attempt to figure out why the PPC builds aren't working, I've
spent a little more time working on improving the error reporting in
forthstrap. Having had more of an insight as to how forthstrap works, I
figured it might be useful to share my notes on how the process works.
Tracing through the code, I now realise why my first attempt at locating
errors didn't work very well. It seems that forthstrap
(kernel/bootstrap.c) actually has two different modes depending upon
whether a base dictionary is supplied on the command line or not.
- If no base dictionary is supplied, then the input source files are
compiled using the C implementation of the forth interpreter realised by
the interpret_source() function.
- If a base dictionary is supplied, load the base dictionary from disk
and invoke the initialize word in order to run the forth kernel.
From the Makefile it is possible to see that the first time forthstrap
is invoked, no base dictionary is supplied and so a dictionary
containing a basic Forth interpreter is built using the C interpreter
implementation in kernel/bootstrap.c.
On subsequent calls to forthstrap, the previous dictionary is passed in
as a base dictionary. forthstrap loads the dictionary and invokes the
initialize word to run the Forth interpreter. The important part is the
#ifdef...#endif section in kernel/forth.c for the "key" word. What this
does is override the default I/O functions so that the contents of each
input file passed on the command line are piped into the kernel one
character at a time.
By adding a new switch to forthstrap and trapping the "emit" word in a
similar way, it is possible to redirect the console output to a separate
file for debugging purposes. Hence I've added a -c switch to forthstrap
and altered the build system so that for a given base dictionary
foo.dict, a new file call foo.dict-console.log is automatically
generated which shows the Forth words being piped into the kernel.
With these changes in place, the ability to debug a broken build is
considerably increased. Now when I try and build one of the broken PPC
builds (in this case pearpc), I get the following in SVN trunk:
Configuring OpenBIOS on amd64 for cross-ppc
Initializing build tree obj-ppc...ok.
Creating target Makefile...ok.
Creating config files...ok.
Building OpenBIOS for ppc
Building...error:
make[1]: Entering directory
`/home/build/src/openbios/openbios-devel.pre/obj-ppc'
GEN target/include/openbios-version.h
GEN forth/version.fs
HOSTCC host/kernel/bootstrap.o
HOSTCC host/kernel/dict.o
HOSTCC host/kernel/primitives.o
HOSTCC host/kernel/stack.o
HOSTCC forthstrap
GEN bootstrap.dict
GEN openbios.dict
GEN openbios-pearpc.dict
../arch/ppc/pearpc/tree.fs:64: no such device.
make[1]: *** [openbios-pearpc.dict] Error 1
make[1]: Leaving directory
`/home/build/src/openbios/openbios-devel.pre/obj-ppc'
make: *** [build] Error 1
Surely enough, at the end of line 63 in arch/ppc/pearpc/tree.fs we see
the following:
" /pci" find-device
Hence it seems as if no /pci node is being created which is breaking the
pearpc build. And just to confirm this, the last few lines of
openbios-pearpc.dict-console.log look like this:
build@zeno:~/src/openbios/openbios-devel.pre$ tail -n 5
obj-ppc/openbios-pearpc.dict-console.log
0 > h# 88201 encode-int " cpu-version" property ok
0 > 0 encode-int " reg" property ok
0 > finish-device ok
0 > ok
0 > " /pci" find-device
Now I've got things to the point where the error reporting works well,
I'll get back to finishing up my loader consolidation patch...
ATB,
Mark.
--
Mark Cave-Ayland - Senior Technical Architect
PostgreSQL - PostGIS
Sirius Corporation plc - control through freedom
http://www.siriusit.co.uk
t: +44 870 608 0063
Sirius Labs: http://www.siriusit.co.uk/labs
1
0
[commit] r706 - in trunk/openbios-devel: config/xml include/kernel kernel
by repository service March 25, 2010
by repository service March 25, 2010
March 25, 2010
Author: mcayland
Date: Thu Mar 25 22:14:00 2010
New Revision: 706
URL: http://tracker.coreboot.org/trac/openbios/changeset/706
Log:
Revert the parts of the last commit which changed the exception function to use an exception pointer as it isn't really
required. Update forthstrap to add a new -c option that when specified will direct the Forth kernel console output to a file
and integrate this into the build system. By default, when a dictionary is built using a base dictionary then a new log file
called <dict>-console.log will be generated to help debugging if the build fails.
Also update the exception handler in kernel/bootstrap.c so that it matches the entire range of error codes in
forth/bootstrap/interpreter.fs.
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland(a)siriusit.co.uk>
Modified:
trunk/openbios-devel/config/xml/dictionary.xsl
trunk/openbios-devel/include/kernel/kernel.h
trunk/openbios-devel/kernel/bootstrap.c
trunk/openbios-devel/kernel/forth.c
trunk/openbios-devel/kernel/internal.c
Modified: trunk/openbios-devel/config/xml/dictionary.xsl
==============================================================================
--- trunk/openbios-devel/config/xml/dictionary.xsl Wed Mar 24 12:49:41 2010 (r705)
+++ trunk/openbios-devel/config/xml/dictionary.xsl Thu Mar 25 22:14:00 2010 (r706)
@@ -129,6 +129,7 @@
<xsl:if test="$init!=''">
<xsl:text> -d $(ODIR)/</xsl:text><xsl:value-of select="$init"/><xsl:text>.dict</xsl:text>
</xsl:if>
+ <xsl:text> -c $(a)-console.log</xsl:text>
<xsl:text> $(</xsl:text>
<xsl:value-of select="@name"/>
<xsl:text>-DICTIONARY)," GEN $(TARGET_DIR)$@") </xsl:text>
Modified: trunk/openbios-devel/include/kernel/kernel.h
==============================================================================
--- trunk/openbios-devel/include/kernel/kernel.h Wed Mar 24 12:49:41 2010 (r705)
+++ trunk/openbios-devel/include/kernel/kernel.h Thu Mar 25 22:14:00 2010 (r706)
@@ -34,12 +34,13 @@
extern void modules_init( void );
/* arch kernel hooks */
-extern void (*exception)(cell no);
+extern void exception(cell no);
#ifdef FCOMPILER
extern void include_file( const char *str );
extern void encode_file( const char *str );
extern int get_inputbyte( void );
+extern void put_outputbyte( int c );
#endif
#ifndef BOOTSTRAP
Modified: trunk/openbios-devel/kernel/bootstrap.c
==============================================================================
--- trunk/openbios-devel/kernel/bootstrap.c Wed Mar 24 12:49:41 2010 (r705)
+++ trunk/openbios-devel/kernel/bootstrap.c Thu Mar 25 22:14:00 2010 (r706)
@@ -54,6 +54,9 @@
static char *srcbasedict;
+/* console variables */
+static FILE *console;
+
#ifdef NATIVE_BITWIDTH_SMALLER_THAN_HOST_BITWIDTH
unsigned long base_address;
#endif
@@ -487,14 +490,42 @@
/*
- * Common Forth exception handler
+ * Forth exception handler
*/
-static void exception_common(cell no)
+void exception(cell no)
{
+ printk("%s:%d: ", srcfilenames[cursrc - 1], srclines[cursrc - 1]);
+
+ /* See also forth/bootstrap/interpreter.fs */
switch (no) {
+ case -1:
+ case -2:
+ printk("Aborted.\n");
+ break;
+ case -3:
+ printk("Stack Overflow.\n");
+ break;
+ case -4:
+ printk("Stack Underflow.\n");
+ break;
+ case -5:
+ printk("Return Stack Overflow.\n");
+ break;
+ case -6:
+ printk("Return Stack Underflow.\n");
+ break;
case -19:
- printk(" undefined word.\n");
+ printk("undefined word.\n");
+ break;
+ case -21:
+ printk("out of memory.\n");
+ break;
+ case -33:
+ printk("undefined method.\n");
+ break;
+ case -34:
+ printk("no such device.\n");
break;
default:
printk("error %" FMT_CELL_d " occured.\n", no);
@@ -504,30 +535,6 @@
/*
- * Exception handler for run_dictionary()
- */
-
-static void exception_run_dictionary(cell no)
-{
- printk("Error executing base dictionary %s: ", srcbasedict);
-
- exception_common(no);
-}
-
-
-/*
- * Exception handler for interpret_source()
- */
-
-static void exception_interpret_source(cell no)
-{
- printk("%s:%d: ", srcfilenames[cursrc - 1], srclines[cursrc - 1]);
-
- exception_common(no);
-}
-
-
-/*
* This is the C version of the forth interpreter
*/
@@ -548,9 +555,6 @@
exit(1);
}
- /* Set up exception handler for this invocation (allows better error reporting) */
- exception = exception_interpret_source;
-
/* FIXME: We should read this file at
* once. No need to get it char by char
*/
@@ -731,7 +735,7 @@
if (*test != 0) {
/* what is it?? */
- printk("%s:%d - %s is not defined.\n\n", srcfilenames[cursrc - 1], srclines[cursrc - 1], tib);
+ printk("%s:%d: %s is not defined.\n\n", srcfilenames[cursrc - 1], srclines[cursrc - 1], tib);
errors++;
#ifdef CONFIG_DEBUG_INTERPRETER
continue;
@@ -844,14 +848,27 @@
}
tmp = getc( srcfiles[cursrc-1] );
- if (tmp != EOF)
+
+ /* Update current line number */
+ if (tmp == '\n') {
+ srclines[cursrc - 1]++;
+ }
+
+ if (tmp != EOF) {
return tmp;
+ }
fclose(srcfiles[--cursrc]);
return get_inputbyte();
}
+void put_outputbyte( int c )
+{
+ if (console)
+ fputc(c, console);
+}
+
/*
* segmentation fault handler. linux specific?
*/
@@ -951,7 +968,7 @@
}
-static void run_dictionary(char *basedict)
+static void run_dictionary(char *basedict, char *confile)
{
if(!basedict)
return;
@@ -978,11 +995,17 @@
if (verbose)
printk("Jumping to dictionary %s...\n", basedict);
- /* Set up exception handler for this invocation (allows better error reporting) */
- exception = exception_run_dictionary;
+ /* If a console file has been specified, open it */
+ if (confile)
+ console = fopen(confile, "w");
+
srcbasedict = basedict;
enterforth((xt_t)PC);
+
+ /* Close the console file */
+ if (console)
+ fclose(console);
}
static void new_dictionary(const char *source)
@@ -1015,6 +1038,8 @@
" use this dictionary as base\n" \
" -D|--target-dictionary output.dict\n" \
" write to output.dict\n" \
+ " -c|--console output.log\n" \
+ " write kernel console output to log file\n" \
" -s|--segfault install segfault handler\n\n"
#else
#define USAGE "Usage: %s [options] [dictionary file|source file]\n\n" \
@@ -1026,6 +1051,8 @@
" use this dictionary as base\n" \
" -D output.dict\n" \
" write to output.dict\n" \
+ " -c output.log\n" \
+ " write kernel console output to log file\n" \
" -s install segfault handler\n\n"
#endif
@@ -1037,11 +1064,12 @@
unsigned char *ressources=NULL; /* All memory used by us */
char *dictname = NULL;
char *basedict = NULL;
+ char *consolefile = NULL;
unsigned char *bootstrapdict[2];
int c, cnt;
- const char *optstring = "VvhsI:d:D:?";
+ const char *optstring = "VvhsI:d:D:c:?";
while (1) {
#ifdef __GLIBC__
@@ -1054,6 +1082,7 @@
{"include", 1, NULL, 'I'},
{"source-dictionary", 1, NULL, 'd'},
{"target-dictionary", 1, NULL, 'D'},
+ {"console", 1, NULL, 'c'},
};
/*
@@ -1093,11 +1122,17 @@
if (!basedict) {
basedict = optarg;
}
+ break;
case 'D':
if(!dictname) {
dictname = optarg;
}
break;
+ case 'c':
+ if (!consolefile) {
+ consolefile = optarg;
+ }
+ break;
default:
return 1;
}
@@ -1176,7 +1211,7 @@
for (c=argc-1; c>=optind; c--)
include_file(argv[c]);
- run_dictionary(basedict);
+ run_dictionary(basedict, consolefile);
}
if(errors)
break;
Modified: trunk/openbios-devel/kernel/forth.c
==============================================================================
--- trunk/openbios-devel/kernel/forth.c Wed Mar 24 12:49:41 2010 (r705)
+++ trunk/openbios-devel/kernel/forth.c Thu Mar 25 22:14:00 2010 (r706)
@@ -860,11 +860,11 @@
static void emit(void)
{
-#ifndef FCOMPILER
cell tmp = POP();
+#ifndef FCOMPILER
putchar(tmp);
#else
- (void) POP();
+ put_outputbyte(tmp);
#endif
}
Modified: trunk/openbios-devel/kernel/internal.c
==============================================================================
--- trunk/openbios-devel/kernel/internal.c Wed Mar 24 12:49:41 2010 (r705)
+++ trunk/openbios-devel/kernel/internal.c Thu Mar 25 22:14:00 2010 (r706)
@@ -25,10 +25,6 @@
ucell PC;
volatile int interruptforth = 0;
-#ifdef FCOMPILER
-void (*exception)(cell no) = NULL;
-#endif
-
#define DEBUG_MODE_NONE 0
#define DEBUG_MODE_STEP 1
#define DEBUG_MODE_TRACE 2
1
0
Hi all,
I've spent some time today looking at the ELF loader code for each
different architecture, and with a bit of work I believe that I can
modify arch/sparc64/elfload.c so that it can be used across all
architectures.
Looking closer at the source, it can be seen that are actually two sets
of ELF routines: one in arch/*/elfload.c, and another set in
libopenbios/elfload.c which only appears to be used by the PPC code.
I've already manage to refactor the SPARC64 code so it reuses (and also
exposes) the same API for use with the PPC code, except with one
exception: file handles.
In arch/*/elfload.c, the preferred method for using handles is to make
use of the included loadfs.c methods which works with an implicit file
handle (i.e. the file handle isn't passed into any of the functions). In
contrast, the PPC code directly calls the *_io() API (see
find_elf()/elf_readhdrs()) and so requires an explicit file handle to be
passed into each function.
I'm currently leaning towards the PPC method, since loadfs.c seems to be
such a lightweight wrapper that it hardly seems worth keeping. Can
anyone see a reason to keep this before I go and rip it out?
ATB,
Mark.
--
Mark Cave-Ayland - Senior Technical Architect
PostgreSQL - PostGIS
Sirius Corporation plc - control through freedom
http://www.siriusit.co.uk
t: +44 870 608 0063
Sirius Labs: http://www.siriusit.co.uk/labs
4
12
March 24, 2010
Author: mcayland
Date: Wed Mar 24 12:49:41 2010
New Revision: 705
URL: http://tracker.coreboot.org/trac/openbios/changeset/705
Log:
Change the sysdebug exception() callback so that it is now a function pointer, rather than a function. This enables us to setup an appropriate exception handler
for the task in hand; in particular it allows us to distinguish between an error that occurs when attempting to execute a base dictionary, and an error that
occurs when interpreting source.
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland(a)siriusit.co.uk>
Modified:
trunk/openbios-devel/include/kernel/kernel.h
trunk/openbios-devel/kernel/bootstrap.c
trunk/openbios-devel/kernel/internal.c
Modified: trunk/openbios-devel/include/kernel/kernel.h
==============================================================================
--- trunk/openbios-devel/include/kernel/kernel.h Wed Mar 24 11:28:51 2010 (r704)
+++ trunk/openbios-devel/include/kernel/kernel.h Wed Mar 24 12:49:41 2010 (r705)
@@ -34,7 +34,7 @@
extern void modules_init( void );
/* arch kernel hooks */
-extern void exception(cell no);
+extern void (*exception)(cell no);
#ifdef FCOMPILER
extern void include_file( const char *str );
Modified: trunk/openbios-devel/kernel/bootstrap.c
==============================================================================
--- trunk/openbios-devel/kernel/bootstrap.c Wed Mar 24 11:28:51 2010 (r704)
+++ trunk/openbios-devel/kernel/bootstrap.c Wed Mar 24 12:49:41 2010 (r705)
@@ -52,6 +52,8 @@
static int srclines[MAX_SRC_FILES];
static unsigned int cursrc = 0;
+static char *srcbasedict;
+
#ifdef NATIVE_BITWIDTH_SMALLER_THAN_HOST_BITWIDTH
unsigned long base_address;
#endif
@@ -485,6 +487,47 @@
/*
+ * Common Forth exception handler
+ */
+
+static void exception_common(cell no)
+{
+ switch (no) {
+ case -19:
+ printk(" undefined word.\n");
+ break;
+ default:
+ printk("error %" FMT_CELL_d " occured.\n", no);
+ }
+ exit(1);
+}
+
+
+/*
+ * Exception handler for run_dictionary()
+ */
+
+static void exception_run_dictionary(cell no)
+{
+ printk("Error executing base dictionary %s: ", srcbasedict);
+
+ exception_common(no);
+}
+
+
+/*
+ * Exception handler for interpret_source()
+ */
+
+static void exception_interpret_source(cell no)
+{
+ printk("%s:%d: ", srcfilenames[cursrc - 1], srclines[cursrc - 1]);
+
+ exception_common(no);
+}
+
+
+/*
* This is the C version of the forth interpreter
*/
@@ -505,6 +548,9 @@
exit(1);
}
+ /* Set up exception handler for this invocation (allows better error reporting) */
+ exception = exception_interpret_source;
+
/* FIXME: We should read this file at
* once. No need to get it char by char
*/
@@ -862,20 +908,6 @@
PUSH(pointer2cell(memory) + MEMORY_SIZE-1);
}
-void exception(cell no)
-{
- printk("%s:%d: ", srcfilenames[cursrc - 1], srclines[cursrc - 1]);
-
- switch (no) {
- case -19:
- printk(" undefined word.\n");
- break;
- default:
- printk("error %" FMT_CELL_d " occured.\n", no);
- }
- exit(1);
-}
-
void
include_file( const char *name )
@@ -927,8 +959,12 @@
read_dictionary(basedict);
PC = (ucell)findword("initialize");
- if (!PC)
+ if (!PC) {
+ if (verbose) {
+ printk("Unable to find initialize word in dictionary %s; ignoring\n", basedict);
+ }
return;
+ }
if(!srcfiles[0]) {
cursrc = 1;
@@ -940,7 +976,11 @@
init_memory();
if (verbose)
- printk("Jumping to dictionary...");
+ printk("Jumping to dictionary %s...\n", basedict);
+
+ /* Set up exception handler for this invocation (allows better error reporting) */
+ exception = exception_run_dictionary;
+ srcbasedict = basedict;
enterforth((xt_t)PC);
}
Modified: trunk/openbios-devel/kernel/internal.c
==============================================================================
--- trunk/openbios-devel/kernel/internal.c Wed Mar 24 11:28:51 2010 (r704)
+++ trunk/openbios-devel/kernel/internal.c Wed Mar 24 12:49:41 2010 (r705)
@@ -25,6 +25,10 @@
ucell PC;
volatile int interruptforth = 0;
+#ifdef FCOMPILER
+void (*exception)(cell no) = NULL;
+#endif
+
#define DEBUG_MODE_NONE 0
#define DEBUG_MODE_STEP 1
#define DEBUG_MODE_TRACE 2
1
0
Author: mcayland
Date: Wed Mar 24 11:28:51 2010
New Revision: 704
URL: http://tracker.coreboot.org/trac/openbios/changeset/704
Log:
Add source file and line number tracking to forthstrap to allow the user to locate forth errors much more easily. An example of the new output is given below:
build@zeno:~/src/openbios/openbios-devel.pre$ ./config/scripts/switch-arch cross-ppc; make
Configuring OpenBIOS on amd64 for cross-ppc
Initializing build tree obj-ppc...ok.
Creating target Makefile...ok.
Creating config files...ok.
Building OpenBIOS for ppc
Building...error:
HOSTCC host/kernel/stack.o
HOSTCC forthstrap
GEN bootstrap.dict
bootstrap.fs:339 - foo is not defined.
Modified:
trunk/openbios-devel/kernel/bootstrap.c
Modified: trunk/openbios-devel/kernel/bootstrap.c
==============================================================================
--- trunk/openbios-devel/kernel/bootstrap.c Wed Mar 17 23:20:12 2010 (r703)
+++ trunk/openbios-devel/kernel/bootstrap.c Wed Mar 24 11:28:51 2010 (r704)
@@ -29,6 +29,7 @@
#include "cross.h"
#include "openbios-version.h"
+#define MAX_PATH_LEN 256
#define MEMORY_SIZE (1024*1024) /* 1M ram for hosted system */
#define DICTIONARY_SIZE (256*1024) /* 256k for the dictionary */
@@ -44,7 +45,11 @@
static int segfault = 0;
static int verbose = 0;
-static FILE *srcfiles[128];
+#define MAX_SRC_FILES 128
+
+static FILE *srcfiles[MAX_SRC_FILES];
+static char *srcfilenames[MAX_SRC_FILES];
+static int srclines[MAX_SRC_FILES];
static unsigned int cursrc = 0;
#ifdef NATIVE_BITWIDTH_SMALLER_THAN_HOST_BITWIDTH
@@ -292,8 +297,13 @@
while (!feof(f)) {
c = getc(f);
- if (c == ' ' || c == '\t' || c == '\n')
+ if (c == ' ' || c == '\t')
+ continue;
+
+ if (c == '\n') {
+ srclines[cursrc - 1]++;
continue;
+ }
ungetc(c, f);
break;
@@ -309,7 +319,7 @@
static int parse(FILE * f, char *line, char delim)
{
- int cnt = 0, c;
+ int cnt = 0, c = 0;
while (!feof(f)) {
c = getc(f);
@@ -317,12 +327,17 @@
if (delim && c == delim)
break;
- if ((!delim) && (c == ' ' || c == '\n' || c == '\t'))
+ if ((!delim) && (c == ' ' || c == '\t' || c == '\n'))
break;
line[cnt++] = c;
}
+ /* Update current line number */
+ if (c == '\n') {
+ srclines[cursrc - 1]++;
+ }
+
line[cnt] = 0;
return cnt;
@@ -442,21 +457,33 @@
static FILE *fopen_include(const char *fil)
{
-#define MAX_PATH_LEN 256
char fullpath[MAX_PATH_LEN];
FILE *ret;
include *incl = &includes;
while (incl) {
snprintf(fullpath, sizeof(fullpath), "%s/%s", incl->path, fil);
+
ret = fopen(fullpath, "r");
- if (ret != NULL)
+ if (ret != NULL) {
+
+#ifdef CONFIG_DEBUG_INTERPRETER
+ printk("Including '%s'\n", name );
+#endif
+ srcfilenames [ cursrc ] = malloc(strlen(fil) + 1);
+ strcpy(srcfilenames[ cursrc ], fil);
+ srclines [ cursrc ] = 1;
+ srcfiles [ cursrc++ ] = ret;
+
return ret;
+ }
+
incl = incl->next;
}
return NULL;
}
+
/*
* This is the C version of the forth interpreter
*/
@@ -658,7 +685,7 @@
if (*test != 0) {
/* what is it?? */
- printk("%s is not defined.\n\n", tib);
+ printk("%s:%d - %s is not defined.\n\n", srcfilenames[cursrc - 1], srclines[cursrc - 1], tib);
errors++;
#ifdef CONFIG_DEBUG_INTERPRETER
continue;
@@ -680,7 +707,9 @@
writecell(num);
}
}
+
fclose(f);
+ cursrc--;
return 0;
}
@@ -753,7 +782,8 @@
ungetc(tmp, srcfiles[cursrc-1]);
return -1;
}
- fclose( srcfiles[--cursrc] );
+
+ fclose(srcfiles[--cursrc]);
return availchar();
}
@@ -770,7 +800,8 @@
tmp = getc( srcfiles[cursrc-1] );
if (tmp != EOF)
return tmp;
- fclose( srcfiles[--cursrc] );
+
+ fclose(srcfiles[--cursrc]);
return get_inputbyte();
}
@@ -833,12 +864,14 @@
void exception(cell no)
{
+ printk("%s:%d: ", srcfilenames[cursrc - 1], srclines[cursrc - 1]);
+
switch (no) {
case -19:
printk(" undefined word.\n");
break;
default:
- printk("\nError %" FMT_CELL_d " occured.\n", no);
+ printk("error %" FMT_CELL_d " occured.\n", no);
}
exit(1);
}
@@ -847,21 +880,21 @@
void
include_file( const char *name )
{
- FILE *file = fopen_include( name );
- if( !file ) {
- printk("\npanic: Failed opening '%s'\n", name );
- exit(1);
- }
+ FILE *file;
+
if( cursrc >= sizeof(srcfiles)/sizeof(srcfiles[0]) ) {
printk("\npanic: Maximum include depth reached!\n");
exit(1);
}
-#ifdef CONFIG_DEBUG_INTERPRETER
- printk("Including '%s'\n", name );
-#endif
- srcfiles[ cursrc++ ] = file;
+
+ file = fopen_include( name );
+ if( !file ) {
+ printk("\npanic: Failed opening file '%s'\n", name );
+ exit(1);
+ }
}
+
void
encode_file( const char *name )
{
1
0
Or is it just some kind of routing issue? I seem to get intermittent
pings but no website.
ATB,
Mark.
--
Mark Cave-Ayland - Senior Technical Architect
PostgreSQL - PostGIS
Sirius Corporation plc - control through freedom
http://www.siriusit.co.uk
t: +44 870 608 0063
Sirius Labs: http://www.siriusit.co.uk/labs
2
2
> Programmingkid wrote:
>
>> I have recently been able to go further in the build process of OpenBIOS thanks to recent changes. It stop building after forthstrap is made.
>>
>> Here is the error:
>>
>> HOSTCC forthstrap
>> GEN bootstrap.dict
>> panic: segmentation violation at 0x30061c
>> dict=0x100300000 here=0x100300628(dict+0x628) pc=0x0(dict+0xffd00000)
>> dstackcnt=0 rstackcnt=0 instruction=deadbeef
>> dstack: 0x0
>> rstack: 0x0
>> Writing dictionary core file
>> make[1]: *** [bootstrap.dict] Error 1
>>
>> Anyone know how to fix this problem or know what is causing the problem?
>
> Oh really? I didn't realise that an OS X host build was broken, but it's
> good to hear that at least you can get a bit further now. Is this from a
> vanilla SVN checkout? The only reason I ask is that when I was working
> on code patches in forth/bootstrap/bootstrap.fs, it was fairly easy to
> cause forthstrap to segfault due to coding errors.
I always download the "most current snapshot". I never use the SVN checkout.
1
0
I have recently been able to go further in the build process of OpenBIOS thanks to recent changes. It stop building after forthstrap is made.
Here is the error:
HOSTCC forthstrap
GEN bootstrap.dict
panic: segmentation violation at 0x30061c
dict=0x100300000 here=0x100300628(dict+0x628) pc=0x0(dict+0xffd00000)
dstackcnt=0 rstackcnt=0 instruction=deadbeef
dstack: 0x0
rstack: 0x0
Writing dictionary core file
make[1]: *** [bootstrap.dict] Error 1
Anyone know how to fix this problem or know what is causing the problem?
2
1