[OpenBIOS] r278 - openbios-devel/arch/sparc32
svn at openbios.org
svn at openbios.org
Mon Dec 1 19:04:16 CET 2008
Author: blueswirl
Date: 2008-12-01 19:04:16 +0100 (Mon, 01 Dec 2008)
New Revision: 278
Modified:
openbios-devel/arch/sparc32/aoutload.c
openbios-devel/arch/sparc32/boot.c
openbios-devel/arch/sparc32/boot.h
openbios-devel/arch/sparc32/romvec.c
Log:
Fix NetBSD booting
Modified: openbios-devel/arch/sparc32/aoutload.c
===================================================================
--- openbios-devel/arch/sparc32/aoutload.c 2008-11-30 13:44:38 UTC (rev 277)
+++ openbios-devel/arch/sparc32/aoutload.c 2008-12-01 18:04:16 UTC (rev 278)
@@ -57,22 +57,19 @@
int image_retval;
struct exec ehdr;
unsigned long start, size;
- unsigned int offset;
+ unsigned int offset = 512;
image_name = image_version = NULL;
if (!file_open(filename))
goto out;
- for (offset = 0; offset < 16 * 512; offset += 512) {
- file_seek(offset);
- if (lfile_read(&ehdr, sizeof ehdr) != sizeof ehdr) {
- debug("Can't read a.out header\n");
- retval = LOADER_NOT_SUPPORT;
- goto out;
- }
- if (!N_BADMAG(ehdr))
- break;
+ file_seek(offset);
+
+ if (lfile_read(&ehdr, sizeof ehdr) != sizeof ehdr) {
+ debug("Can't read a.out header\n");
+ retval = LOADER_NOT_SUPPORT;
+ goto out;
}
if (N_BADMAG(ehdr)) {
Modified: openbios-devel/arch/sparc32/boot.c
===================================================================
--- openbios-devel/arch/sparc32/boot.c 2008-11-30 13:44:38 UTC (rev 277)
+++ openbios-devel/arch/sparc32/boot.c 2008-12-01 18:04:16 UTC (rev 278)
@@ -20,6 +20,18 @@
uint32_t cmdline_size;
char boot_device;
+static void try_path(const char *path, char *param, const void *romvec)
+{
+ push_str(path);
+ fword("pathres-resolve-aliases");
+ bootpath = pop_fstr_copy();
+ printk("Trying %s (%s)\n", path, bootpath);
+
+ elf_load(&sys_info, path, param, romvec);
+ linux_load(&sys_info, path, param);
+ aout_load(&sys_info, path, romvec);
+}
+
void boot(void)
{
char *path = pop_fstr_copy(), *param, *oldpath = path;
@@ -87,7 +99,7 @@
obp_arg.argv[1] = param;
}
- romvec = init_openprom(qemu_mem_size, path);
+ romvec = init_openprom(qemu_mem_size);
if (kernel_size) {
int (*entry)(const void *romvec_ptr, int p2, int p3, int p4, int p5);
@@ -103,20 +115,17 @@
else
printk("without parameters.\n");
- if (elf_load(&sys_info, path, param, romvec) == LOADER_NOT_SUPPORT)
- if (linux_load(&sys_info, path, param) == LOADER_NOT_SUPPORT)
- if (aout_load(&sys_info, path, romvec) == LOADER_NOT_SUPPORT) {
+ try_path(path, param, romvec);
- snprintf(altpath, sizeof(altpath), "%s:d", path);
+ push_str(path);
+ PUSH(':');
+ fword("left-split");
+ snprintf(altpath, sizeof(altpath), "%s:d", pop_fstr_copy());
+ POP();
+ POP();
- if (elf_load(&sys_info, altpath, param, romvec)
- == LOADER_NOT_SUPPORT)
- if (linux_load(&sys_info, altpath, param)
- == LOADER_NOT_SUPPORT)
- if (aout_load(&sys_info, altpath, romvec)
- == LOADER_NOT_SUPPORT)
- printk("Unsupported image format\n");
- }
+ try_path(altpath, param, romvec);
+ printk("Unsupported image format\n");
free(path);
}
Modified: openbios-devel/arch/sparc32/boot.h
===================================================================
--- openbios-devel/arch/sparc32/boot.h 2008-11-30 13:44:38 UTC (rev 277)
+++ openbios-devel/arch/sparc32/boot.h 2008-12-01 18:04:16 UTC (rev 278)
@@ -24,10 +24,11 @@
unsigned int start_elf(unsigned long entry_point, unsigned long param);
// romvec.c
-void *init_openprom(unsigned long memsize, const char *path);
+void *init_openprom(unsigned long memsize);
// boot.c
extern struct sys_info sys_info;
+extern const char *bootpath;
void boot(void);
// sys_info.c
Modified: openbios-devel/arch/sparc32/romvec.c
===================================================================
--- openbios-devel/arch/sparc32/romvec.c 2008-11-30 13:44:38 UTC (rev 277)
+++ openbios-devel/arch/sparc32/romvec.c 2008-12-01 18:04:16 UTC (rev 278)
@@ -49,7 +49,7 @@
static int obp_devseek(int dev_desc, int hi, int lo);
struct linux_arguments_v0 obp_arg;
-static const char *bootpath;
+const char *bootpath;
static const struct linux_arguments_v0 * const obp_argp = &obp_arg;
static void (*sync_hook)(void);
@@ -501,7 +501,7 @@
}
void *
-init_openprom(unsigned long memsize, const char *path)
+init_openprom(unsigned long memsize)
{
ptphys = totphys;
ptmap = totmap;
@@ -559,9 +559,6 @@
romvec0.pv_v2devops.v2_dev_write = obp_devwrite;
romvec0.pv_v2devops.v2_dev_seek = obp_devseek;
- push_str(path);
- fword("pathres-resolve-aliases");
- bootpath = pop_fstr_copy();
romvec0.pv_v2bootargs.bootpath = &bootpath;
romvec0.pv_v2bootargs.bootargs = &obp_arg.argv[1];
More information about the OpenBIOS
mailing list