[OpenBIOS] [commit] r1106 - trunk/openbios-devel/arch/ppc/qemu
repository service
svn at openbios.org
Fri Apr 5 11:35:17 CEST 2013
Author: mcayland
Date: Fri Apr 5 11:35:17 2013
New Revision: 1106
URL: http://tracker.coreboot.org/trac/openbios/changeset/1106
Log:
PPC: Add the old-world bootcode device dev:,%BOOT to the bootdevice list
By adding the bootcode device to the bootdevice list as processed by load,
we automatically attempt to invoke the bootcode loader as required.
As a consequence of this, we can now remove the separate C codepath used
in order to facilitate an old-world boot.
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland at ilande.co.uk>
CC: Alexander Graf <agraf at suse.de>
CC: Andreas Färber <afaerber at suse.de>
Modified:
trunk/openbios-devel/arch/ppc/qemu/init.c
trunk/openbios-devel/arch/ppc/qemu/main.c
Modified: trunk/openbios-devel/arch/ppc/qemu/init.c
==============================================================================
--- trunk/openbios-devel/arch/ppc/qemu/init.c Fri Apr 5 11:35:08 2013 (r1105)
+++ trunk/openbios-devel/arch/ppc/qemu/init.c Fri Apr 5 11:35:17 2013 (r1106)
@@ -855,7 +855,7 @@
}
/* Setup default boot devices */
- snprintf(buf, sizeof(buf), "%s:,\\\\:tbxi %s:,\\ppc\\bootinfo.txt", boot_path, boot_path);
+ snprintf(buf, sizeof(buf), "%s:,\\\\:tbxi %s:,\\ppc\\bootinfo.txt %s:,%%BOOT", boot_path, boot_path, boot_path);
push_str(buf);
fword("encode-string");
push_str("boot-device");
Modified: trunk/openbios-devel/arch/ppc/qemu/main.c
==============================================================================
--- trunk/openbios-devel/arch/ppc/qemu/main.c Fri Apr 5 11:35:08 2013 (r1105)
+++ trunk/openbios-devel/arch/ppc/qemu/main.c Fri Apr 5 11:35:17 2013 (r1106)
@@ -39,141 +39,6 @@
#define ELF_DPRINTF(fmt, args...) SUBSYS_DPRINTF("ELF", fmt, ##args)
#define NEWWORLD_DPRINTF(fmt, args...) SUBSYS_DPRINTF("NEWWORLD", fmt, ##args)
-static char *
-get_device( const char *path )
-{
- int i;
- static char buf[1024];
-
- for (i = 0; i < sizeof(buf) && path[i] && path[i] != ':'; i++)
- buf[i] = path[i];
- buf[i] = 0;
-
- return buf;
-}
-
-static int
-get_partition( const char *path )
-{
- while ( *path && *path != ':' )
- path++;
-
- if (!*path)
- return -1;
- path++;
-
- if (!strchr(path, ',')) /* check if there is a ',' */
- return -1;
-
- return atol(path);
-}
-
-static char *
-get_filename( const char * path , char **dirname)
-{
- static char buf[1024];
- char *filename;
-
- while ( *path && *path != ':' )
- path++;
-
- if (!*path) {
- *dirname = NULL;
- return NULL;
- }
- path++;
-
- while ( *path && isdigit(*path) )
- path++;
-
- if (*path == ',')
- path++;
-
- strncpy(buf, path, sizeof(buf));
- buf[sizeof(buf) - 1] = 0;
-
- filename = strrchr(buf, '\\');
- if (filename) {
- *dirname = buf;
- (*filename++) = 0;
- } else {
- *dirname = NULL;
- filename = buf;
- }
-
- return filename;
-}
-
-
-static void
-encode_bootpath( const char *spec, const char *args )
-{
- char path[1024];
- phandle_t chosen_ph = find_dev("/chosen");
- char *filename, *directory;
- int partition;
-
- if (spec)
- return;
-
- filename = get_filename(spec, &directory);
- partition = get_partition(spec);
- if (partition == -1)
- snprintf(path, sizeof(path), "%s:,%s\\%s", get_device(spec),
- directory, filename);
- else
- snprintf(path, sizeof(path), "%s:%d,%s\\%s", get_device(spec),
- partition, directory, filename);
-
- ELF_DPRINTF("bootpath %s bootargs %s\n", path, args);
- set_property( chosen_ph, "bootpath", path, strlen(path)+1 );
- if (args)
- set_property( chosen_ph, "bootargs", args, strlen(args)+1 );
-}
-
-#define OLDWORLD_BOOTCODE_BASEADDR (0x3f4000)
-
-static void
-oldworld_boot( void )
-{
- int fd;
- int len, total;
- const char *path = "hd:,%BOOT";
- char *bootcode;
-
- if ((fd = open_io(path)) == -1) {
- ELF_DPRINTF("Can't open %s\n", path);
- return;
- }
-
-
- total = 0;
- bootcode = (char*)OLDWORLD_BOOTCODE_BASEADDR;
- while(1) {
- if (seek_io(fd, total) == -1)
- break;
- len = read_io(fd, bootcode, 512);
- bootcode += len;
- total += len;
- }
-
- close_io( fd );
-
- if (total == 0) {
- ELF_DPRINTF("Can't read %s\n", path);
- return;
- }
-
- encode_bootpath(path, "Linux");
-
- if( ofmem_claim( OLDWORLD_BOOTCODE_BASEADDR, total, 0 ) == -1 )
- fatal_error("Claim failed!\n");
-
- call_elf(0, 0, OLDWORLD_BOOTCODE_BASEADDR);
-
- return;
-}
-
static void check_preloaded_kernel(void)
{
unsigned long kernel_image, kernel_size;
@@ -213,9 +78,5 @@
check_preloaded_kernel();
}
- if (boot_device == 'c') {
- oldworld_boot();
- }
-
update_nvram();
}
More information about the OpenBIOS
mailing list