ppcrcd/yaboot/yaboot.c
sparky
cvs at pld-linux.org
Sun Dec 25 18:58:27 CET 2005
Author: sparky
Date: Sun Dec 25 18:58:16 2005
New Revision: 6708
Modified:
ppcrcd/yaboot/yaboot.c
Log:
- spaces -> tabs; killed long lines
Modified: ppcrcd/yaboot/yaboot.c
==============================================================================
--- ppcrcd/yaboot/yaboot.c (original)
+++ ppcrcd/yaboot/yaboot.c Sun Dec 25 18:58:16 2005
@@ -1,25 +1,25 @@
/*
- * Yaboot - secondary boot loader for Linux on PowerPC.
+ * Yaboot - secondary boot loader for Linux on PowerPC.
*
* Copyright (C) 2001, 2002 Ethan Benson
*
* Copyright (C) 1999, 2000, 2001 Benjamin Herrenschmidt
- *
+ *
* IBM CHRP support
- *
+ *
* Copyright (C) 2001 Peter Bergner
*
* portions based on poof
- *
+ *
* Copyright (C) 1999 Marius Vollmer
- *
+ *
* portions based on quik
- *
+ *
* Copyright (C) 1996 Paul Mackerras.
- *
+ *
* Because this program is derived from the corresponding file in the
* silo-0.64 distribution, it is also
- *
+ *
* Copyright (C) 1996 Pete A. Zaitcev
* 1996 Maurizio Plaza
* 1996 David S. Miller
@@ -68,7 +68,7 @@
/* Addresses where the PPC32 and PPC64 vmlinux kernels are linked at.
* These are used to determine whether we are booting a vmlinux, in
- * which case, it will be loaded at KERNELADDR. Otherwise (eg zImage),
+ * which case, it will be loaded at KERNELADDR. Otherwise (eg zImage),
* we load the binary where it was linked at (ie, e_entry field in
* the ELF header).
*/
@@ -76,23 +76,20 @@
#define KERNEL_LINK_ADDR_PPC64 0xC000000000000000ULL
typedef struct {
- union {
- Elf32_Ehdr elf32hdr;
- Elf64_Ehdr elf64hdr;
- } elf;
- void* base;
- unsigned long memsize;
- unsigned long filesize;
- unsigned long offset;
- unsigned long load_loc;
- unsigned long entry;
+ union {
+ Elf32_Ehdr elf32hdr;
+ Elf64_Ehdr elf64hdr;
+ } elf;
+ void *base;
+ unsigned long memsize;
+ unsigned long filesize;
+ unsigned long offset;
+ unsigned long load_loc;
+ unsigned long entry;
} loadinfo_t;
-typedef void (*kernel_entry_t)( void *,
- unsigned long,
- prom_entry,
- unsigned long,
- unsigned long );
+typedef void (*kernel_entry_t)( void *, unsigned long, prom_entry,
+ unsigned long, unsigned long );
/* Imported functions */
extern unsigned long reloc_offset(void);
@@ -105,9 +102,9 @@
static int yaboot_main(void);
static int is_elf32(loadinfo_t *loadinfo);
static int is_elf64(loadinfo_t *loadinfo);
-static int load_elf32(struct boot_file_t *file, loadinfo_t *loadinfo);
-static int load_elf64(struct boot_file_t *file, loadinfo_t *loadinfo);
-static void setup_display(void);
+static int load_elf32(struct boot_file_t *file, loadinfo_t *loadinfo);
+static int load_elf64(struct boot_file_t *file, loadinfo_t *loadinfo);
+static void setup_display(void);
/* Locals & globals */
@@ -124,27 +121,27 @@
/* Color values for text ui */
static struct ansi_color_t {
- char* name;
- int index;
- int value;
+ char* name;
+ int index;
+ int value;
} ansi_color_table[] = {
- { "black", 2, 30 },
- { "blue", 0, 31 },
- { "green", 0, 32 },
- { "cyan", 0, 33 },
- { "red", 0, 34 },
- { "purple", 0, 35 },
- { "brown", 0, 36 },
- { "light-gray", 0, 37 },
- { "dark-gray", 1, 30 },
- { "light-blue", 1, 31 },
- { "light-green", 1, 32 },
- { "light-cyan", 1, 33 },
- { "light-red", 1, 34 },
- { "light-purple", 1, 35 },
- { "yellow", 1, 36 },
- { "white", 1, 37 },
- { NULL, 0, 0 },
+ { "black", 2, 30 },
+ { "blue", 0, 31 },
+ { "green", 0, 32 },
+ { "cyan", 0, 33 },
+ { "red", 0, 34 },
+ { "purple", 0, 35 },
+ { "brown", 0, 36 },
+ { "light-gray", 0, 37 },
+ { "dark-gray", 1, 30 },
+ { "light-blue", 1, 31 },
+ { "light-green", 1, 32 },
+ { "light-cyan", 1, 33 },
+ { "light-red", 1, 34 },
+ { "light-purple", 1, 35 },
+ { "yellow", 1, 36 },
+ { "white", 1, 37 },
+ { NULL, 0, 0 },
};
/* Default colors for text ui */
@@ -181,83 +178,82 @@
int
yaboot_start (unsigned long r3, unsigned long r4, unsigned long r5)
{
- int result;
- void* malloc_base = NULL;
- prom_handle root;
-
- /* OF seems to do it, but I'm not very confident */
- memset(&__bss_start, 0, &_end - &__bss_start);
-
- /* Check for quik first stage bootloader (but I don't think we are
- * compatible with it anyway, I'll look into backporting to older OF
- * versions later
- */
- if (r5 == 0xdeadbeef) {
- r5 = r3;
- quik_fip = (struct first_info *)r4;
- }
-
- /* Initialize OF interface */
- prom_init ((prom_entry) r5);
-
+ int result;
+ void* malloc_base = NULL;
+ prom_handle root;
+
+ /* OF seems to do it, but I'm not very confident */
+ memset(&__bss_start, 0, &_end - &__bss_start);
+
+ /* Check for quik first stage bootloader (but I don't think we are
+ * compatible with it anyway, I'll look into backporting to older OF
+ * versions later
+ */
+ if (r5 == 0xdeadbeef) {
+ r5 = r3;
+ quik_fip = (struct first_info *)r4;
+ }
+
+ /* Initialize OF interface */
+ prom_init ((prom_entry) r5);
+
#if 0
- /* Allocate some memory for malloc'ator */
- malloc_base = prom_claim((void *)MALLOCADDR, MALLOCSIZE, 0);
- if (malloc_base == (void *)-1) {
- prom_printf("Can't claim malloc buffer (%d bytes at 0x%08x)\n",
- MALLOCSIZE, MALLOCADDR);
- return -1;
- }
- malloc_init(malloc_base, MALLOCSIZE);
- DEBUG_F("Malloc buffer allocated at %p (%d bytes)\n",
- malloc_base, MALLOCSIZE);
+ /* Allocate some memory for malloc'ator */
+ malloc_base = prom_claim((void *)MALLOCADDR, MALLOCSIZE, 0);
+ if (malloc_base == (void *)-1) {
+ prom_printf("Can't claim malloc buffer (%d bytes at 0x%08x)\n",
+ MALLOCSIZE, MALLOCADDR);
+ return -1;
+ }
+ malloc_init(malloc_base, MALLOCSIZE);
+ DEBUG_F("Malloc buffer allocated at %p (%d bytes)\n",
+ malloc_base, MALLOCSIZE);
#endif
if ( __alloc_freelist_init() ) {
prom_printf("Can't claim malloc buffer (%d bytes at 0x%08x)\n",
MALLOCSIZE, MALLOCADDR);
return -1;
}
-
-
- /* A few useless DEBUG_F's */
- DEBUG_F("reloc_offset : %ld (should be 0)\n", reloc_offset());
- DEBUG_F("test_bss : %d (should be 0)\n", test_bss);
- DEBUG_F("test_data : %d (should be 0)\n", test_data);
- DEBUG_F("&test_data : %p\n", &test_data);
- DEBUG_F("&test_bss : %p\n", &test_bss);
- DEBUG_F("linked at : 0x%08x\n", TEXTADDR);
-
- /* ask the OF info if we're a chrp or pmac */
- /* we need to set _machine before calling finish_device_tree */
- root = prom_finddevice("/");
- if (root != 0) {
- static char model[256];
- if (prom_getprop(root, "device_type", model, 256 ) > 0 &&
- !strncmp("chrp", model, 4))
- _machine = _MACH_chrp;
- else {
- if (prom_getprop(root, "model", model, 256 ) > 0 &&
- !strncmp(model, "IBM", 3))
- _machine = _MACH_chrp;
- }
- }
-
- DEBUG_F("Running on _machine = %d\n", _machine);
- DEBUG_SLEEP;
-
- /* Call out main */
- result = yaboot_main();
-
- /* Get rid of malloc pool */
- prom_release(malloc_base, MALLOCSIZE);
- DEBUG_F("Malloc buffer released. Exiting with code %d\n",
- result);
-
- /* Return to OF */
- prom_exit();
-
- return result;
-
+
+
+ /* A few useless DEBUG_F's */
+ DEBUG_F("reloc_offset : %ld (should be 0)\n", reloc_offset());
+ DEBUG_F("test_bss : %d (should be 0)\n", test_bss);
+ DEBUG_F("test_data : %d (should be 0)\n", test_data);
+ DEBUG_F("&test_data : %p\n", &test_data);
+ DEBUG_F("&test_bss : %p\n", &test_bss);
+ DEBUG_F("linked at : 0x%08x\n", TEXTADDR);
+
+ /* ask the OF info if we're a chrp or pmac */
+ /* we need to set _machine before calling finish_device_tree */
+ root = prom_finddevice("/");
+ if (root != 0) {
+ static char model[256];
+ if (prom_getprop(root, "device_type", model, 256 ) > 0 &&
+ !strncmp("chrp", model, 4))
+ _machine = _MACH_chrp;
+ else {
+ if (prom_getprop(root, "model", model, 256 ) > 0 &&
+ !strncmp(model, "IBM", 3))
+ _machine = _MACH_chrp;
+ }
+ }
+
+ DEBUG_F("Running on _machine = %d\n", _machine);
+ DEBUG_SLEEP;
+
+ /* Call out main */
+ result = yaboot_main();
+
+ /* Get rid of malloc pool */
+ prom_release(malloc_base, MALLOCSIZE);
+ DEBUG_F("Malloc buffer released. Exiting with code %d\n", result);
+
+ /* Return to OF */
+ prom_exit();
+
+ return result;
+
}
#ifdef CONFIG_COLOR_TEXT
@@ -267,91 +263,93 @@
static int
check_color_text_ui(char *color)
{
- int i = 0;
- while(ansi_color_table[i].name) {
- if (!strcmp(color, ansi_color_table[i].name))
- return i;
- i++;
- }
- return -1;
-}
+ int i = 0;
+ while(ansi_color_table[i].name) {
+ if (!strcmp(color, ansi_color_table[i].name))
+ return i;
+ i++;
+ }
+ return -1;
+}
#endif /* CONFIG_COLOR_TEXT */
void print_message_file(char *filename, int paging)
{
- char *msg = NULL;
- char *p, *endp;
- char *defdev = boot.dev;
- int defpart = boot.part;
- char msgpath[1024];
- int opened = 0;
- int result = 0;
- int n;
- struct boot_file_t file;
- struct boot_fspec_t msgfile;
-
- defdev = cfg_get_strg(0, "device");
- if (!defdev)
- defdev = boot.dev;
- p = cfg_get_strg(0, "partition");
- if (p) {
- n = simple_strtol(p, &endp, 10);
- if (endp != p && *endp == 0)
- defpart = n;
- }
-
- strncpy(msgpath, filename, sizeof(msgpath));
- if (!parse_device_path(msgpath, defdev, defpart, "/etc/yaboot.msg", &msgfile)) {
- prom_printf("%s: Unable to parse\n", msgpath);
- goto done;
- }
-
- msg = malloc(2001 - paging * 1000); /* 2000 for not paged messages, 1000 for paged*/
- if (!msg)
- goto done;
- else
- memset(msg, 0, (2001 - paging * 1000));
-
- result = open_file(&msgfile, &file);
- if (result != FILE_ERR_OK) {
- prom_printf("%s:%d,", msgfile.dev, msgfile.part);
- prom_perror(result, msgfile.file);
- goto done;
- }
- opened = 1;
-
- if ( file.fs->read(&file, (2000 - paging * 1000), msg) <= 0)
- goto done;
-
- if ( paging && (*(msg + 999) != 0) ) {
- /* file longer than 1000 and paging is 1 */
- char *last_nl;
- int len = 0;
-
- while ( *(msg + 999) != 0 ) {
- last_nl = strrchr(msg, '\n');
- *last_nl = 0;
-
- prom_printf("\r \r%s\n[Press a key]", msg);
- len += last_nl - msg + 1;
-
- memset(msg, 0, 1001);
- file.fs->seek(&file, len);
- file.fs->read(&file, 1000, msg);
-
- /* wait until key */
- while ( prom_nbgetchar() == -1 );
- }
- prom_printf("\r \r%s", msg);
- } else
- prom_printf("%s", msg);
+ char *msg = NULL;
+ char *p, *endp;
+ char *defdev = boot.dev;
+ int defpart = boot.part;
+ char msgpath[1024];
+ int opened = 0;
+ int result = 0;
+ int n;
+ struct boot_file_t file;
+ struct boot_fspec_t msgfile;
+
+ defdev = cfg_get_strg(0, "device");
+ if (!defdev)
+ defdev = boot.dev;
+ p = cfg_get_strg(0, "partition");
+ if (p) {
+ n = simple_strtol(p, &endp, 10);
+ if (endp != p && *endp == 0)
+ defpart = n;
+ }
+
+ strncpy(msgpath, filename, sizeof(msgpath));
+ if (!parse_device_path(msgpath, defdev, defpart,
+ "/etc/yaboot.msg", &msgfile)) {
+ prom_printf("%s: Unable to parse\n", msgpath);
+ goto done;
+ }
+
+ /* 2000 for not paged messages, 1000 for paged*/
+ msg = malloc(2001 - paging * 1000);
+ if (!msg)
+ goto done;
+ else
+ memset(msg, 0, (2001 - paging * 1000));
+
+ result = open_file(&msgfile, &file);
+ if (result != FILE_ERR_OK) {
+ prom_printf("%s:%d,", msgfile.dev, msgfile.part);
+ prom_perror(result, msgfile.file);
+ goto done;
+ }
+ opened = 1;
+
+ if ( file.fs->read(&file, (2000 - paging * 1000), msg) <= 0)
+ goto done;
+
+ if ( paging && (*(msg + 999) != 0) ) {
+ /* file longer than 1000 and paging is 1 */
+ char *last_nl;
+ int len = 0;
+
+ while ( *(msg + 999) != 0 ) {
+ last_nl = strrchr(msg, '\n');
+ *last_nl = 0;
+
+ prom_printf("\r \r%s\n[Press a key]", msg);
+ len += last_nl - msg + 1;
+
+ memset(msg, 0, 1001);
+ file.fs->seek(&file, len);
+ file.fs->read(&file, 1000, msg);
+
+ /* wait until key */
+ while ( prom_nbgetchar() == -1 );
+ }
+ prom_printf("\r \r%s", msg);
+ } else
+ prom_printf("%s", msg);
done:
- if (opened)
- file.fs->close(&file);
- if (msg)
- free(msg);
+ if (opened)
+ file.fs->close(&file);
+ if (msg)
+ free(msg);
}
/* Currently, the config file must be at the root of the filesystem.
@@ -361,151 +359,150 @@
static int
load_config_file(char *device, char* path, int partition)
{
- char *conf_file = NULL, *p;
- struct boot_file_t file;
- int sz, opened = 0, result = 0;
- char conf_path[512];
- struct boot_fspec_t fspec;
-
- /* Allocate a buffer for the config file */
- conf_file = malloc(CONFIG_FILE_MAX);
- if (!conf_file) {
- prom_printf("Can't alloc config file buffer\n");
- goto bail;
- }
-
- /* Build the path to the file */
- if (_machine == _MACH_chrp)
- strcpy(conf_path, "/boot/");
- else if (path && *path)
- strcpy(conf_path, path);
- else
- conf_path[0] = 0;
- strcat(conf_path, CONFIG_FILE_NAME);
-
- /* Open it */
- fspec.dev = device;
- fspec.file = conf_path;
- fspec.part = partition;
- result = open_file(&fspec, &file);
- if (result != FILE_ERR_OK) {
- prom_printf("%s:%d,", fspec.dev, fspec.part);
- prom_perror(result, fspec.file);
- prom_printf("Can't open config file\n");
- goto bail;
- }
- opened = 1;
-
- /* Read it */
- sz = file.fs->read(&file, CONFIG_FILE_MAX, conf_file);
- if (sz <= 0) {
- prom_printf("Error, can't read config file\n");
- goto bail;
- }
- prom_printf("Config file read, %d bytes\n", sz);
-
- /* Close the file */
- if (opened)
- file.fs->close(&file);
- opened = 0;
-
- /* Call the parsing code in cfg.c */
- if (cfg_parse(conf_path, conf_file, sz) < 0) {
- prom_printf ("Syntax error or read error config\n");
- goto bail;
- }
-
- DEBUG_F("Config file successfully parsed, %d bytes\n", sz);
-
- /* Now, we do the initialisations stored in the config file */
- p = cfg_get_strg(0, "init-code");
- if (p)
- prom_interpret(p);
+ char *conf_file = NULL, *p;
+ struct boot_file_t file;
+ int sz, opened = 0, result = 0;
+ char conf_path[512];
+ struct boot_fspec_t fspec;
+
+ /* Allocate a buffer for the config file */
+ conf_file = malloc(CONFIG_FILE_MAX);
+ if (!conf_file) {
+ prom_printf("Can't alloc config file buffer\n");
+ goto bail;
+ }
+
+ /* Build the path to the file */
+ if (_machine == _MACH_chrp)
+ strcpy(conf_path, "/boot/");
+ else if (path && *path)
+ strcpy(conf_path, path);
+ else
+ conf_path[0] = 0;
+ strcat(conf_path, CONFIG_FILE_NAME);
+
+ /* Open it */
+ fspec.dev = device;
+ fspec.file = conf_path;
+ fspec.part = partition;
+ result = open_file(&fspec, &file);
+ if (result != FILE_ERR_OK) {
+ prom_printf("%s:%d,", fspec.dev, fspec.part);
+ prom_perror(result, fspec.file);
+ prom_printf("Can't open config file\n");
+ goto bail;
+ }
+ opened = 1;
+
+ /* Read it */
+ sz = file.fs->read(&file, CONFIG_FILE_MAX, conf_file);
+ if (sz <= 0) {
+ prom_printf("Error, can't read config file\n");
+ goto bail;
+ }
+ prom_printf("Config file read, %d bytes\n", sz);
+
+ /* Close the file */
+ if (opened)
+ file.fs->close(&file);
+ opened = 0;
+
+ /* Call the parsing code in cfg.c */
+ if (cfg_parse(conf_path, conf_file, sz) < 0) {
+ prom_printf ("Syntax error or read error config\n");
+ goto bail;
+ }
+
+ DEBUG_F("Config file successfully parsed, %d bytes\n", sz);
+
+ /* Now, we do the initialisations stored in the config file */
+ p = cfg_get_strg(0, "init-code");
+ if (p)
+ prom_interpret(p);
+
+ password = cfg_get_strg(0, "password");
- password = cfg_get_strg(0, "password");
-
#ifdef CONFIG_COLOR_TEXT
- p = cfg_get_strg(0, "fgcolor");
- if (p) {
- DEBUG_F("fgcolor=%s\n", p);
- fgcolor = check_color_text_ui(p);
- if (fgcolor == -1) {
- prom_printf("Invalid fgcolor: \"%s\".\n", p);
- }
- }
- p = cfg_get_strg(0, "bgcolor");
- if (p) {
- DEBUG_F("bgcolor=%s\n", p);
- bgcolor = check_color_text_ui(p);
- if (bgcolor == -1)
- prom_printf("Invalid bgcolor: \"%s\".\n", p);
- }
- if (bgcolor >= 0) {
- char temp[64];
- sprintf(temp, "%x to background-color", bgcolor);
- prom_interpret(temp);
+ p = cfg_get_strg(0, "fgcolor");
+ if (p) {
+ DEBUG_F("fgcolor=%s\n", p);
+ fgcolor = check_color_text_ui(p);
+ if (fgcolor == -1)
+ prom_printf("Invalid fgcolor: \"%s\".\n", p);
+ }
+ p = cfg_get_strg(0, "bgcolor");
+ if (p) {
+ DEBUG_F("bgcolor=%s\n", p);
+ bgcolor = check_color_text_ui(p);
+ if (bgcolor == -1)
+ prom_printf("Invalid bgcolor: \"%s\".\n", p);
+ }
+ if (bgcolor >= 0) {
+ char temp[64];
+ sprintf(temp, "%x to background-color", bgcolor);
+ prom_interpret(temp);
#if !DEBUG
- prom_printf("\xc");
+ prom_printf("\xc");
#endif /* !DEBUG */
- }
- if (fgcolor >= 0) {
- char temp[64];
- sprintf(temp, "%x to foreground-color", fgcolor);
- prom_interpret(temp);
- }
+ }
+ if (fgcolor >= 0) {
+ char temp[64];
+ sprintf(temp, "%x to foreground-color", fgcolor);
+ prom_interpret(temp);
+ }
#endif /* CONFIG_COLOR_TEXT */
-
- p = cfg_get_strg(0, "init-message");
- if (p)
- prom_printf("%s\n", p);
-
- p = cfg_get_strg(0, "message");
- if (p)
- print_message_file(p, 0);
- result = 1;
-
+ p = cfg_get_strg(0, "init-message");
+ if (p)
+ prom_printf("%s\n", p);
+
+ p = cfg_get_strg(0, "message");
+ if (p)
+ print_message_file(p, 0);
+
+ result = 1;
+
bail:
- if (opened)
- file.fs->close(&file);
-
- if (result != 1 && conf_file)
- free(conf_file);
-
- return result;
+ if (opened)
+ file.fs->close(&file);
+
+ if (result != 1 && conf_file)
+ free(conf_file);
+
+ return result;
}
void maintabfunc (void)
{
- if (useconf) {
- cfg_print_images();
- prom_printf("boot: %s", cbuff);
- }
+ if (useconf) {
+ cfg_print_images();
+ prom_printf("boot: %s", cbuff);
+ }
}
void
word_split(char **linep, char **paramsp)
{
- char *p;
+ char *p;
- *paramsp = 0;
- p = *linep;
- if (p == 0)
- return;
- while (*p == ' ')
- ++p;
- if (*p == 0) {
- *linep = 0;
- return;
- }
- *linep = p;
- while (*p != 0 && *p != ' ')
- ++p;
- while (*p == ' ')
- *p++ = 0;
- if (*p != 0)
- *paramsp = p;
+ *paramsp = 0;
+ p = *linep;
+ if (p == 0)
+ return;
+ while (*p == ' ')
+ ++p;
+ if (*p == 0) {
+ *linep = 0;
+ return;
+ }
+ *linep = p;
+ while (*p != 0 && *p != ' ')
+ ++p;
+ while (*p == ' ')
+ *p++ = 0;
+ if (*p != 0)
+ *paramsp = p;
}
int
@@ -513,7 +510,7 @@
int number = 0;
int len, i;
len = strlen(str);
- for (i=0; i<len; i++)
+ for (i=0; i<len; i++)
if ( str[i] <= '9' && str[i] >= '0' )
number = number * 10 + str[i] - '0';
return number;
@@ -522,339 +519,345 @@
char *
make_params(char *label, char *params)
{
- char *p, *q;
- static char buffer[2048];
+ char *p, *q;
+ static char buffer[2048];
+
+ q = buffer;
+ *q = 0;
+
+ p = cfg_get_strg(label, "literal");
+ if (p) {
+ strcpy(q, p);
+ q = strchr(q, 0);
+ if (params) {
+ if (*p)
+ *q++ = ' ';
+ strcpy(q, params);
+ }
+ return buffer;
+ }
- q = buffer;
- *q = 0;
+ p = cfg_get_strg(label, "root");
+ if (p) {
+ strcpy (q, "root=");
+ strcpy (q + 5, p);
+ q = strchr (q, 0);
+ *q++ = ' ';
+ }
+ if (cfg_get_flag(label, "read-only")) {
+ strcpy (q, "ro ");
+ q += 3;
+ }
+ if (cfg_get_flag(label, "read-write")) {
+ strcpy (q, "rw ");
+ q += 3;
+ }
+ p = cfg_get_strg(label, "ramdisk");
+ if (p) {
+ strcpy (q, "ramdisk=");
+ strcpy (q + 8, p);
+ q = strchr (q, 0);
+ *q++ = ' ';
+ }
+ p = cfg_get_strg(label, "initrd-size");
+ if (p) {
+ initrd_size = string_to_int(p);
+
+ strcpy (q, "ramdisk_size=");
+ strcpy (q + 13, p);
+ q = strchr (q, 0);
+ *q++ = ' ';
+ }
+ p = cfg_get_strg(label, "kernel-size");
+ if (p) {
+ kernel_size = string_to_int(p);
+ }
- p = cfg_get_strg(label, "literal");
- if (p) {
- strcpy(q, p);
- q = strchr(q, 0);
- if (params) {
- if (*p)
- *q++ = ' ';
- strcpy(q, params);
- }
- return buffer;
- }
-
- p = cfg_get_strg(label, "root");
- if (p) {
- strcpy (q, "root=");
- strcpy (q + 5, p);
- q = strchr (q, 0);
- *q++ = ' ';
- }
- if (cfg_get_flag(label, "read-only")) {
- strcpy (q, "ro ");
- q += 3;
- }
- if (cfg_get_flag(label, "read-write")) {
- strcpy (q, "rw ");
- q += 3;
- }
- p = cfg_get_strg(label, "ramdisk");
- if (p) {
- strcpy (q, "ramdisk=");
- strcpy (q + 8, p);
- q = strchr (q, 0);
- *q++ = ' ';
- }
- p = cfg_get_strg(label, "initrd-size");
- if (p) {
- initrd_size = string_to_int(p);
-
- strcpy (q, "ramdisk_size=");
- strcpy (q + 13, p);
- q = strchr (q, 0);
- *q++ = ' ';
- }
- p = cfg_get_strg(label, "kernel-size");
- if (p) {
- kernel_size = string_to_int(p);
- }
-
- if (cfg_get_flag(label, "novideo")) {
- strcpy (q, "video=ofonly");
- q = strchr (q, 0);
- *q++ = ' ';
- }
- p = cfg_get_strg (label, "append");
- if (p) {
- strcpy (q, p);
- q = strchr (q, 0);
- *q++ = ' ';
- }
- *q = 0;
- pause_after = cfg_get_flag (label, "pause-after");
- p = cfg_get_strg(label, "pause-message");
- if (p)
- pause_message = p;
- if (params)
- strcpy(q, params);
+ if (cfg_get_flag(label, "novideo")) {
+ strcpy (q, "video=ofonly");
+ q = strchr (q, 0);
+ *q++ = ' ';
+ }
+ p = cfg_get_strg (label, "append");
+ if (p) {
+ strcpy (q, p);
+ q = strchr (q, 0);
+ *q++ = ' ';
+ }
+ *q = 0;
+ pause_after = cfg_get_flag (label, "pause-after");
+ p = cfg_get_strg(label, "pause-message");
+ if (p)
+ pause_message = p;
+ if (params)
+ strcpy(q, params);
- return buffer;
+ return buffer;
}
void check_password(char *str)
{
- int i;
+ int i;
- prom_printf("\n%s", str);
- for (i = 0; i < 3; i++) {
- prom_printf ("\nPassword: ");
- passwdbuff[0] = 0;
- cmdedit ((void (*)(void)) 0, 1);
- prom_printf ("\n");
+ prom_printf("\n%s", str);
+ for (i = 0; i < 3; i++) {
+ prom_printf ("\nPassword: ");
+ passwdbuff[0] = 0;
+ cmdedit ((void (*)(void)) 0, 1);
+ prom_printf ("\n");
#ifdef USE_MD5_PASSWORDS
- if (!strncmp (password, "$1$", 3)) {
- if (!check_md5_password(passwdbuff, password))
- return;
- }
- else if (!strcmp (password, passwdbuff))
- return;
+ if (!strncmp (password, "$1$", 3)) {
+ if (!check_md5_password(passwdbuff, password))
+ return;
+ }
+ else if (!strcmp (password, passwdbuff))
+ return;
#else /* !MD5 */
- if (!strcmp (password, passwdbuff))
- return;
+ if (!strcmp (password, passwdbuff))
+ return;
#endif /* USE_MD5_PASSWORDS */
- if (i < 2) {
- prom_sleep(1);
- prom_printf ("Incorrect password. Try again.");
- }
- }
- prom_printf(" ___________________\n< Permission denied >\n -------------------\n"
- " \\ ^__^\n \\ (oo)\\_______\n (__)\\ )\\/\\\n"
- " ||----w |\n || ||\n");
- prom_sleep(4);
- prom_interpret("reset-all");
+ if (i < 2) {
+ prom_sleep(1);
+ prom_printf ("Incorrect password. Try again.");
+ }
+ }
+ prom_printf(" ___________________ \n"
+ "< Permission denied >\n"
+ " ------------------- \n"
+ " \\ ^__^\n"
+ " \\ (oo)\\_______\n"
+ " (__)\\ )\\/\\\n"
+ " ||----w |\n"
+ " || ||\n");
+
+ prom_sleep(4);
+ prom_interpret("reset-all");
}
int get_params(struct boot_param_t* params)
{
- int defpart;
- char *defdevice = 0;
- char *p, *q, *endp;
- int c, n;
- char *imagename = 0, *label;
- int timeout = -1;
- int beg = 0, end;
- int singlekey = 0;
- int restricted = 0;
- static int first = 1;
- static char bootargs[1024];
- static char imagepath[1024];
- static char initrdpath[1024];
- static char sysmappath[1024];
-
- pause_after = 0;
- memset(params, 0, sizeof(*params));
- params->args = "";
- params->kernel.part = -1;
- params->rd.part = -1;
- params->sysmap.part = -1;
- defpart = boot.part;
-
- cmdinit();
-
- if (first) {
- first = 0;
- prom_get_chosen("bootargs", bootargs, sizeof(bootargs));
- imagename = bootargs;
- word_split(&imagename, ¶ms->args);
- timeout = DEFAULT_TIMEOUT;
- if (imagename) {
- prom_printf("Default supplied on the command line: %s ", imagename);
- if (params->args)
- prom_printf("%s", params->args);
- prom_printf("\n");
- }
- if (useconf && (q = cfg_get_strg(0, "timeout")) != 0 && *q != 0)
- timeout = simple_strtol(q, NULL, 0);
- }
-
- prom_printf("boot: ");
- c = -1;
- if (timeout != -1) {
- beg = prom_getms();
- if (timeout > 0) {
- end = beg + 100 * timeout;
- do {
- c = prom_nbgetchar();
- } while (c == -1 && prom_getms() <= end);
- }
- if (c == -1)
- c = '\n';
- else if (c != '\n' && c != '\t' && c != '\r' && c != '\b' ) {
- cbuff[0] = c;
- cbuff[1] = 0;
- }
- }
-
- if (c != -1 && c != '\n' && c != '\r') {
- if (c == '\t') {
- maintabfunc ();
- } else if (c >= ' ') {
- cbuff[0] = c;
- cbuff[1] = 0;
- if ((cfg_get_flag (cbuff, "single-key")) && useconf) {
- imagename = cbuff;
- singlekey = 1;
- prom_printf("%s\n", cbuff);
- }
- }
- }
-
- if (c == '\n' || c == '\r') {
- if (!imagename)
- imagename = cfg_get_default();
- if (imagename)
- prom_printf("%s", imagename);
- if (params->args)
- prom_printf(" %s", params->args);
- prom_printf("\n");
- } else if (!singlekey) {
- cmdedit(maintabfunc, 0);
- prom_printf("\n");
- strcpy(given_bootargs, cbuff);
- given_bootargs_by_user = 1;
- imagename = cbuff;
- word_split(&imagename, ¶ms->args);
- }
-
- /* chrp gets this wrong, force it -- Cort */
- if ( useconf && (!imagename || imagename[0] == 0 ))
- imagename = cfg_get_default();
-
- label = 0;
- defdevice = boot.dev;
-
- if (useconf) {
- defdevice = cfg_get_strg(0, "device");
- p = cfg_get_strg(0, "partition");
- if (p) {
- n = simple_strtol(p, &endp, 10);
- if (endp != p && *endp == 0)
- defpart = n;
- }
- p = cfg_get_strg(0, "pause-message");
- if (p)
- pause_message = p;
- if (cfg_get_flag(0, "restricted"))
- restricted = 1;
- p = cfg_get_strg(imagename, "image");
- if (p && *p) {
- label = imagename;
- imagename = p;
- defdevice = cfg_get_strg(label, "device");
- if(!defdevice) defdevice=boot.dev;
- p = cfg_get_strg(label, "partition");
- if (p) {
- n = simple_strtol(p, &endp, 10);
- if (endp != p && *endp == 0)
- defpart = n;
- }
- if (cfg_get_flag(label, "restricted"))
- restricted = 1;
- if (label) {
- if (params->args && password && restricted)
- check_password ("To specify arguments for this image "
- "you must enter the password.");
- else if (password && !restricted)
- check_password ("This image is restricted.");
- }
- params->args = make_params(label, params->args);
- } else { /* no *p */
- p = cfg_get_strg(imagename, "text");
- if (p && *p) {
- if(!defdevice) defdevice = boot.dev;
- prom_printf("\n");
- print_message_file(p, 1);
- return 0;
- }
- }
- }
-
- if (!strcmp (imagename, "help")) {
- /* FIXME: defdevice shouldn't need to be reset all over the place */
- if(!defdevice) defdevice = boot.dev;
- prom_printf(
- "\nPress the tab key for a list of defined images.\n"
- "The label marked with a \"*\" is is the default image, "
- "press <return> to boot it.\n\n"
- "To boot any other label simply type its name and press <return>.\n\n"
- "To boot a kernel image which is not defined in the yaboot configuration \n"
- "file, enter the kernel image name as [[device:][partno],]/path, where \n"
- "\"device:\" is the OpenFirmware device path to the disk the image \n"
- "resides on, and \"partno\" is the partition number the image resides on.\n"
- "Note that the comma (,) is only required if you specify an OpenFirmware\n"
- "device, if you only specify a filename you should not start it with a \",\"\n\n"
- "If you omit \"device:\" and \"partno\" yaboot will use the values of \n"
- "\"device=\" and \"partition=\" in yaboot.conf, right now those are set to: \n"
- "device=%s\n"
- "partition=%d\n\n", defdevice, defpart);
- return 0;
- }
-
- if (!strcmp (imagename, "halt")) {
- if (password)
- check_password ("Restricted command.");
- prom_pause();
- return 0;
- }
- if (!strcmp (imagename, "bye")) {
- if (password) {
- check_password ("Restricted command.");
- return 1;
- }
- return 1;
- }
-
- if (imagename[0] == '$') {
- /* forth command string */
- if (password)
- check_password ("OpenFirmware commands are restricted.");
- prom_interpret(imagename+1);
- return 0;
- }
-
- strncpy(imagepath, imagename, 1024);
-
- if (!label && password)
- check_password ("To boot a custom image you must enter the password.");
-
- if (!parse_device_path(imagepath, defdevice, defpart,
- "/vmlinux", ¶ms->kernel)) {
- prom_printf("%s: Unable to parse\n", imagepath);
- return 0;
- }
- DEBUG_F("after parse_device_path: dev=%s part=%d file=%s\n", params->kernel.dev,
- params->kernel.part, params->kernel.file);
-
- if (useconf) {
- p = cfg_get_strg(label, "initrd");
- if (p && *p) {
- DEBUG_F("Parsing initrd path <%s>\n", p);
- strncpy(initrdpath, p, 1024);
- if (!parse_device_path(initrdpath, defdevice, defpart,
- "/root.bin", ¶ms->rd)) {
- prom_printf("%s: Unable to parse\n", imagepath);
- return 0;
- }
- }
- p = cfg_get_strg(label, "sysmap");
- if (p && *p) {
- DEBUG_F("Parsing sysmap path <%s>\n", p);
- strncpy(sysmappath, p, 1024);
- if (!parse_device_path(sysmappath, defdevice, defpart,
- "/boot/System.map", ¶ms->sysmap)) {
- prom_printf("%s: Unable to parse\n", imagepath);
- return 0;
- }
- }
- }
- return 0;
+ int defpart;
+ char *defdevice = 0;
+ char *p, *q, *endp;
+ int c, n;
+ char *imagename = 0, *label;
+ int timeout = -1;
+ int beg = 0, end;
+ int singlekey = 0;
+ int restricted = 0;
+ static int first = 1;
+ static char bootargs[1024];
+ static char imagepath[1024];
+ static char initrdpath[1024];
+ static char sysmappath[1024];
+
+ pause_after = 0;
+ memset(params, 0, sizeof(*params));
+ params->args = "";
+ params->kernel.part = -1;
+ params->rd.part = -1;
+ params->sysmap.part = -1;
+ defpart = boot.part;
+
+ cmdinit();
+
+ if (first) {
+ first = 0;
+ prom_get_chosen("bootargs", bootargs, sizeof(bootargs));
+ imagename = bootargs;
+ word_split(&imagename, ¶ms->args);
+ timeout = DEFAULT_TIMEOUT;
+ if (imagename) {
+ prom_printf("Default supplied on the command line: %s ", imagename);
+ if (params->args)
+ prom_printf("%s", params->args);
+ prom_printf("\n");
+ }
+ if (useconf && (q = cfg_get_strg(0, "timeout")) != 0 && *q != 0)
+ timeout = simple_strtol(q, NULL, 0);
+ }
+
+ prom_printf("boot: ");
+ c = -1;
+ if (timeout != -1) {
+ beg = prom_getms();
+ if (timeout > 0) {
+ end = beg + 100 * timeout;
+ do {
+ c = prom_nbgetchar();
+ } while (c == -1 && prom_getms() <= end);
+ }
+ if (c == -1)
+ c = '\n';
+ else if (c != '\n' && c != '\t' && c != '\r' && c != '\b' ) {
+ cbuff[0] = c;
+ cbuff[1] = 0;
+ }
+ }
+
+ if (c != -1 && c != '\n' && c != '\r') {
+ if (c == '\t') {
+ maintabfunc ();
+ } else if (c >= ' ') {
+ cbuff[0] = c;
+ cbuff[1] = 0;
+ if ((cfg_get_flag (cbuff, "single-key")) && useconf) {
+ imagename = cbuff;
+ singlekey = 1;
+ prom_printf("%s\n", cbuff);
+ }
+ }
+ }
+
+ if (c == '\n' || c == '\r') {
+ if (!imagename)
+ imagename = cfg_get_default();
+ if (imagename)
+ prom_printf("%s", imagename);
+ if (params->args)
+ prom_printf(" %s", params->args);
+ prom_printf("\n");
+ } else if (!singlekey) {
+ cmdedit(maintabfunc, 0);
+ prom_printf("\n");
+ strcpy(given_bootargs, cbuff);
+ given_bootargs_by_user = 1;
+ imagename = cbuff;
+ word_split(&imagename, ¶ms->args);
+ }
+
+ /* chrp gets this wrong, force it -- Cort */
+ if ( useconf && (!imagename || imagename[0] == 0 ))
+ imagename = cfg_get_default();
+
+ label = 0;
+ defdevice = boot.dev;
+
+ if (useconf) {
+ defdevice = cfg_get_strg(0, "device");
+ p = cfg_get_strg(0, "partition");
+ if (p) {
+ n = simple_strtol(p, &endp, 10);
+ if (endp != p && *endp == 0)
+ defpart = n;
+ }
+ p = cfg_get_strg(0, "pause-message");
+ if (p)
+ pause_message = p;
+ if (cfg_get_flag(0, "restricted"))
+ restricted = 1;
+ p = cfg_get_strg(imagename, "image");
+ if (p && *p) {
+ label = imagename;
+ imagename = p;
+ defdevice = cfg_get_strg(label, "device");
+ if(!defdevice) defdevice=boot.dev;
+ p = cfg_get_strg(label, "partition");
+ if (p) {
+ n = simple_strtol(p, &endp, 10);
+ if (endp != p && *endp == 0)
+ defpart = n;
+ }
+ if (cfg_get_flag(label, "restricted"))
+ restricted = 1;
+ if (label) {
+ if (params->args && password && restricted)
+ check_password ("To specify arguments for this image "
+ "you must enter the password.");
+ else if (password && !restricted)
+ check_password ("This image is restricted.");
+ }
+ params->args = make_params(label, params->args);
+ } else { /* no *p */
+ p = cfg_get_strg(imagename, "text");
+ if (p && *p) {
+ if(!defdevice) defdevice = boot.dev;
+ prom_printf("\n");
+ print_message_file(p, 1);
+ return 0;
+ }
+ }
+ }
+
+ if (!strcmp (imagename, "help")) {
+ /* FIXME: defdevice shouldn't need to be reset all over the place */
+ if(!defdevice) defdevice = boot.dev;
+ prom_printf(
+ "\nPress the tab key for a list of defined images.\n"
+ "The label marked with a \"*\" is is the default image, "
+ "press <return> to boot it.\n\n"
+ "To boot any other label simply type its name and press <return>.\n\n"
+ "To boot a kernel image which is not defined in the yaboot configuration \n"
+ "file, enter the kernel image name as [[device:][partno],]/path, where \n"
+ "\"device:\" is the OpenFirmware device path to the disk the image \n"
+ "resides on, and \"partno\" is the partition number the image resides on.\n"
+ "Note that the comma (,) is only required if you specify an OpenFirmware\n"
+ "device, if you only specify a filename you should not start it with a \",\"\n\n"
+ "If you omit \"device:\" and \"partno\" yaboot will use the values of \n"
+ "\"device=\" and \"partition=\" in yaboot.conf, right now those are set to: \n"
+ "device=%s\n"
+ "partition=%d\n\n", defdevice, defpart);
+ return 0;
+ }
+
+ if (!strcmp (imagename, "halt")) {
+ if (password)
+ check_password ("Restricted command.");
+ prom_pause();
+ return 0;
+ }
+ if (!strcmp (imagename, "bye")) {
+ if (password) {
+ check_password ("Restricted command.");
+ return 1;
+ }
+ return 1;
+ }
+
+ if (imagename[0] == '$') {
+ /* forth command string */
+ if (password)
+ check_password ("OpenFirmware commands are restricted.");
+ prom_interpret(imagename+1);
+ return 0;
+ }
+
+ strncpy(imagepath, imagename, 1024);
+
+ if (!label && password)
+ check_password ("To boot a custom image you must enter the password.");
+
+ if (!parse_device_path(imagepath, defdevice, defpart,
+ "/vmlinux", ¶ms->kernel)) {
+ prom_printf("%s: Unable to parse\n", imagepath);
+ return 0;
+ }
+ DEBUG_F("after parse_device_path: dev=%s part=%d file=%s\n",
+ params->kernel.dev, params->kernel.part, params->kernel.file);
+
+ if (useconf) {
+ p = cfg_get_strg(label, "initrd");
+ if (p && *p) {
+ DEBUG_F("Parsing initrd path <%s>\n", p);
+ strncpy(initrdpath, p, 1024);
+ if (!parse_device_path(initrdpath, defdevice, defpart,
+ "/root.bin", ¶ms->rd)) {
+ prom_printf("%s: Unable to parse\n", imagepath);
+ return 0;
+ }
+ }
+ p = cfg_get_strg(label, "sysmap");
+ if (p && *p) {
+ DEBUG_F("Parsing sysmap path <%s>\n", p);
+ strncpy(sysmappath, p, 1024);
+ if (!parse_device_path(sysmappath, defdevice, defpart,
+ "/boot/System.map", ¶ms->sysmap)) {
+ prom_printf("%s: Unable to parse\n", imagepath);
+ return 0;
+ }
+ }
+ }
+ return 0;
}
/* This is derived from quik core. To be changed to first parse the headers
@@ -867,763 +870,782 @@
{
#define MAX_HEADERS 32
- struct boot_file_t file;
- int result;
- static struct boot_param_t params;
- void *initrd_base;
- void *sysmap_base;
- unsigned long sysmap_size;
- kernel_entry_t kernel_entry;
- struct bi_record* birec;
- char* loc=NULL;
- loadinfo_t loadinfo;
- void *initrd_more,*initrd_want;
- unsigned long initrd_read;
-
- loadinfo.load_loc = 0;
-
- for (;;) {
- initrd_size = 0;
- initrd_base = 0;
- sysmap_base = 0;
- sysmap_size = 0;
- kernel_size = 0;
- kernel_position = 0;
-
- if (get_params(¶ms))
- return;
- if (!params.kernel.file)
- continue;
-
- prom_printf("Please wait, loading kernel...\n");
-
- memset(&file, 0, sizeof(file));
- if ( ( loc = strchr(params.kernel.file, '@')) != NULL ) {
- *loc = '\0';
- kernel_position = string_to_int( ++loc);
- prom_printf("kernel at: %d, uncompressed size: %d\n", (int)kernel_position, (int)kernel_size);
- }
- loc = NULL;
-
-
- if (strlen(boot.file) && !strcmp(boot.file,"\\\\") && params.kernel.file[0] != '/'
- && params.kernel.file[0] != '\\') {
- loc=(char*)malloc(strlen(params.kernel.file)+3);
- if (!loc) {
- prom_printf ("malloc error\n");
- goto next;
- }
- strcpy(loc,boot.file);
- strcat(loc,params.kernel.file);
- free(params.kernel.file);
- params.kernel.file=loc;
- }
- result = open_file(¶ms.kernel, &file);
- if (result != FILE_ERR_OK) {
- prom_printf("%s:%d,", params.kernel.dev, params.kernel.part);
- prom_perror(result, params.kernel.file);
- goto next;
- }
- if ( kernel_position == 0 ) {
- gunzip_file = file;
- gunzip_test_header();
- }
-
- /* Read the Elf e_ident, e_type and e_machine fields to
- * determine Elf file type
- */
- if ( ( compressed_file ?
- gunzip_read(&loadinfo.elf, sizeof(Elf_Ident)) :
- file.fs->read(&file, sizeof(Elf_Ident), &loadinfo.elf)
- ) < sizeof(Elf_Ident)) {
- prom_printf("\nCan't read Elf e_ident/e_type/e_machine info\n");
- file.fs->close(&file);
- memset(&file, 0, sizeof(file));
- goto next;
- }
-
- if (is_elf32(&loadinfo)) {
- if (!load_elf32(&file, &loadinfo)) {
- file.fs->close(&file);
- memset(&file, 0, sizeof(file));
- goto next;
- }
- prom_printf(" Elf32 kernel loaded...\n");
- } else if (is_elf64(&loadinfo)) {
- if (!load_elf64(&file, &loadinfo)) {
- file.fs->close(&file);
- memset(&file, 0, sizeof(file));
- goto next;
- }
- prom_printf(" Elf64 kernel loaded...\n");
- } else {
- prom_printf ("%s: Not a valid ELF image\n", params.kernel.file);
- file.fs->close(&file);
- memset(&file, 0, sizeof(file));
- goto next;
- }
- file.fs->close(&file);
- memset(&file, 0, sizeof(file));
-
- /* If sysmap, load it (only if booting a vmlinux).
- */
- if (flat_vmlinux && params.sysmap.file) {
- prom_printf("Loading System.map ...\n");
- if(strlen(boot.file) && !strcmp(boot.file,"\\\\") && params.sysmap.file[0] != '/'
- && params.sysmap.file[0] != '\\') {
- if (loc) free(loc);
- loc=(char*)malloc(strlen(params.sysmap.file)+3);
- if (!loc) {
- prom_printf ("malloc error\n");
- goto next;
- }
- strcpy(loc,boot.file);
- strcat(loc,params.sysmap.file);
- free(params.sysmap.file);
- params.sysmap.file=loc;
- }
-
- result = open_file(¶ms.sysmap, &file);
- if (result != FILE_ERR_OK) {
- prom_printf("%s:%d,", params.sysmap.dev, params.sysmap.part);
- prom_perror(result, params.sysmap.file);
- }
- else {
- sysmap_base = prom_claim(loadinfo.base+loadinfo.memsize, 0x100000, 0);
- if (sysmap_base == (void *)-1) {
- prom_printf("Claim failed for sysmap memory\n");
- sysmap_base = 0;
- } else {
- sysmap_size = file.fs->read(&file, 0xfffff, sysmap_base);
- if (sysmap_size == 0)
- sysmap_base = 0;
- else
- ((char *)sysmap_base)[sysmap_size++] = 0;
- }
- file.fs->close(&file);
- memset(&file, 0, sizeof(file));
- }
- if (sysmap_base) {
- prom_printf("System.map loaded at %p, size: %lu Kbytes\n",
- sysmap_base, sysmap_size >> 10);
- loadinfo.memsize += _ALIGN(0x100000, 0x1000);
- } else {
- prom_printf("System.map load failed !\n");
- prom_pause();
- }
- }
-
- /* If ramdisk, load it (only if booting a vmlinux). For now, we
- * can't tell the size it will be so we claim an arbitrary amount
- * of 2Mb.
- */
- if (flat_vmlinux && params.rd.file) {
- if(strlen(boot.file) && !strcmp(boot.file,"\\\\") && params.rd.file[0] != '/'
- && params.kernel.file[0] != '\\')
- {
- if (loc) free(loc);
- loc=(char*)malloc(strlen(params.rd.file)+3);
- if (!loc) {
- prom_printf ("Malloc error\n");
- goto next;
- }
- strcpy(loc,boot.file);
- strcat(loc,params.rd.file);
- free(params.rd.file);
- params.rd.file=loc;
- }
- prom_printf("Loading ramdisk...");
-
- if ( initrd_size ) {
- char *sep;
- if ( (sep = strchr(params.rd.file, '@')) != NULL ) {
- /* initrd is an elf part */
- unsigned int initrd_position=0;
- *sep = '\0';
- initrd_position = string_to_int( ++sep);
- prom_printf("initrd position: %d, size: %d\n", (int)initrd_position, (int)initrd_size);
-
- initrd_base = prom_claim(loadinfo.base+loadinfo.memsize, initrd_size, 0);
+ struct boot_file_t file;
+ int result;
+ static struct boot_param_t params;
+ void *initrd_base;
+ void *sysmap_base;
+ unsigned long sysmap_size;
+ kernel_entry_t kernel_entry;
+ struct bi_record *birec;
+ char *loc=NULL;
+ loadinfo_t loadinfo;
+ void *initrd_more, *initrd_want;
+ unsigned long initrd_read;
+
+ loadinfo.load_loc = 0;
+
+ for (;;) {
+ initrd_size = 0;
+ initrd_base = 0;
+ sysmap_base = 0;
+ sysmap_size = 0;
+ kernel_size = 0;
+ kernel_position = 0;
+
+ if (get_params(¶ms))
+ return;
+ if (!params.kernel.file)
+ continue;
+
+ prom_printf("Please wait, loading kernel...\n");
+
+ memset(&file, 0, sizeof(file));
+ if ( ( loc = strchr(params.kernel.file, '@')) != NULL ) {
+ *loc = '\0';
+ kernel_position = string_to_int( ++loc);
+ prom_printf("kernel at: %d, uncompressed size: %d\n",
+ (int)kernel_position, (int)kernel_size);
+ }
+ loc = NULL;
+
+
+ if (strlen(boot.file) && !strcmp(boot.file,"\\\\") &&
+ params.kernel.file[0] != '/' &&
+ params.kernel.file[0] != '\\') {
+ loc=(char*)malloc(strlen(params.kernel.file)+3);
+ if (!loc) {
+ prom_printf ("malloc error\n");
+ goto next;
+ }
+ strcpy(loc,boot.file);
+ strcat(loc,params.kernel.file);
+ free(params.kernel.file);
+ params.kernel.file=loc;
+ }
+ result = open_file(¶ms.kernel, &file);
+ if (result != FILE_ERR_OK) {
+ prom_printf("%s:%d,", params.kernel.dev, params.kernel.part);
+ prom_perror(result, params.kernel.file);
+ goto next;
+ }
+ if ( kernel_position == 0 ) {
+ gunzip_file = file;
+ gunzip_test_header();
+ }
+
+ /* Read the Elf e_ident, e_type and e_machine fields to
+ * determine Elf file type
+ */
+ if ( ( compressed_file ?
+ gunzip_read(&loadinfo.elf, sizeof(Elf_Ident)) :
+ file.fs->read(&file, sizeof(Elf_Ident), &loadinfo.elf)
+ ) < sizeof(Elf_Ident)) {
+ prom_printf("\nCan't read Elf e_ident/e_type/e_machine info\n");
+ file.fs->close(&file);
+ memset(&file, 0, sizeof(file));
+ goto next;
+ }
+
+ if (is_elf32(&loadinfo)) {
+ if (!load_elf32(&file, &loadinfo)) {
+ file.fs->close(&file);
+ memset(&file, 0, sizeof(file));
+ goto next;
+ }
+ prom_printf(" Elf32 kernel loaded...\n");
+ } else if (is_elf64(&loadinfo)) {
+ if (!load_elf64(&file, &loadinfo)) {
+ file.fs->close(&file);
+ memset(&file, 0, sizeof(file));
+ goto next;
+ }
+ prom_printf(" Elf64 kernel loaded...\n");
+ } else {
+ prom_printf ("%s: Not a valid ELF image\n", params.kernel.file);
+ file.fs->close(&file);
+ memset(&file, 0, sizeof(file));
+ goto next;
+ }
+ file.fs->close(&file);
+ memset(&file, 0, sizeof(file));
+
+ /* If sysmap, load it (only if booting a vmlinux).
+ */
+ if (flat_vmlinux && params.sysmap.file) {
+ prom_printf("Loading System.map ...\n");
+ if(strlen(boot.file) && !strcmp(boot.file,"\\\\") &&
+ params.sysmap.file[0] != '/' &&
+ params.sysmap.file[0] != '\\') {
+ if (loc) free(loc);
+ loc = (char*)malloc(strlen(params.sysmap.file)+3);
+ if (!loc) {
+ prom_printf ("malloc error\n");
+ goto next;
+ }
+ strcpy(loc,boot.file);
+ strcat(loc,params.sysmap.file);
+ free(params.sysmap.file);
+ params.sysmap.file=loc;
+ }
+
+ result = open_file(¶ms.sysmap, &file);
+ if (result != FILE_ERR_OK) {
+ prom_printf("%s:%d,", params.sysmap.dev, params.sysmap.part);
+ prom_perror(result, params.sysmap.file);
+ } else {
+ sysmap_base = prom_claim(loadinfo.base+loadinfo.memsize,
+ 0x100000, 0);
+ if (sysmap_base == (void *)-1) {
+ prom_printf("Claim failed for sysmap memory\n");
+ sysmap_base = 0;
+ } else {
+ sysmap_size = file.fs->read(&file, 0xfffff, sysmap_base);
+ if (sysmap_size == 0)
+ sysmap_base = 0;
+ else
+ ((char *)sysmap_base)[sysmap_size++] = 0;
+ }
+ file.fs->close(&file);
+ memset(&file, 0, sizeof(file));
+ }
+ if (sysmap_base) {
+ prom_printf("System.map loaded at %p, size: %lu Kbytes\n",
+ sysmap_base, sysmap_size >> 10);
+ loadinfo.memsize += _ALIGN(0x100000, 0x1000);
+ } else {
+ prom_printf("System.map load failed !\n");
+ prom_pause();
+ }
+ }
+
+ /* If ramdisk, load it (only if booting a vmlinux). For now, we
+ * can't tell the size it will be so we claim an arbitrary amount
+ * of 2Mb.
+ */
+ if (flat_vmlinux && params.rd.file) {
+ if(strlen(boot.file) && !strcmp(boot.file,"\\\\") &&
+ params.rd.file[0] != '/' &&
+ params.kernel.file[0] != '\\') {
+ if (loc) free(loc);
+ loc=(char*)malloc(strlen(params.rd.file)+3);
+ if (!loc) {
+ prom_printf ("Malloc error\n");
+ goto next;
+ }
+ strcpy(loc,boot.file);
+ strcat(loc,params.rd.file);
+ free(params.rd.file);
+ params.rd.file=loc;
+ }
+ prom_printf("Loading ramdisk...");
+
+ if ( initrd_size ) {
+ char *sep;
+ if ( (sep = strchr(params.rd.file, '@')) != NULL ) {
+ /* initrd is an elf part */
+ unsigned int initrd_position=0;
+ *sep = '\0';
+ initrd_position = string_to_int( ++sep);
+ prom_printf("initrd position: %d, size: %d\n",
+ (int)initrd_position, (int)initrd_size);
+
+ initrd_base = prom_claim(loadinfo.base+loadinfo.memsize,
+ initrd_size, 0);
+ result = open_file(¶ms.rd, &file);
+ if (result != FILE_ERR_OK) {
+ prom_printf("%s:%d,", params.rd.dev, params.rd.part);
+ prom_perror(result, params.rd.file);
+ }
+ file.fs->seek(&file, initrd_position);
+ initrd_read = file.fs->read(&file, initrd_size,
+ initrd_base);
+ file.fs->close(&file);
+ } else {
+ /* probably multi-file initrd */
+ char *(part[16]);
+ int parts=0, i;
+
+ initrd_base = prom_claim(loadinfo.base+loadinfo.memsize,
+ initrd_size, 0);
+ prom_printf("size: %d\n", (int)initrd_size);
+
+ /* ¶ms.rd .file- initrd path */
+ part[0] = strdup(params.rd.file);
+ while ( (sep = strchr(part[parts++], '|' )) ) {
+ *sep = '\0';
+ part[parts] = ++sep;
+ }
+ initrd_more = initrd_base;
+ for ( i=0; i<parts; i++ ) {
+ strcpy(params.rd.file, part[i]);
+ result = open_file(¶ms.rd, &file);
+ if (result != FILE_ERR_OK) {
+ prom_printf("%s:%d,", params.rd.dev,
+ params.rd.part);
+ prom_perror(result, params.rd.file);
+ }
+#define INITRD_MAX 0xF00000
+ initrd_read = file.fs->read(&file, INITRD_MAX,
+ initrd_more);
+ initrd_more += initrd_read;
+ prom_printf("read: %s\n", params.rd.file);
+ file.fs->close(&file);
+ }
+ free(part[0]);
+ }
+ } else {
+ /* normal behaviour */
result = open_file(¶ms.rd, &file);
if (result != FILE_ERR_OK) {
prom_printf("%s:%d,", params.rd.dev, params.rd.part);
prom_perror(result, params.rd.file);
- }
- file.fs->seek(&file, initrd_position);
- initrd_read = file.fs->read(&file, initrd_size, initrd_base);
- file.fs->close(&file);
- } else {
- /* probably multi-file initrd */
- char *(part[16]);
- int parts=0, i;
-
- initrd_base = prom_claim(loadinfo.base+loadinfo.memsize, initrd_size, 0);
- prom_printf("size: %d\n", (int)initrd_size);
-
- /* ¶ms.rd .file- initrd path */
- part[0] = strdup(params.rd.file);
- while ( (sep = strchr(part[parts++], '|' )) ) {
- *sep = '\0';
- part[parts] = ++sep;
- }
- initrd_more = initrd_base;
- for ( i=0; i<parts; i++ ) {
- strcpy(params.rd.file, part[i]);
- result = open_file(¶ms.rd, &file);
- if (result != FILE_ERR_OK) {
- prom_printf("%s:%d,", params.rd.dev, params.rd.part);
- prom_perror(result, params.rd.file);
- }
-#define INITRD_MAX 0xF00000
- initrd_read = file.fs->read(&file, INITRD_MAX, initrd_more);
- initrd_more += initrd_read;
- prom_printf("read: %s\n", params.rd.file);
- file.fs->close(&file);
- }
- free(part[0]);
- }
- } else {
- /* normal behaviour */
- result = open_file(¶ms.rd, &file);
- if (result != FILE_ERR_OK) {
- prom_printf("%s:%d,", params.rd.dev, params.rd.part);
- prom_perror(result, params.rd.file);
- }
- else {
+ } else {
#define INITRD_CHUNKSIZE 0x200000
- initrd_base = prom_claim(loadinfo.base+loadinfo.memsize, INITRD_CHUNKSIZE, 0);
- if (initrd_base == (void *)-1) {
- prom_printf("\nClaim failed for initrd memory\n");
- initrd_base = 0;
- } else {
- initrd_size = file.fs->read(&file, INITRD_CHUNKSIZE, initrd_base);
- prom_printf(".");
- if (initrd_size == 0)
- initrd_base = 0;
- initrd_read = initrd_size;
- initrd_more = initrd_base;
- while (initrd_read == INITRD_CHUNKSIZE ) { /* need to read more? */
- initrd_want = (void *)((unsigned long)initrd_more+INITRD_CHUNKSIZE);
- initrd_more = prom_claim(initrd_want, INITRD_CHUNKSIZE, 0);
- if (initrd_more != initrd_want) {
- prom_printf("\nClaim failed for initrd memory at %p rc=%p\n",initrd_want,initrd_more);
- break;
- }
- initrd_read = file.fs->read(&file, INITRD_CHUNKSIZE, initrd_more);
- prom_printf(".");
- DEBUG_F(" block at %p rc=%lu\n",initrd_more,initrd_read);
- initrd_size += initrd_read;
- }
- }
- prom_printf(".\n");
- file.fs->close(&file);
- memset(&file, 0, sizeof(file));
- }
- }
- if (initrd_base)
- prom_printf("ramdisk loaded at %p, size: %lu Kbytes\n",
- initrd_base, initrd_size >> 10);
- else {
- prom_printf("ramdisk load failed !\n");
- prom_pause();
- }
- }
-
- DEBUG_F("setting kernel args to: %s\n", params.args);
- prom_setargs(params.args);
- DEBUG_F("flushing icache...");
- flush_icache_range ((long)loadinfo.base, (long)loadinfo.base+loadinfo.memsize);
- DEBUG_F(" done\n");
-
- if (flat_vmlinux) {
- /*
- * Fill new boot infos (only if booting a vmlinux).
- *
- * The birec is low on memory, probably inside the malloc pool,
- * so we don't write it earlier. At this point, we should not
- * use anything coming from the malloc pool.
- */
- birec = (struct bi_record *)_ALIGN(loadinfo.filesize+(1<<20)-1,(1<<20));
-
- /* We make sure it's mapped. We map only 64k for now, it's
- * plenty enough we don't claim since this precise memory
- * range may already be claimed by the malloc pool.
- */
- prom_map (birec, birec, 0x10000);
- DEBUG_F("birec at %p\n", birec);
- DEBUG_SLEEP;
-
- birec->tag = BI_FIRST;
- birec->size = sizeof(struct bi_record);
- birec = (struct bi_record *)((ulong)birec + birec->size);
-
- birec->tag = BI_BOOTLOADER_ID;
- sprintf( (char *)birec->data, "yaboot");
- birec->size = sizeof(struct bi_record) + strlen("yaboot") + 1;
- birec = (struct bi_record *)((ulong)birec + birec->size);
-
- birec->tag = BI_MACHTYPE;
- birec->data[0] = _machine;
- birec->size = sizeof(struct bi_record) + sizeof(ulong);
- birec = (struct bi_record *)((ulong)birec + birec->size);
-
- if (sysmap_base) {
- birec->tag = BI_SYSMAP;
- birec->data[0] = (ulong)sysmap_base;
- birec->data[1] = sysmap_size;
- birec->size = sizeof(struct bi_record) + sizeof(ulong)*2;
- birec = (struct bi_record *)((ulong)birec + birec->size);
- }
- birec->tag = BI_LAST;
- birec->size = sizeof(struct bi_record);
- birec = (struct bi_record *)((ulong)birec + birec->size);
- }
-
- /* compute the kernel's entry point. */
- kernel_entry = loadinfo.base + loadinfo.entry - loadinfo.load_loc;
-
- DEBUG_F("Kernel entry point = %p\n", kernel_entry);
- DEBUG_F("kernel: arg1 = %p,\n"
- " arg2 = 0x%08lx,\n"
- " prom = %p,\n"
- " arg4 = %d,\n"
- " arg5 = %d\n\n",
- initrd_base + loadinfo.load_loc, initrd_size, prom, 0, 0);
-
- DEBUG_F("Entering kernel...\n");
-
- /* call the kernel with our stack. */
- kernel_entry(initrd_base + loadinfo.load_loc, initrd_size, prom, 0, 0);
- continue;
- next:
- ; /* do nothing */
- }
+ initrd_base = prom_claim(loadinfo.base+loadinfo.memsize,
+ INITRD_CHUNKSIZE, 0);
+ if (initrd_base == (void *)-1) {
+ prom_printf("\nClaim failed for initrd memory\n");
+ initrd_base = 0;
+ } else {
+ initrd_size = file.fs->read(&file, INITRD_CHUNKSIZE,
+ initrd_base);
+ prom_printf(".");
+ if (initrd_size == 0)
+ initrd_base = 0;
+ initrd_read = initrd_size;
+ initrd_more = initrd_base;
+ while (initrd_read == INITRD_CHUNKSIZE ) {
+ /* need to read more? */
+ initrd_want = (void *)((unsigned long)initrd_more
+ + INITRD_CHUNKSIZE);
+ initrd_more = prom_claim(initrd_want,
+ INITRD_CHUNKSIZE, 0);
+ if (initrd_more != initrd_want) {
+ prom_printf("\nClaim failed for initrd memory"
+ " at %p rc=%p\n",initrd_want,initrd_more);
+ break;
+ }
+ initrd_read = file.fs->read(&file,
+ INITRD_CHUNKSIZE, initrd_more);
+ prom_printf(".");
+ DEBUG_F(" block at %p rc=%lu\n",
+ initrd_more,initrd_read);
+ initrd_size += initrd_read;
+ }
+ }
+ prom_printf(".\n");
+ file.fs->close(&file);
+ memset(&file, 0, sizeof(file));
+ }
+ }
+ if (initrd_base)
+ prom_printf("ramdisk loaded at %p, size: %lu Kbytes\n",
+ initrd_base, initrd_size >> 10);
+ else {
+ prom_printf("ramdisk load failed !\n");
+ prom_pause();
+ }
+ }
+
+ DEBUG_F("setting kernel args to: %s\n", params.args);
+ prom_setargs(params.args);
+ DEBUG_F("flushing icache...");
+ flush_icache_range ((long)loadinfo.base,
+ (long)loadinfo.base + loadinfo.memsize);
+ DEBUG_F(" done\n");
+
+ if (flat_vmlinux) {
+ /*
+ * Fill new boot infos (only if booting a vmlinux).
+ *
+ * The birec is low on memory, probably inside the malloc pool,
+ * so we don't write it earlier. At this point, we should not
+ * use anything coming from the malloc pool.
+ */
+ birec = (struct bi_record *)_ALIGN(
+ loadinfo.filesize + (1<<20)-1, (1<<20));
+
+ /* We make sure it's mapped. We map only 64k for now, it's
+ * plenty enough we don't claim since this precise memory
+ * range may already be claimed by the malloc pool.
+ */
+ prom_map (birec, birec, 0x10000);
+ DEBUG_F("birec at %p\n", birec);
+ DEBUG_SLEEP;
+
+ birec->tag = BI_FIRST;
+ birec->size = sizeof(struct bi_record);
+ birec = (struct bi_record *)((ulong)birec + birec->size);
+
+ birec->tag = BI_BOOTLOADER_ID;
+ sprintf( (char *)birec->data, "yaboot");
+ birec->size = sizeof(struct bi_record) + strlen("yaboot") + 1;
+ birec = (struct bi_record *)((ulong)birec + birec->size);
+
+ birec->tag = BI_MACHTYPE;
+ birec->data[0] = _machine;
+ birec->size = sizeof(struct bi_record) + sizeof(ulong);
+ birec = (struct bi_record *)((ulong)birec + birec->size);
+
+ if (sysmap_base) {
+ birec->tag = BI_SYSMAP;
+ birec->data[0] = (ulong)sysmap_base;
+ birec->data[1] = sysmap_size;
+ birec->size = sizeof(struct bi_record) + sizeof(ulong)*2;
+ birec = (struct bi_record *)((ulong)birec + birec->size);
+ }
+ birec->tag = BI_LAST;
+ birec->size = sizeof(struct bi_record);
+ birec = (struct bi_record *)((ulong)birec + birec->size);
+ }
+
+ /* compute the kernel's entry point. */
+ kernel_entry = loadinfo.base + loadinfo.entry - loadinfo.load_loc;
+
+ DEBUG_F("Kernel entry point = %p\n", kernel_entry);
+ DEBUG_F("kernel: arg1 = %p,\n"
+ " arg2 = 0x%08lx,\n"
+ " prom = %p,\n"
+ " arg4 = %d,\n"
+ " arg5 = %d\n\n",
+ initrd_base + loadinfo.load_loc, initrd_size, prom, 0, 0);
+
+ DEBUG_F("Entering kernel...\n");
+
+ /* call the kernel with our stack. */
+ kernel_entry(initrd_base + loadinfo.load_loc, initrd_size, prom, 0, 0);
+ continue;
+ next:
+ ; /* do nothing */
+ }
}
static int
load_elf32(struct boot_file_t *file, loadinfo_t *loadinfo)
{
- int i;
- Elf32_Ehdr *e = &(loadinfo->elf.elf32hdr);
- Elf32_Phdr *p, *ph;
- int size = sizeof(Elf32_Ehdr) - sizeof(Elf_Ident);
- unsigned long addr, loadaddr;
-
- /* Read the rest of the Elf header... */
- if ( ( compressed_file ?
- gunzip_read(&e->e_version, size) :
- (*(file->fs->read))(file, size, &e->e_version)
- ) < size)
- {
- prom_printf("\nCan't read Elf32 image header\n");
- return 0;
- }
-
- DEBUG_F("Elf32 header:\n");
- DEBUG_F(" e.e_type = %d\n", (int)e->e_type);
- DEBUG_F(" e.e_machine = %d\n", (int)e->e_machine);
- DEBUG_F(" e.e_version = %d\n", (int)e->e_version);
- DEBUG_F(" e.e_entry = 0x%08x\n", (int)e->e_entry);
- DEBUG_F(" e.e_phoff = 0x%08x\n", (int)e->e_phoff);
- DEBUG_F(" e.e_shoff = 0x%08x\n", (int)e->e_shoff);
- DEBUG_F(" e.e_flags = %d\n", (int)e->e_flags);
- DEBUG_F(" e.e_ehsize = 0x%08x\n", (int)e->e_ehsize);
- DEBUG_F(" e.e_phentsize = 0x%08x\n", (int)e->e_phentsize);
- DEBUG_F(" e.e_phnum = %d\n", (int)e->e_phnum);
-
- loadinfo->entry = e->e_entry;
-
- if (e->e_phnum > MAX_HEADERS) {
- prom_printf ("Can only load kernels with one program header\n");
- return 0;
- }
-
- ph = (Elf32_Phdr *)malloc(sizeof(Elf32_Phdr) * e->e_phnum);
- if (!ph) {
- prom_printf ("Malloc error\n");
- return 0;
- }
-
- /* Now, we read the section header */
- if ( ( compressed_file ?
- gunzip_seek(e->e_phoff) :
- (*(file->fs->seek))(file, e->e_phoff)
- ) != FILE_ERR_OK) {
- prom_printf ("seek error\n");
- return 0;
- }
- if ( ( compressed_file ?
- gunzip_read(ph, sizeof(Elf32_Phdr) * e->e_phnum) :
- (*(file->fs->read))(file, sizeof(Elf32_Phdr) * e->e_phnum, ph)
- ) != sizeof(Elf32_Phdr) * e->e_phnum)
- {
- prom_printf ("read error\n");
- return 0;
- }
-
- /* Scan through the program header
- * HACK: We must return the _memory size of the kernel image, not the
- * file size (because we have to leave room before other boot
- * infos. This code works as a side effect of the fact that
- * we have one section and vaddr == p_paddr
- */
- loadinfo->memsize = loadinfo->filesize = loadinfo->offset = 0;
- p = ph;
- for (i = 0; i < e->e_phnum; ++i, ++p) {
- if (p->p_type != PT_LOAD || p->p_offset == 0)
- continue;
- if (loadinfo->memsize == 0) {
- loadinfo->offset = p->p_offset;
- loadinfo->memsize = p->p_memsz;
- loadinfo->filesize = p->p_filesz;
- loadinfo->load_loc = p->p_vaddr;
- } else {
- loadinfo->memsize = p->p_offset + p->p_memsz - loadinfo->offset; /* XXX Bogus */
- loadinfo->filesize = p->p_offset + p->p_filesz - loadinfo->offset;
- }
- }
-
- if (loadinfo->memsize == 0) {
- prom_printf("Can't find a loadable segment !\n");
- return 0;
- }
-
- /* leave some room (1Mb) for boot infos */
- loadinfo->memsize = _ALIGN(loadinfo->memsize,(1<<20)) + 0x100000;
- /* Claim OF memory */
- DEBUG_F("Before prom_claim, mem_sz: 0x%08lx\n", loadinfo->memsize);
-
- /* Determine whether we are trying to boot a vmlinux or some
- * other binary image (eg, zImage). We load vmlinux's at
- * KERNELADDR and all other binaries at their e_entry value.
- */
- if (e->e_entry == KERNEL_LINK_ADDR_PPC32) {
- flat_vmlinux = 1;
- loadaddr = KERNELADDR;
- } else {
- flat_vmlinux = 0;
- loadaddr = e->e_entry;
- }
- if ( kernel_position > 0 ) {
- flat_vmlinux = 1;
- loadaddr = KERNELADDR;
- loadinfo->memsize = kernel_size;
- }
-
- /* On some systems, loadaddr may already be claimed, so try some
- * other nearby addresses before giving up.
- */
- for(addr=loadaddr; addr <= loadaddr * 8 ;addr+=0x100000) {
- loadinfo->base = prom_claim((void *)addr, loadinfo->memsize, 0);
- if (loadinfo->base != (void *)-1) break;
- }
- if (loadinfo->base == (void *)-1) {
- prom_printf("Claim error, can't allocate kernel memory\n");
- return 0;
- }
-
- DEBUG_F("After ELF parsing, load base: %p, mem_sz: 0x%08lx\n",
- loadinfo->base, loadinfo->memsize);
- DEBUG_F(" wanted load base: 0x%08lx, mem_sz: 0x%08lx\n",
- loadaddr, loadinfo->memsize);
+ int i;
+ Elf32_Ehdr *e = &(loadinfo->elf.elf32hdr);
+ Elf32_Phdr *p, *ph;
+ int size = sizeof(Elf32_Ehdr) - sizeof(Elf_Ident);
+ unsigned long addr, loadaddr;
+
+ /* Read the rest of the Elf header... */
+ if ( ( compressed_file ?
+ gunzip_read(&e->e_version, size) :
+ (*(file->fs->read))(file, size, &e->e_version)
+ ) < size) {
+ prom_printf("\nCan't read Elf32 image header\n");
+ return 0;
+ }
- if ( kernel_position == 0 ) {
- /* Load the program segments... */
+ DEBUG_F("Elf32 header:\n");
+ DEBUG_F(" e.e_type = %d\n", (int)e->e_type);
+ DEBUG_F(" e.e_machine = %d\n", (int)e->e_machine);
+ DEBUG_F(" e.e_version = %d\n", (int)e->e_version);
+ DEBUG_F(" e.e_entry = 0x%08x\n", (int)e->e_entry);
+ DEBUG_F(" e.e_phoff = 0x%08x\n", (int)e->e_phoff);
+ DEBUG_F(" e.e_shoff = 0x%08x\n", (int)e->e_shoff);
+ DEBUG_F(" e.e_flags = %d\n", (int)e->e_flags);
+ DEBUG_F(" e.e_ehsize = 0x%08x\n", (int)e->e_ehsize);
+ DEBUG_F(" e.e_phentsize = 0x%08x\n", (int)e->e_phentsize);
+ DEBUG_F(" e.e_phnum = %d\n", (int)e->e_phnum);
+
+ loadinfo->entry = e->e_entry;
+
+ if (e->e_phnum > MAX_HEADERS) {
+ prom_printf ("Can only load kernels with one program header\n");
+ return 0;
+ }
+
+ ph = (Elf32_Phdr *)malloc(sizeof(Elf32_Phdr) * e->e_phnum);
+ if (!ph) {
+ prom_printf ("Malloc error\n");
+ return 0;
+ }
+
+ /* Now, we read the section header */
+ if ( ( compressed_file ?
+ gunzip_seek(e->e_phoff) :
+ (*(file->fs->seek))(file, e->e_phoff)
+ ) != FILE_ERR_OK) {
+ prom_printf ("seek error\n");
+ return 0;
+ }
+ if ( ( compressed_file ?
+ gunzip_read(ph, sizeof(Elf32_Phdr) * e->e_phnum) :
+ (*(file->fs->read))(file, sizeof(Elf32_Phdr) * e->e_phnum, ph)
+ ) != sizeof(Elf32_Phdr) * e->e_phnum) {
+ prom_printf ("read error\n");
+ return 0;
+ }
+
+ /* Scan through the program header
+ * HACK: We must return the _memory size of the kernel image, not the
+ * file size (because we have to leave room before other boot
+ * infos. This code works as a side effect of the fact that
+ * we have one section and vaddr == p_paddr
+ */
+ loadinfo->memsize = loadinfo->filesize = loadinfo->offset = 0;
p = ph;
for (i = 0; i < e->e_phnum; ++i, ++p) {
- unsigned long offset;
if (p->p_type != PT_LOAD || p->p_offset == 0)
continue;
+ if (loadinfo->memsize == 0) {
+ loadinfo->offset = p->p_offset;
+ loadinfo->memsize = p->p_memsz;
+ loadinfo->filesize = p->p_filesz;
+ loadinfo->load_loc = p->p_vaddr;
+ } else {
+ /* XXX Bogus */
+ loadinfo->memsize = p->p_offset + p->p_memsz - loadinfo->offset;
+ loadinfo->filesize = p->p_offset + p->p_filesz - loadinfo->offset;
+ }
+ }
- /* Now, we skip to the image itself */
- if ( ( compressed_file ?
- gunzip_seek(p->p_offset) :
- (*(file->fs->seek))(file, p->p_offset)
- ) != FILE_ERR_OK)
- {
+ if (loadinfo->memsize == 0) {
+ prom_printf("Can't find a loadable segment !\n");
+ return 0;
+ }
+
+ /* leave some room (1Mb) for boot infos */
+ loadinfo->memsize = _ALIGN(loadinfo->memsize,(1<<20)) + 0x100000;
+ /* Claim OF memory */
+ DEBUG_F("Before prom_claim, mem_sz: 0x%08lx\n", loadinfo->memsize);
+
+ /* Determine whether we are trying to boot a vmlinux or some
+ * other binary image (eg, zImage). We load vmlinux's at
+ * KERNELADDR and all other binaries at their e_entry value.
+ */
+ if (e->e_entry == KERNEL_LINK_ADDR_PPC32) {
+ flat_vmlinux = 1;
+ loadaddr = KERNELADDR;
+ } else {
+ flat_vmlinux = 0;
+ loadaddr = e->e_entry;
+ }
+ if ( kernel_position > 0 ) {
+ flat_vmlinux = 1;
+ loadaddr = KERNELADDR;
+ loadinfo->memsize = kernel_size;
+ }
+
+ /* On some systems, loadaddr may already be claimed, so try some
+ * other nearby addresses before giving up.
+ */
+ for(addr=loadaddr; addr <= loadaddr * 8; addr+=0x100000) {
+ loadinfo->base = prom_claim((void *)addr, loadinfo->memsize, 0);
+ if (loadinfo->base != (void *)-1) break;
+ }
+ if (loadinfo->base == (void *)-1) {
+ prom_printf("Claim error, can't allocate kernel memory\n");
+ return 0;
+ }
+
+ DEBUG_F("After ELF parsing, load base: %p, mem_sz: 0x%08lx\n",
+ loadinfo->base, loadinfo->memsize);
+ DEBUG_F(" wanted load base: 0x%08lx, mem_sz: 0x%08lx\n",
+ loadaddr, loadinfo->memsize);
+
+ if ( kernel_position == 0 ) {
+ /* Load the program segments... */
+ p = ph;
+ for (i = 0; i < e->e_phnum; ++i, ++p) {
+ unsigned long offset;
+ if (p->p_type != PT_LOAD || p->p_offset == 0)
+ continue;
+
+ /* Now, we skip to the image itself */
+ if ( ( compressed_file ?
+ gunzip_seek(p->p_offset) :
+ (*(file->fs->seek))(file, p->p_offset)
+ ) != FILE_ERR_OK) {
+ prom_printf ("Seek error\n");
+ prom_release(loadinfo->base, loadinfo->memsize);
+ return 0;
+ }
+ offset = p->p_vaddr - loadinfo->load_loc;
+ if ( ( compressed_file ?
+ gunzip_read(loadinfo->base+offset, p->p_filesz) :
+ (*(file->fs->read))(file, p->p_filesz, loadinfo->base+offset)
+ ) != p->p_filesz ) {
+ prom_printf ("Read failed\n");
+ prom_release(loadinfo->base, loadinfo->memsize);
+ return 0;
+ }
+ }
+ } else {
+ /* load and uncompress vmlinux binary */
+ if ( (*(file->fs->seek))(file, kernel_position) != FILE_ERR_OK) {
prom_printf ("Seek error\n");
prom_release(loadinfo->base, loadinfo->memsize);
return 0;
}
- offset = p->p_vaddr - loadinfo->load_loc;
- if ( ( compressed_file ?
- gunzip_read(loadinfo->base+offset, p->p_filesz) :
- (*(file->fs->read))(file, p->p_filesz, loadinfo->base+offset)
- ) != p->p_filesz )
- {
- prom_printf ("Read failed\n");
+ gunzip_file = *file;
+ gunzip_test_header();
+ if ( !compressed_file ) {
+ prom_printf ("Error: not compressed data at vmlinux position\n");
prom_release(loadinfo->base, loadinfo->memsize);
return 0;
}
+ if ( gunzip_read(loadinfo->base, kernel_size) != kernel_size ) {
+ prom_printf ("Gunzip read failed\n");
+ prom_release(loadinfo->base, loadinfo->memsize);
+ return 0;
+ }
+ }
+
+ free(ph);
+
+ /* Return success at loading the Elf32 kernel */
+ return 1;
+}
+
+static int
+load_elf64(struct boot_file_t *file, loadinfo_t *loadinfo)
+{
+ int i;
+ Elf64_Ehdr *e = &(loadinfo->elf.elf64hdr);
+ Elf64_Phdr *p, *ph;
+ int size = sizeof(Elf64_Ehdr) - sizeof(Elf_Ident);
+ unsigned long addr, loadaddr;
+
+ /* Read the rest of the Elf header... */
+ if ((*(file->fs->read))(file, size, &e->e_version) < size) {
+ prom_printf("\nCan't read Elf64 image header\n");
+ return 0;
+ }
+
+ DEBUG_F("Elf64 header:\n");
+ DEBUG_F(" e.e_type = %d\n", (int)e->e_type);
+ DEBUG_F(" e.e_machine = %d\n", (int)e->e_machine);
+ DEBUG_F(" e.e_version = %d\n", (int)e->e_version);
+ DEBUG_F(" e.e_entry = 0x%016lx\n", (long)e->e_entry);
+ DEBUG_F(" e.e_phoff = 0x%016lx\n", (long)e->e_phoff);
+ DEBUG_F(" e.e_shoff = 0x%016lx\n", (long)e->e_shoff);
+ DEBUG_F(" e.e_flags = %d\n", (int)e->e_flags);
+ DEBUG_F(" e.e_ehsize = 0x%08x\n", (int)e->e_ehsize);
+ DEBUG_F(" e.e_phentsize = 0x%08x\n", (int)e->e_phentsize);
+ DEBUG_F(" e.e_phnum = %d\n", (int)e->e_phnum);
+
+ loadinfo->entry = e->e_entry;
+
+ if (e->e_phnum > MAX_HEADERS) {
+ prom_printf ("Can only load kernels with one program header\n");
+ return 0;
}
- } else {
- /* load and uncompress vmlinux binary */
- if ( (*(file->fs->seek))(file, kernel_position) != FILE_ERR_OK) {
+
+ ph = (Elf64_Phdr *)malloc(sizeof(Elf64_Phdr) * e->e_phnum);
+ if (!ph) {
+ prom_printf ("Malloc error\n");
+ return 0;
+ }
+
+ /* Now, we read the section header */
+ if ((*(file->fs->seek))(file, e->e_phoff) != FILE_ERR_OK) {
prom_printf ("Seek error\n");
- prom_release(loadinfo->base, loadinfo->memsize);
return 0;
}
- gunzip_file = *file;
- gunzip_test_header();
- if ( !compressed_file ) {
- prom_printf ("Error: not compressed data at vmlinux position\n");
- prom_release(loadinfo->base, loadinfo->memsize);
+ if ((*(file->fs->read))(file, sizeof(Elf64_Phdr) * e->e_phnum, ph) !=
+ sizeof(Elf64_Phdr) * e->e_phnum) {
+ prom_printf ("Read error\n");
return 0;
}
- if ( gunzip_read(loadinfo->base, kernel_size) != kernel_size ) {
- prom_printf ("Gunzip read failed\n");
- prom_release(loadinfo->base, loadinfo->memsize);
+
+ /* Scan through the program header
+ * HACK: We must return the _memory size of the kernel image, not the
+ * file size (because we have to leave room before other boot
+ * infos. This code works as a side effect of the fact that
+ * we have one section and vaddr == p_paddr
+ */
+ loadinfo->memsize = loadinfo->filesize = loadinfo->offset = 0;
+ p = ph;
+ for (i = 0; i < e->e_phnum; ++i, ++p) {
+ if (p->p_type != PT_LOAD || p->p_offset == 0)
+ continue;
+ if (loadinfo->memsize == 0) {
+ loadinfo->offset = p->p_offset;
+ loadinfo->memsize = p->p_memsz;
+ loadinfo->filesize = p->p_filesz;
+ loadinfo->load_loc = p->p_vaddr;
+ } else {
+ /* XXX Bogus */
+ loadinfo->memsize = p->p_offset + p->p_memsz - loadinfo->offset;
+ loadinfo->filesize = p->p_offset + p->p_filesz - loadinfo->offset;
+ }
+ }
+
+ if (loadinfo->memsize == 0) {
+ prom_printf("Can't find a loadable segment !\n");
return 0;
- }
- }
+ }
- free(ph);
-
- /* Return success at loading the Elf32 kernel */
- return 1;
-}
+ /* leave some room (1Mb) for boot infos */
+ loadinfo->memsize = _ALIGN(loadinfo->memsize,(1<<20)) + 0x100000;
+ /* Claim OF memory */
+ DEBUG_F("Before prom_claim, mem_sz: 0x%08lx\n", loadinfo->memsize);
+
+ /* Determine whether we are trying to boot a vmlinux or some
+ * other binary image (eg, zImage). We load vmlinux's at
+ * KERNELADDR and all other binaries at their e_entry value.
+ */
+ if (e->e_entry == KERNEL_LINK_ADDR_PPC64) {
+ flat_vmlinux = 1;
+ loadaddr = KERNELADDR;
+ } else {
+ flat_vmlinux = 0;
+ loadaddr = e->e_entry;
+ }
-static int
-load_elf64(struct boot_file_t *file, loadinfo_t *loadinfo)
-{
- int i;
- Elf64_Ehdr *e = &(loadinfo->elf.elf64hdr);
- Elf64_Phdr *p, *ph;
- int size = sizeof(Elf64_Ehdr) - sizeof(Elf_Ident);
- unsigned long addr, loadaddr;
-
- /* Read the rest of the Elf header... */
- if ((*(file->fs->read))(file, size, &e->e_version) < size) {
- prom_printf("\nCan't read Elf64 image header\n");
- return 0;
- }
-
- DEBUG_F("Elf64 header:\n");
- DEBUG_F(" e.e_type = %d\n", (int)e->e_type);
- DEBUG_F(" e.e_machine = %d\n", (int)e->e_machine);
- DEBUG_F(" e.e_version = %d\n", (int)e->e_version);
- DEBUG_F(" e.e_entry = 0x%016lx\n", (long)e->e_entry);
- DEBUG_F(" e.e_phoff = 0x%016lx\n", (long)e->e_phoff);
- DEBUG_F(" e.e_shoff = 0x%016lx\n", (long)e->e_shoff);
- DEBUG_F(" e.e_flags = %d\n", (int)e->e_flags);
- DEBUG_F(" e.e_ehsize = 0x%08x\n", (int)e->e_ehsize);
- DEBUG_F(" e.e_phentsize = 0x%08x\n", (int)e->e_phentsize);
- DEBUG_F(" e.e_phnum = %d\n", (int)e->e_phnum);
-
- loadinfo->entry = e->e_entry;
-
- if (e->e_phnum > MAX_HEADERS) {
- prom_printf ("Can only load kernels with one program header\n");
- return 0;
- }
-
- ph = (Elf64_Phdr *)malloc(sizeof(Elf64_Phdr) * e->e_phnum);
- if (!ph) {
- prom_printf ("Malloc error\n");
- return 0;
- }
-
- /* Now, we read the section header */
- if ((*(file->fs->seek))(file, e->e_phoff) != FILE_ERR_OK) {
- prom_printf ("Seek error\n");
- return 0;
- }
- if ((*(file->fs->read))(file, sizeof(Elf64_Phdr) * e->e_phnum, ph) !=
- sizeof(Elf64_Phdr) * e->e_phnum) {
- prom_printf ("Read error\n");
- return 0;
- }
-
- /* Scan through the program header
- * HACK: We must return the _memory size of the kernel image, not the
- * file size (because we have to leave room before other boot
- * infos. This code works as a side effect of the fact that
- * we have one section and vaddr == p_paddr
- */
- loadinfo->memsize = loadinfo->filesize = loadinfo->offset = 0;
- p = ph;
- for (i = 0; i < e->e_phnum; ++i, ++p) {
- if (p->p_type != PT_LOAD || p->p_offset == 0)
- continue;
- if (loadinfo->memsize == 0) {
- loadinfo->offset = p->p_offset;
- loadinfo->memsize = p->p_memsz;
- loadinfo->filesize = p->p_filesz;
- loadinfo->load_loc = p->p_vaddr;
- } else {
- loadinfo->memsize = p->p_offset + p->p_memsz - loadinfo->offset; /* XXX Bogus */
- loadinfo->filesize = p->p_offset + p->p_filesz - loadinfo->offset;
- }
- }
-
- if (loadinfo->memsize == 0) {
- prom_printf("Can't find a loadable segment !\n");
- return 0;
- }
-
- /* leave some room (1Mb) for boot infos */
- loadinfo->memsize = _ALIGN(loadinfo->memsize,(1<<20)) + 0x100000;
- /* Claim OF memory */
- DEBUG_F("Before prom_claim, mem_sz: 0x%08lx\n", loadinfo->memsize);
-
- /* Determine whether we are trying to boot a vmlinux or some
- * other binary image (eg, zImage). We load vmlinux's at
- * KERNELADDR and all other binaries at their e_entry value.
- */
- if (e->e_entry == KERNEL_LINK_ADDR_PPC64) {
- flat_vmlinux = 1;
- loadaddr = KERNELADDR;
- } else {
- flat_vmlinux = 0;
- loadaddr = e->e_entry;
- }
-
- /* On some systems, loadaddr may already be claimed, so try some
- * other nearby addresses before giving up.
- */
- for(addr=loadaddr; addr <= loadaddr * 8 ;addr+=0x100000) {
- loadinfo->base = prom_claim((void *)addr, loadinfo->memsize, 0);
- if (loadinfo->base != (void *)-1) break;
- }
- if (loadinfo->base == (void *)-1) {
- prom_printf("Claim error, can't allocate kernel memory\n");
- return 0;
- }
-
- DEBUG_F("After ELF parsing, load base: %p, mem_sz: 0x%08lx\n",
- loadinfo->base, loadinfo->memsize);
- DEBUG_F(" wanted load base: 0x%08lx, mem_sz: 0x%08lx\n",
- loadaddr, loadinfo->memsize);
-
- /* Load the program segments... */
- p = ph;
- for (i = 0; i < e->e_phnum; ++i, ++p) {
- unsigned long offset;
- if (p->p_type != PT_LOAD || p->p_offset == 0)
- continue;
-
- /* Now, we skip to the image itself */
- if ((*(file->fs->seek))(file, p->p_offset) != FILE_ERR_OK) {
- prom_printf ("Seek error\n");
- prom_release(loadinfo->base, loadinfo->memsize);
- return 0;
- }
- offset = p->p_vaddr - loadinfo->load_loc;
- if ((*(file->fs->read))(file, p->p_filesz, loadinfo->base+offset) != p->p_filesz) {
- prom_printf ("Read failed\n");
- prom_release(loadinfo->base, loadinfo->memsize);
- return 0;
- }
- }
-
- free(ph);
-
- /* Return success at loading the Elf64 kernel */
- return 1;
+ /* On some systems, loadaddr may already be claimed, so try some
+ * other nearby addresses before giving up.
+ */
+ for(addr=loadaddr; addr <= loadaddr * 8 ;addr+=0x100000) {
+ loadinfo->base = prom_claim((void *)addr, loadinfo->memsize, 0);
+ if (loadinfo->base != (void *)-1) break;
+ }
+ if (loadinfo->base == (void *)-1) {
+ prom_printf("Claim error, can't allocate kernel memory\n");
+ return 0;
+ }
+
+ DEBUG_F("After ELF parsing, load base: %p, mem_sz: 0x%08lx\n",
+ loadinfo->base, loadinfo->memsize);
+ DEBUG_F(" wanted load base: 0x%08lx, mem_sz: 0x%08lx\n",
+ loadaddr, loadinfo->memsize);
+
+ /* Load the program segments... */
+ p = ph;
+ for (i = 0; i < e->e_phnum; ++i, ++p) {
+ unsigned long offset;
+ if (p->p_type != PT_LOAD || p->p_offset == 0)
+ continue;
+
+ /* Now, we skip to the image itself */
+ if ((*(file->fs->seek))(file, p->p_offset) != FILE_ERR_OK) {
+ prom_printf ("Seek error\n");
+ prom_release(loadinfo->base, loadinfo->memsize);
+ return 0;
+ }
+ offset = p->p_vaddr - loadinfo->load_loc;
+ if ((*(file->fs->read))(file, p->p_filesz, loadinfo->base+offset)
+ != p->p_filesz) {
+ prom_printf ("Read failed\n");
+ prom_release(loadinfo->base, loadinfo->memsize);
+ return 0;
+ }
+ }
+
+ free(ph);
+
+ /* Return success at loading the Elf64 kernel */
+ return 1;
}
static int
is_elf32(loadinfo_t *loadinfo)
{
- Elf32_Ehdr *e = &(loadinfo->elf.elf32hdr);
+ Elf32_Ehdr *e = &(loadinfo->elf.elf32hdr);
- return (e->e_ident[EI_MAG0] == ELFMAG0 &&
- e->e_ident[EI_MAG1] == ELFMAG1 &&
- e->e_ident[EI_MAG2] == ELFMAG2 &&
- e->e_ident[EI_MAG3] == ELFMAG3 &&
- e->e_ident[EI_CLASS] == ELFCLASS32 &&
- e->e_ident[EI_DATA] == ELFDATA2MSB &&
- e->e_type == ET_EXEC &&
- e->e_machine == EM_PPC);
+ return (e->e_ident[EI_MAG0] == ELFMAG0 &&
+ e->e_ident[EI_MAG1] == ELFMAG1 &&
+ e->e_ident[EI_MAG2] == ELFMAG2 &&
+ e->e_ident[EI_MAG3] == ELFMAG3 &&
+ e->e_ident[EI_CLASS] == ELFCLASS32 &&
+ e->e_ident[EI_DATA] == ELFDATA2MSB &&
+ e->e_type == ET_EXEC &&
+ e->e_machine == EM_PPC);
}
static int
is_elf64(loadinfo_t *loadinfo)
{
- Elf64_Ehdr *e = &(loadinfo->elf.elf64hdr);
+ Elf64_Ehdr *e = &(loadinfo->elf.elf64hdr);
- return (e->e_ident[EI_MAG0] == ELFMAG0 &&
- e->e_ident[EI_MAG1] == ELFMAG1 &&
- e->e_ident[EI_MAG2] == ELFMAG2 &&
- e->e_ident[EI_MAG3] == ELFMAG3 &&
- e->e_ident[EI_CLASS] == ELFCLASS64 &&
- e->e_ident[EI_DATA] == ELFDATA2MSB &&
- e->e_type == ET_EXEC &&
- e->e_machine == EM_PPC64);
+ return (e->e_ident[EI_MAG0] == ELFMAG0 &&
+ e->e_ident[EI_MAG1] == ELFMAG1 &&
+ e->e_ident[EI_MAG2] == ELFMAG2 &&
+ e->e_ident[EI_MAG3] == ELFMAG3 &&
+ e->e_ident[EI_CLASS] == ELFCLASS64 &&
+ e->e_ident[EI_DATA] == ELFDATA2MSB &&
+ e->e_type == ET_EXEC &&
+ e->e_machine == EM_PPC64);
}
static void
setup_display(void)
{
#ifdef CONFIG_SET_COLORMAP
- static unsigned char default_colors[] = {
- 0x00, 0x00, 0x00,
- 0x00, 0x00, 0xaa,
- 0x00, 0xaa, 0x00,
- 0x00, 0xaa, 0xaa,
- 0xaa, 0x00, 0x00,
- 0xaa, 0x00, 0xaa,
- 0xaa, 0x55, 0x00,
- 0xaa, 0xaa, 0xaa,
- 0x55, 0x55, 0x55,
- 0x55, 0x55, 0xff,
- 0x55, 0xff, 0x55,
- 0x55, 0xff, 0xff,
- 0xff, 0x55, 0x55,
- 0xff, 0x55, 0xff,
- 0xff, 0xff, 0x55,
- 0xff, 0xff, 0xff
- };
- int i, result;
- prom_handle scrn = PROM_INVALID_HANDLE;
-
- /* Try Apple's mac-boot screen ihandle */
- result = (int)call_prom_return("interpret", 1, 2,
- "\" _screen-ihandle\" $find if execute else 0 then", &scrn);
- DEBUG_F("Trying to get screen ihandle, result: %d, scrn: %p\n", result, scrn);
-
- if (scrn == 0 || scrn == PROM_INVALID_HANDLE) {
- char type[32];
- /* Hrm... check to see if stdout is a display */
- scrn = call_prom ("instance-to-package", 1, 1, prom_stdout);
- DEBUG_F("instance-to-package of stdout is: %p\n", scrn);
- if (prom_getprop(scrn, "device_type", type, 32) > 0 && !strncmp(type, "display", 7)) {
- DEBUG_F("got it ! stdout is a screen\n");
- scrn = prom_stdout;
- } else {
- /* Else, we try to open the package */
- scrn = (prom_handle)call_prom( "open", 1, 1, "screen" );
- DEBUG_F("Open screen result: %p\n", scrn);
- }
- }
-
- if (scrn == PROM_INVALID_HANDLE) {
- prom_printf("No screen device found !/n");
- return;
- }
- for(i=0;i<16;i++) {
- prom_set_color(scrn, i, default_colors[i*3],
- default_colors[i*3+1], default_colors[i*3+2]);
- }
- prom_printf("\x1b[1;37m\x1b[2;40m");
+ static unsigned char default_colors[] = {
+ 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xaa,
+ 0x00, 0xaa, 0x00,
+ 0x00, 0xaa, 0xaa,
+ 0xaa, 0x00, 0x00,
+ 0xaa, 0x00, 0xaa,
+ 0xaa, 0x55, 0x00,
+ 0xaa, 0xaa, 0xaa,
+ 0x55, 0x55, 0x55,
+ 0x55, 0x55, 0xff,
+ 0x55, 0xff, 0x55,
+ 0x55, 0xff, 0xff,
+ 0xff, 0x55, 0x55,
+ 0xff, 0x55, 0xff,
+ 0xff, 0xff, 0x55,
+ 0xff, 0xff, 0xff
+ };
+ int i, result;
+ prom_handle scrn = PROM_INVALID_HANDLE;
+
+ /* Try Apple's mac-boot screen ihandle */
+ result = (int)call_prom_return("interpret", 1, 2,
+ "\" _screen-ihandle\" $find if execute else 0 then", &scrn);
+ DEBUG_F("Trying to get screen ihandle, result: %d, scrn: %p\n",
+ result, scrn);
+
+ if (scrn == 0 || scrn == PROM_INVALID_HANDLE) {
+ char type[32];
+ /* Hrm... check to see if stdout is a display */
+ scrn = call_prom ("instance-to-package", 1, 1, prom_stdout);
+ DEBUG_F("instance-to-package of stdout is: %p\n", scrn);
+ if (prom_getprop(scrn, "device_type", type, 32) > 0 &&
+ !strncmp(type, "display", 7)) {
+ DEBUG_F("got it ! stdout is a screen\n");
+ scrn = prom_stdout;
+ } else {
+ /* Else, we try to open the package */
+ scrn = (prom_handle)call_prom( "open", 1, 1, "screen" );
+ DEBUG_F("Open screen result: %p\n", scrn);
+ }
+ }
+
+ if (scrn == PROM_INVALID_HANDLE) {
+ prom_printf("No screen device found !/n");
+ return;
+ }
+ for(i=0;i<16;i++) {
+ prom_set_color(scrn, i, default_colors[i*3],
+ default_colors[i*3+1], default_colors[i*3+2]);
+ }
+ prom_printf("\x1b[1;37m\x1b[2;40m");
#ifdef COLOR_TEST
- for (i=0;i<16; i++) {
- prom_printf("\x1b[%d;%dm\x1b[1;47m%s \x1b[2;40m %s\n",
- ansi_color_table[i].index,
- ansi_color_table[i].value,
- ansi_color_table[i].name,
- ansi_color_table[i].name);
- prom_printf("\x1b[%d;%dm\x1b[1;37m%s \x1b[2;30m %s\n",
- ansi_color_table[i].index,
- ansi_color_table[i].value+10,
- ansi_color_table[i].name,
- ansi_color_table[i].name);
- }
- prom_printf("\x1b[1;37m\x1b[2;40m");
+ for (i=0;i<16; i++) {
+ prom_printf("\x1b[%d;%dm\x1b[1;47m%s \x1b[2;40m %s\n",
+ ansi_color_table[i].index,
+ ansi_color_table[i].value,
+ ansi_color_table[i].name,
+ ansi_color_table[i].name);
+ prom_printf("\x1b[%d;%dm\x1b[1;37m%s \x1b[2;30m %s\n",
+ ansi_color_table[i].index,
+ ansi_color_table[i].value+10,
+ ansi_color_table[i].name,
+ ansi_color_table[i].name);
+ }
+ prom_printf("\x1b[1;37m\x1b[2;40m");
#endif /* COLOR_TEST */
#if !DEBUG
- prom_printf("\xc");
+ prom_printf("\xc");
#endif /* !DEBUG */
#endif /* CONFIG_SET_COLORMAP */
@@ -1632,82 +1654,84 @@
int
yaboot_main(void)
{
- char *ptype;
+ char *ptype;
+
+ if (_machine == _MACH_Pmac)
+ setup_display();
+
+ prom_get_chosen("bootpath", bootdevice, sizeof(bootdevice));
+ DEBUG_F("/chosen/bootpath = %s\n", bootdevice);
+ if (bootdevice[0] == 0) {
+ prom_get_options("boot-device", bootdevice, sizeof(bootdevice));
+ DEBUG_F("boot-device = %s\n", bootdevice);
+ }
+ if (bootdevice[0] == 0) {
+ prom_printf("Couldn't determine boot device\n");
+ return -1;
+ }
+
+ if (!parse_device_path(bootdevice, NULL, -1, "", &boot)) {
+ prom_printf("%s: Unable to parse\n", bootdevice);
+ return -1;
+ }
+ DEBUG_F("After parse_device_path: dev=%s, part=%d, file=%s\n",
+ boot.dev, boot.part, boot.file);
- if (_machine == _MACH_Pmac)
- setup_display();
-
- prom_get_chosen("bootpath", bootdevice, sizeof(bootdevice));
- DEBUG_F("/chosen/bootpath = %s\n", bootdevice);
- if (bootdevice[0] == 0) {
- prom_get_options("boot-device", bootdevice, sizeof(bootdevice));
- DEBUG_F("boot-device = %s\n", bootdevice);
- }
- if (bootdevice[0] == 0) {
- prom_printf("Couldn't determine boot device\n");
- return -1;
- }
-
- if (!parse_device_path(bootdevice, NULL, -1, "", &boot)) {
- prom_printf("%s: Unable to parse\n", bootdevice);
- return -1;
- }
- DEBUG_F("After parse_device_path: dev=%s, part=%d, file=%s\n",
- boot.dev, boot.part, boot.file);
-
- if (strlen(boot.file)) {
- if (!strncmp(boot.file, "\\\\", 2))
- boot.file = "\\\\";
- else {
- char *p, *last;
- p = last = boot.file;
- while(*p) {
- if (*p == '\\')
- last = p;
- p++;
- }
- if (p)
- *(last) = 0;
- else
- boot.file = "";
- if (strlen(boot.file))
- strcat(boot.file, "\\");
- }
- }
- DEBUG_F("After pmac path kludgeup: dev=%s, part=%d, file=%s\n",
- boot.dev, boot.part, boot.file);
+ if (strlen(boot.file)) {
+ if (!strncmp(boot.file, "\\\\", 2))
+ boot.file = "\\\\";
+ else {
+ char *p, *last;
+ p = last = boot.file;
+ while(*p) {
+ if (*p == '\\')
+ last = p;
+ p++;
+ }
+ if (p)
+ *(last) = 0;
+ else
+ boot.file = "";
+ if (strlen(boot.file))
+ strcat(boot.file, "\\");
+ }
+ }
+ DEBUG_F("After pmac path kludgeup: dev=%s, part=%d, file=%s\n",
+ boot.dev, boot.part, boot.file);
- useconf = load_config_file(boot.dev, boot.file, boot.part);
+ useconf = load_config_file(boot.dev, boot.file, boot.part);
- prom_printf("Welcome to yaboot version " VERSION "\n");
- prom_printf("Enter \"help\" to get some basic usage information\n");
+ prom_printf("Welcome to yaboot version " VERSION "\n");
+ prom_printf("Enter \"help\" to get some basic usage information\n");
- /* I am fed up with lusers using the wrong partition type and
+ /* I am fed up with lusers using the wrong partition type and
mailing me *when* it breaks */
- if (_machine == _MACH_Pmac) {
- char *entry = cfg_get_strg(0, "ptypewarning");
- int warn = 1;
- if (entry)
- warn = strcmp(entry,
- "I_know_the_partition_type_is_wrong_and_will_NOT_send_mail_when_booting_breaks");
- if (warn) {
- ptype = get_part_type(boot.dev, boot.part);
- if ((ptype != NULL) && (strcmp(ptype, "Apple_Bootstrap")))
- prom_printf("\nWARNING: Bootstrap partition type is wrong: \"%s\"\n"
- " type should be: \"Apple_Bootstrap\"\n\n", ptype);
- }
- }
-
- yaboot_text_ui();
-
- prom_printf("Bye.\n");
- return 0;
+ if (_machine == _MACH_Pmac) {
+ char *entry = cfg_get_strg(0, "ptypewarning");
+ int warn = 1;
+ if (entry)
+ warn = strcmp(entry, "I_know_the_partition_type_is_wrong_and_will"
+ "_NOT_send_mail_when_booting_breaks");
+ if (warn) {
+ ptype = get_part_type(boot.dev, boot.part);
+ if ((ptype != NULL) && (strcmp(ptype, "Apple_Bootstrap")))
+ prom_printf("\nWARNING: Bootstrap partition type is wrong:"
+ " \"%s\"\n"
+ " type should be: \"Apple_Bootstrap\"\n\n", ptype);
+ }
+ }
+
+ yaboot_text_ui();
+
+ prom_printf("Bye.\n");
+ return 0;
}
-/*
+/*
* Local variables:
* c-file-style: "k&r"
* c-basic-offset: 5
* End:
+ * vim: ts=4:sw=4
*/
More information about the pld-cvs-commit
mailing list