Author: stepan Date: 2006-05-23 00:16:20 +0200 (Tue, 23 May 2006) New Revision: 27
Modified: openbios-devel/arch/sparc32/aoutload.c openbios-devel/arch/sparc32/boot.c openbios-devel/arch/sparc32/elfload.c openbios-devel/arch/sparc32/openbios.c openbios-devel/arch/sparc32/romvec.c openbios-devel/arch/sparc32/tree.fs openbios-devel/config/examples/cross-sparc32_config.xml openbios-devel/config/examples/sparc32_config.xml openbios-devel/include/sparc32/io.h Log: openbios.patch-15-svn25.bz2 part II merge
Modified: openbios-devel/arch/sparc32/aoutload.c =================================================================== --- openbios-devel/arch/sparc32/aoutload.c 2006-05-22 22:10:54 UTC (rev 26) +++ openbios-devel/arch/sparc32/aoutload.c 2006-05-22 22:16:20 UTC (rev 27) @@ -57,16 +57,23 @@ int image_retval; struct exec ehdr; unsigned long start, size; + unsigned int offset;
image_name = image_version = 0;
if (!file_open(filename)) goto out;
- if (lfile_read(&ehdr, sizeof ehdr) != sizeof ehdr) { - debug("Can't read a.out header\n"); - retval = LOADER_NOT_SUPPORT; - goto out; + for (offset = 0; offset < 16 * 512; offset += 512) { + 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 (N_BADMAG(ehdr)) { @@ -76,9 +83,9 @@ }
if (N_MAGIC(ehdr) == NMAGIC) { - size = N_DATADDR(ehdr) + ehdr.a_data; + size = addr_fixup(N_DATADDR(ehdr)) + addr_fixup(ehdr.a_data); } else { - size = ehdr.a_text + ehdr.a_data; + size = addr_fixup(ehdr.a_text) + addr_fixup(ehdr.a_data); }
start = 0x4000; // N_TXTADDR(ehdr); @@ -88,7 +95,7 @@
printf("Loading a.out %s...\n", image_name ? image_name : "image");
- file_seek(N_TXTOFF(ehdr)); + file_seek(offset + N_TXTOFF(ehdr));
if (N_MAGIC(ehdr) == NMAGIC) { if (lfile_read(start, ehdr.a_text) != ehdr.a_text) { @@ -108,18 +115,19 @@
debug("Loaded %lu bytes\n", size);
- debug("entry point is %#x\n", start); + debug("entry point is %#lx\n", start); printf("Jumping to entry point...\n");
#if 1 { extern unsigned int qemu_mem_size; + extern char boot_device; void *init_openprom(unsigned long memsize, const char *cmdline, char boot_device);
int (*entry)(const void *romvec, int p2, int p3, int p4, int p5); const void *romvec;
- romvec = init_openprom(qemu_mem_size, cmdline, 'c'); + romvec = init_openprom(qemu_mem_size, cmdline, boot_device); entry = (void *) addr_fixup(start); image_retval = entry(romvec, 0, 0, 0, 0); }
Modified: openbios-devel/arch/sparc32/boot.c =================================================================== --- openbios-devel/arch/sparc32/boot.c 2006-05-22 22:10:54 UTC (rev 26) +++ openbios-devel/arch/sparc32/boot.c 2006-05-22 22:16:20 UTC (rev 27) @@ -16,24 +16,54 @@ void boot(void);
struct sys_info sys_info; +uint32_t kernel_image; +uint32_t kernel_size; +uint32_t cmdline; +uint32_t cmdline_size; +char boot_device;
void boot(void) { char *path=pop_fstr_copy(), *param; - // char *param="root=/dev/hda2 console=ttyS0,115200n8 console=tty0"; - + if (kernel_size) { + extern unsigned int qemu_mem_size; + void *init_openprom(unsigned long memsize, const char *cmdline, char boot_device); + + int (*entry)(const void *romvec, int p2, int p3, int p4, int p5); + const void *romvec; + + printk("[sparc] Kernel already loaded\n"); + romvec = init_openprom(qemu_mem_size, (void *)cmdline, boot_device); + entry = (void *) kernel_image; + entry(romvec, 0, 0, 0, 0); + } + if(!path) { + switch(boot_device) { + case 'a': + path = "/obio/SUNW,fdtwo"; + break; + case 'c': + path = "disk"; + break; + default: + case 'd': path = "cdrom"; - //printk("[sparc] Booting default not supported.\n"); - //return; + break; + case 'n': + path = "net"; + break; + } }
param = strchr(path, ' '); if(param) { *param = '\0'; param++; - } + } else if (cmdline_size) { + param = (char *)cmdline; + } printk("[sparc] Booting file '%s' with parameters '%s'\n",path, param);
Modified: openbios-devel/arch/sparc32/elfload.c =================================================================== --- openbios-devel/arch/sparc32/elfload.c 2006-05-22 22:10:54 UTC (rev 26) +++ openbios-devel/arch/sparc32/elfload.c 2006-05-22 22:16:20 UTC (rev 27) @@ -76,7 +76,8 @@ }
static unsigned long process_image_notes(Elf_phdr *phdr, int phnum, - unsigned short *sum_ptr) + unsigned short *sum_ptr, + unsigned int offset) { int i; char *buf = NULL; @@ -90,7 +91,7 @@ if (phdr[i].p_type != PT_NOTE) continue; buf = malloc(phdr[i].p_filesz); - file_seek(phdr[i].p_offset); + file_seek(offset + phdr[i].p_offset); if (lfile_read(buf, phdr[i].p_filesz) != phdr[i].p_filesz) { printf("Can't read note segment\n"); goto out; @@ -132,7 +133,8 @@ }
static int load_segments(Elf_phdr *phdr, int phnum, - unsigned long checksum_offset) + unsigned long checksum_offset, + unsigned int offset) { unsigned long bytes; //unsigned int start_time, time; @@ -145,7 +147,7 @@ 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(phdr[i].p_offset); + file_seek(offset + phdr[i].p_offset); debug("loading... "); if (lfile_read(phys_to_virt(addr_fixup(phdr[i].p_paddr)), phdr[i].p_filesz) != phdr[i].p_filesz) { @@ -309,16 +311,24 @@ Elf_Bhdr *boot_notes = NULL; int retval = -1; int image_retval; + unsigned int offset;
image_name = image_version = 0;
if (!file_open(filename)) goto out;
- if (lfile_read(&ehdr, sizeof ehdr) != sizeof ehdr) { - debug("Can't read ELF header\n"); - retval = LOADER_NOT_SUPPORT; - goto out; + for (offset = 0; offset < 16 * 512; offset += 512) { + if (lfile_read(&ehdr, sizeof ehdr) != sizeof ehdr) { + debug("Can't read ELF header\n"); + retval = LOADER_NOT_SUPPORT; + goto out; + } + + if (ehdr.e_ident[EI_MAG0] == ELFMAG0) + break; + + file_seek(offset); }
if (ehdr.e_ident[EI_MAG0] != ELFMAG0 @@ -339,7 +349,7 @@
phdr_size = ehdr.e_phnum * sizeof *phdr; phdr = malloc(phdr_size); - file_seek(ehdr.e_phoff); + file_seek(offset + ehdr.e_phoff); if (lfile_read(phdr, phdr_size) != phdr_size) { printf("Can't read program header\n"); goto out; @@ -348,14 +358,14 @@ if (!check_mem_ranges(info, phdr, ehdr.e_phnum)) goto out;
- checksum_offset = process_image_notes(phdr, ehdr.e_phnum, &checksum); + checksum_offset = process_image_notes(phdr, ehdr.e_phnum, &checksum, offset);
printf("Loading %s", image_name ? image_name : "image"); if (image_version) printf(" version %s", image_version); printf("...\n");
- if (!load_segments(phdr, ehdr.e_phnum, checksum_offset)) + if (!load_segments(phdr, ehdr.e_phnum, checksum_offset, offset)) goto out;
if (checksum_offset) { @@ -373,12 +383,13 @@ #if 1 { extern unsigned int qemu_mem_size; + extern char boot_device; void *init_openprom(unsigned long memsize, const char *cmdline, char boot_device);
int (*entry)(const void *romvec, int p2, int p3, int p4, int p5); const void *romvec;
- romvec = init_openprom(qemu_mem_size, cmdline, 'c'); + romvec = init_openprom(qemu_mem_size, cmdline, boot_device); entry = (void *) addr_fixup(ehdr.e_entry); image_retval = entry(romvec, 0, 0, 0, 0); }
Modified: openbios-devel/arch/sparc32/openbios.c =================================================================== --- openbios-devel/arch/sparc32/openbios.c 2006-05-22 22:10:54 UTC (rev 26) +++ openbios-devel/arch/sparc32/openbios.c 2006-05-22 22:16:20 UTC (rev 27) @@ -19,6 +19,10 @@ void boot(void); void ob_ide_init(void);
+#define IOMMU_BASE 0x10000000 /* First page of sun4m IOMMU */ +#define SLAVIO_BASE 0x71000000 +#define MACIO_BASE 0x70000000 + static unsigned char intdict[256 * 1024];
static void init_memory(void) @@ -50,17 +54,19 @@
modules_init(); #ifdef CONFIG_DRIVER_SBUS - init_mmu_swift(); + init_mmu_swift(IOMMU_BASE);
ob_sbus_init(); #endif #ifdef CONFIG_DRIVER_ESP - ob_esp_init(); + ob_esp_init(MACIO_BASE); #endif #ifdef CONFIG_DRIVER_OBIO - ob_obio_init(0x71000000); + ob_obio_init(SLAVIO_BASE); + nvram_init(); #endif device_end(); + bind_func("platform-boot", boot ); }
Modified: openbios-devel/arch/sparc32/romvec.c =================================================================== --- openbios-devel/arch/sparc32/romvec.c 2006-05-22 22:10:54 UTC (rev 26) +++ openbios-devel/arch/sparc32/romvec.c 2006-05-22 22:16:20 UTC (rev 27) @@ -61,9 +61,6 @@ static void (*synch_hook)(void);
static struct linux_romvec romvec0; -static int prop_mem_reg[3]; -static int prop_mem_avail[3]; -static int prop_vmem_avail[6];
static void doublewalk(__attribute__((unused)) unsigned int ptab1, __attribute__((unused)) unsigned int va) @@ -418,31 +415,18 @@ /* * Form memory descriptors. */ - totphys[0].theres_more = 0; + totphys[0].theres_more = NULL; totphys[0].start_adr = (char *) 0; totphys[0].num_bytes = memsize;
- totavail[0].theres_more = 0; - totavail[0].start_adr = (char*) 0; + totavail[0].theres_more = NULL; + totavail[0].start_adr = (char *) 0; totavail[0].num_bytes = memsize;
- totmap[0].theres_more = 0; + totmap[0].theres_more = NULL; totmap[0].start_adr = &_start; totmap[0].num_bytes = (unsigned long) &_iomem - (unsigned long) &_start;
- prop_mem_reg[0] = 0; - prop_mem_reg[1] = 0; - prop_mem_reg[2] = memsize; - prop_mem_avail[0] = 0; - prop_mem_avail[1] = 0; - prop_mem_avail[2] = va2pa((unsigned long)&_data) - 1; - prop_vmem_avail[0] = 0; - prop_vmem_avail[1] = 0; - prop_vmem_avail[2] = (unsigned long)&_start - 1; - prop_vmem_avail[3] = 0; - prop_vmem_avail[4] = 0xffe00000; - prop_vmem_avail[5] = 0x00200000; - // Linux wants a R/W romvec table romvec0.pv_magic_cookie = LINUX_OPPROM_MAGIC; romvec0.pv_romvers = 0; @@ -478,6 +462,7 @@ romvec0.pv_v2devops.v2_dev_seek = obp_devseek; obp_arg.boot_dev_ctrl = 0; obp_arg.boot_dev_unit = 0; + obp_arg.dev_partition = 4; obp_arg.argv[0] = "sd(0,0,0):d";
switch(boot_device) { @@ -503,7 +488,7 @@ } obp_arg.argv[1] = cmdline; romvec0.pv_v2bootargs.bootpath = &obp_arg.argv[0]; - romvec0.pv_v2bootargs.bootargs = &cmdline; + romvec0.pv_v2bootargs.bootargs = &obp_arg.argv[1]; romvec0.pv_v2bootargs.fd_stdin = &obp_fd_stdin; romvec0.pv_v2bootargs.fd_stdout = &obp_fd_stdout;
Modified: openbios-devel/arch/sparc32/tree.fs =================================================================== --- openbios-devel/arch/sparc32/tree.fs 2006-05-22 22:10:54 UTC (rev 26) +++ openbios-devel/arch/sparc32/tree.fs 2006-05-22 22:16:20 UTC (rev 27) @@ -5,9 +5,6 @@ " SUNW,SparcStation-5" encode-string " name" property " SparcStation" encode-string " banner-name" property " sun4m" encode-string " compatible" property - h# 01800000 encode-int 0 encode-int encode+ 0 encode-int encode+ h# 00000081 encode-int encode+ - 0 encode-int encode+ 0 encode-int encode+ 0 encode-int encode+ 0 encode-int encode+ - " idprom" property \ XXX " /obio/zs@0,100000:a" encode-string " stdin-path" property " /obio/zs@0,100000:a" encode-string " stdout-path" property : encode-unit encode-unit-sbus ; @@ -15,8 +12,6 @@
new-device " memory" device-name - h# 100000 encode-int " available" property \ XXX - h# 0 encode-int h# 10000000 encode-int encode+ h# 00000300 encode-int encode+ " reg" property \ XXX external : open true ; : close ; @@ -26,8 +21,6 @@
new-device " virtual-memory" device-name - h# 100000 encode-int " available" property \ XXX - h# 0 encode-int h# 10000000 encode-int encode+ h# 00000300 encode-int encode+ " reg" property \ XXX external : open true ; : close ; @@ -131,7 +124,6 @@ " /iommu/sbus" find-device new-device " espdma" device-name - h# 4 encode-int h# 08400000 encode-int encode+ h# 00000010 encode-int encode+ " reg" property external : encode-unit encode-unit-sbus ; : decode-unit decode-unit-sbus ; @@ -180,76 +172,6 @@ : decode-unit decode-unit-sbus ; finish-device
-" /obio" find-device -new-device - " SUNW,fdtwo" device-name - " block" device-type - h# 0 encode-int h# 00400000 encode-int encode+ h# 0000000f encode-int encode+ " reg" property - h# 2b encode-int 0 encode-int encode+ " intr" property -finish-device - -" /obio" find-device -new-device - " auxio" device-name - h# 0 encode-int h# 00900000 encode-int encode+ h# 00000001 encode-int encode+ " reg" property -finish-device - -" /obio" find-device -new-device - " counter" device-name - h# 0 encode-int h# 00d00000 encode-int encode+ h# 00000010 encode-int encode+ - h# 0 encode-int encode+ h# 00d10000 encode-int encode+ h# 00000010 encode-int encode+ - " reg" property -finish-device - -" /obio" find-device -new-device - " eeprom" device-name - h# 0 encode-int h# 00200000 encode-int encode+ h# 00002000 encode-int encode+ " reg" property - " mk48t08" model -finish-device - -" /obio" find-device -new-device - " interrupt" device-name - h# 0 encode-int h# 00e00000 encode-int encode+ h# 00000010 encode-int encode+ - h# 0 encode-int encode+ h# 00e10000 encode-int encode+ h# 00000010 encode-int encode+ - " reg" property -finish-device - -" /obio" find-device -new-device - " power" device-name - h# 0 encode-int h# 00910000 encode-int encode+ h# 00000001 encode-int encode+ " reg" property - h# 22 encode-int 0 encode-int encode+ " intr" property -finish-device - -" /obio" find-device -new-device - " slavioconfig" device-name - h# 0 encode-int h# 00800000 encode-int encode+ h# 00000001 encode-int encode+ " reg" property -finish-device - -" /obio" find-device -new-device - " zs" device-name - " serial" device-type - h# 0 encode-int h# 00000000 encode-int encode+ h# 00000008 encode-int encode+ " reg" property - 1 encode-int " slave" property - h# 2c encode-int 0 encode-int encode+ " intr" property - -1 encode-int " keyboard" property - -1 encode-int " mouse" property -finish-device - -" /obio" find-device -new-device - " zs" device-name - " serial" device-type - h# 0 encode-int h# 00100000 encode-int encode+ h# 00000008 encode-int encode+ " reg" property - 0 encode-int " slave" property - h# 2c encode-int 0 encode-int encode+ " intr" property -finish-device - " /options" find-device " disk" encode-string " boot-from" property
Modified: openbios-devel/config/examples/cross-sparc32_config.xml =================================================================== --- openbios-devel/config/examples/cross-sparc32_config.xml 2006-05-22 22:10:54 UTC (rev 26) +++ openbios-devel/config/examples/cross-sparc32_config.xml 2006-05-22 22:16:20 UTC (rev 27) @@ -61,6 +61,7 @@ <option name="CONFIG_FSYS_NTFS" type="boolean" value="false"/> <option name="CONFIG_FSYS_AFFS" type="boolean" value="true"/> <option name="CONFIG_DEBUG_FS" type="boolean" value="false"/> + <option name="CONFIG_DEBUG_EXT2FS" type="boolean" value="false"/>
<!-- Miscellaneous --> <option name="CONFIG_LINUXBIOS" type="boolean" value="false"/>
Modified: openbios-devel/config/examples/sparc32_config.xml =================================================================== --- openbios-devel/config/examples/sparc32_config.xml 2006-05-22 22:10:54 UTC (rev 26) +++ openbios-devel/config/examples/sparc32_config.xml 2006-05-22 22:16:20 UTC (rev 27) @@ -61,6 +61,7 @@ <option name="CONFIG_FSYS_NTFS" type="boolean" value="false"/> <option name="CONFIG_FSYS_AFFS" type="boolean" value="true"/> <option name="CONFIG_DEBUG_FS" type="boolean" value="false"/> + <option name="CONFIG_DEBUG_EXT2FS" type="boolean" value="false"/>
<!-- Miscellaneous --> <option name="CONFIG_LINUXBIOS" type="boolean" value="false"/>
Modified: openbios-devel/include/sparc32/io.h =================================================================== --- openbios-devel/include/sparc32/io.h 2006-05-22 22:10:54 UTC (rev 26) +++ openbios-devel/include/sparc32/io.h 2006-05-22 22:16:20 UTC (rev 27) @@ -38,7 +38,7 @@ void *mem_zalloc(struct mem *t, int size, int align); int map_page(unsigned long va, unsigned long epa, int type); void *map_io(unsigned pa, int size); -void init_mmu_swift(void); +void init_mmu_swift(unsigned long base); void *dvma_alloc(int size, unsigned int *pphys);
#ifndef BOOTSTRAP