diff options
author | Dale Rahn <drahn@cvs.openbsd.org> | 2001-06-23 01:53:03 +0000 |
---|---|---|
committer | Dale Rahn <drahn@cvs.openbsd.org> | 2001-06-23 01:53:03 +0000 |
commit | d2f51022c0ee895a2996e2f6735f063979d39cd1 (patch) | |
tree | f8c37c60114adabd7a3845fe09b09460654cca54 /sys/arch/powerpc/stand | |
parent | 14b39a831f4b4120bdaea878ee1854853b9c2d02 (diff) |
Support for powerpc to load symbols, uses new libsa loadfile.
Diffstat (limited to 'sys/arch/powerpc/stand')
-rw-r--r-- | sys/arch/powerpc/stand/Locore.c | 34 | ||||
-rw-r--r-- | sys/arch/powerpc/stand/Makefile | 3 | ||||
-rw-r--r-- | sys/arch/powerpc/stand/Makefile.inc | 11 | ||||
-rw-r--r-- | sys/arch/powerpc/stand/boot.c | 319 | ||||
-rw-r--r-- | sys/arch/powerpc/stand/boot.mac/Makefile | 10 |
5 files changed, 66 insertions, 311 deletions
diff --git a/sys/arch/powerpc/stand/Locore.c b/sys/arch/powerpc/stand/Locore.c index 4382013ae20..836e1c2469c 100644 --- a/sys/arch/powerpc/stand/Locore.c +++ b/sys/arch/powerpc/stand/Locore.c @@ -1,4 +1,4 @@ -/* $OpenBSD: Locore.c,v 1.7 1999/11/09 06:30:15 rahnds Exp $ */ +/* $OpenBSD: Locore.c,v 1.8 2001/06/23 01:53:00 drahn Exp $ */ /* $NetBSD: Locore.c,v 1.1 1997/04/16 20:29:11 thorpej Exp $ */ /* @@ -46,6 +46,37 @@ static void setup __P((void)); #ifdef XCOFF_GLUE asm (".text; .globl _entry; _entry: .long _start,0,0"); #endif +asm(" + .text + .globl bat_init +bat_init: + + mfmsr 8 + li 0,0 + mtmsr 0 + isync + + mtibatu 0,0 + mtibatu 1,0 + mtibatu 2,0 + mtibatu 3,0 + mtdbatu 0,0 + mtdbatu 1,0 + mtdbatu 2,0 + mtdbatu 3,0 + + li 9,0x12 /* BATL(0, BAT_M, BAT_PP_RW) */ + mtibatl 0,9 + mtdbatl 0,9 + li 9,0x1ffe /* BATU(0, BAT_BL_256M, BAT_Vs) */ + mtibatu 0,9 + mtdbatu 0,9 + isync + + mtmsr 8 + isync + blr +"); __dead void _start(vpd, res, openfirm, arg, argl) @@ -60,6 +91,7 @@ _start(vpd, res, openfirm, arg, argl) #ifdef FIRMWORKSBUGS syncicache((void *)RELOC, etext - (char *)RELOC); #endif + bat_init(); openfirmware = openfirm; /* Save entry to Open Firmware */ #if 0 patch_dec_intr(); diff --git a/sys/arch/powerpc/stand/Makefile b/sys/arch/powerpc/stand/Makefile index 96c7c9194ec..463eb7c704a 100644 --- a/sys/arch/powerpc/stand/Makefile +++ b/sys/arch/powerpc/stand/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.8 1998/05/29 04:15:44 rahnds Exp $ +# $OpenBSD: Makefile,v 1.9 2001/06/23 01:53:01 drahn Exp $ # $NetBSD: Makefile,v 1.1 1996/09/30 16:34:59 ws Exp $ SUBDIR= ofwboot boot.mac mbr @@ -8,6 +8,7 @@ KERNREL= KERN_AS=library Z_AS=library SA_ZLIB=smth +USE_LOADFILE=yes .include "Makefile.inc" .include "$S/lib/libz/Makefile.inc" diff --git a/sys/arch/powerpc/stand/Makefile.inc b/sys/arch/powerpc/stand/Makefile.inc index d54183cc6f4..5352dc018f0 100644 --- a/sys/arch/powerpc/stand/Makefile.inc +++ b/sys/arch/powerpc/stand/Makefile.inc @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile.inc,v 1.3 1997/02/18 22:36:40 rahnds Exp $ +# $OpenBSD: Makefile.inc,v 1.4 2001/06/23 01:53:01 drahn Exp $ # $NetBSD: Makefile.inc,v 1.1 1996/09/30 16:34:59 ws Exp $ .if !defined(__stand_makefile_inc) @@ -13,17 +13,14 @@ S=$(.CURDIR)/../../../$(R) @([ -h machine ] || ln -s $(S)/arch/$(MACHINE)/include machine) .endif -# for now -RELOC?= 4000 -LOADADDR?= 100000 # EXTRACFLAGS= -msoft-float REAL_VIRT?= -v ENTRY?= _start -INCLUDES+= -I. -I$(.CURDIR)/.. -I$(S)/arch -I$(S) -I$(S)/lib/libsa -DEFS+= -DSTANDALONE -DRELOC=0x$(RELOC) -DLOADADDR=0x$(LOADADDR) \ - -DFIREPOWERBUGS +INCLUDES+= -I. -I$(.OBJDIR) -I$(.CURDIR)/.. -I$(S)/arch -I$(S) +INCLUDES+= -I$(S)/lib/libsa +DEFS+= -DSTANDALONE -DFIREPOWERBUGS CFLAGS+= $(INCLUDES) $(DEFS) $(EXTRACFLAGS) LDFLAGS?= -X -N -Ttext $(RELOC) -e $(ENTRY) diff --git a/sys/arch/powerpc/stand/boot.c b/sys/arch/powerpc/stand/boot.c index d274c9a92be..2a06832305f 100644 --- a/sys/arch/powerpc/stand/boot.c +++ b/sys/arch/powerpc/stand/boot.c @@ -1,4 +1,4 @@ -/* $OpenBSD: boot.c,v 1.12 2000/01/24 03:07:54 rahnds Exp $ */ +/* $OpenBSD: boot.c,v 1.13 2001/06/23 01:53:01 drahn Exp $ */ /* $NetBSD: boot.c,v 1.1 1997/04/16 20:29:17 thorpej Exp $ */ /* @@ -45,19 +45,18 @@ #define ELFSIZE 32 /* We use 32-bit ELF. */ -#include <lib/libkern/libkern.h> -#include <lib/libsa/stand.h> - #include <sys/param.h> #include <sys/exec.h> #include <sys/exec_elf.h> #include <sys/reboot.h> #include <sys/disklabel.h> +#include <lib/libkern/libkern.h> +#include <lib/libsa/stand.h> +#include <lib/libsa/loadfile.h> + + #include <machine/cpu.h> -/* -#include <machine/machine_type.h> -*/ #include <powerpc/stand/ofdev.h> #include <powerpc/stand/openfirm.h> @@ -140,9 +139,10 @@ parseargs(str, howtop) } static void -chain(entry, args, esym) +chain(entry, args, ssym, esym) void (*entry)(); char *args; + void *ssym; void *esym; { extern char end[]; @@ -155,6 +155,8 @@ chain(entry, args, esym) * strings. */ l = strlen(args) + 1; + bcopy(&ssym, args + l, sizeof(ssym)); + l += sizeof(ssym); bcopy(&esym, args + l, sizeof(esym)); l += sizeof(esym); @@ -172,299 +174,14 @@ chain(entry, args, esym) } int -loadfile(fd, args) - int fd; - char *args; -{ - union { -#ifdef POWERPC_BOOT_AOUT - struct exec aout; -#endif -#ifdef POWERPC_BOOT_ELF - Elf32_Ehdr elf; -#endif - } hdr; - int rval; - u_int32_t entry; - void *esym; - - rval = 1; - esym = NULL; - - /* Load the header. */ - if (read(fd, &hdr, sizeof(hdr)) != sizeof(hdr)) { - printf("read header: %s\n", strerror(errno)); - goto err; - } - - /* Determine file type, load kernel. */ -#ifdef POWERPC_BOOT_AOUT - if (N_BADMAG(hdr.aout) == 0 && N_GETMID(hdr.aout) == MID_POWERPC) { - rval = aout_exec(fd, &hdr.aout, &entry, &esym); - } else -#endif -#ifdef POWERPC_BOOT_ELF - if (IS_ELF(hdr.elf)) { - rval = elf_exec(fd, &hdr.elf, &entry, &esym); - } else -#endif - { - printf("unknown executable format\n"); - } - - if (rval) - goto err; - - printf(" start=0x%x\n", entry); - - close(fd); - - chain((void *)entry, args, esym); - /* NOTREACHED */ - - err: - close(fd); - return (rval); -} - -#ifdef POWERPC_BOOT_AOUT -int -aout_exec(fd, hdr, entryp, esymp) - int fd; - struct exec *hdr; - u_int32_t *entryp; - void **esymp; -{ - void *addr; - int n, *paddr; - - /* Display the load address (entry point) for a.out. */ - printf("Booting %s @ 0x%lx\n", opened_name, hdr->a_entry); - addr = (void *)(hdr->a_entry); - - /* - * Determine memory needed for kernel and allocate it from - * the firmware. - */ - n = hdr->a_text + hdr->a_data + hdr->a_bss + hdr->a_syms + sizeof(int); - if ((paddr = OF_claim(addr, n, 0)) == (int *)-1) - panic("cannot claim memory"); - - /* Load text. */ - lseek(fd, N_TXTOFF(*hdr), SEEK_SET); - printf("%lu", hdr->a_text); - if (read(fd, paddr, hdr->a_text) != hdr->a_text) { - printf("read text: %s\n", strerror(errno)); - return (1); - } - syncicache((void *)paddr, hdr->a_text); - - /* Load data. */ - printf("+%lu", hdr->a_data); - if (read(fd, (void *)paddr + hdr->a_text, hdr->a_data) != hdr->a_data) { - printf("read data: %s\n", strerror(errno)); - return (1); - } - - /* Zero BSS. */ - printf("+%lu", hdr->a_bss); - bzero((void *)paddr + hdr->a_text + hdr->a_data, hdr->a_bss); - - /* Symbols. */ - *esymp = paddr; - paddr = (int *)((void *)paddr + hdr->a_text + hdr->a_data + hdr->a_bss); - *paddr++ = hdr->a_syms; - if (hdr->a_syms) { - printf(" [%lu", hdr->a_syms); - if (read(fd, paddr, hdr->a_syms) != hdr->a_syms) { - printf("read symbols: %s\n", strerror(errno)); - return (1); - } - paddr = (int *)((void *)paddr + hdr->a_syms); - if (read(fd, &n, sizeof(int)) != sizeof(int)) { - printf("read symbols: %s\n", strerror(errno)); - return (1); - } - if (OF_claim((void *)paddr, n + sizeof(int), 0) == (void *)-1) - panic("cannot claim memory"); - *paddr++ = n; - if (read(fd, paddr, n - sizeof(int)) != n - sizeof(int)) { - printf("read symbols: %s\n", strerror(errno)); - return (1); - } - printf("+%d]", n - sizeof(int)); - *esymp = paddr + (n - sizeof(int)); - } - - *entryp = hdr->a_entry; - return (0); -} -#endif /* POWERPC_BOOT_AOUT */ - -#define LOAD_HDR 1 -#define LOAD_SYM 2 -#ifdef POWERPC_BOOT_ELF -int -elf_exec(fd, elf, entryp, esymp) - int fd; - Elf32_Ehdr *elf; - u_int32_t *entryp; - void **esymp; - -{ - Elf32_Shdr *shp; - Elf32_Off off; - void *addr; - size_t size; - int i, first = 1; - int n; - u_int32_t maxp = 0; /* correct type? */ - int flags = LOAD_HDR| LOAD_SYM; - - /* - * Don't display load address for ELF; it's encoded in - * each section. - */ - printf("Booting %s\n", opened_name); - - for (i = 0; i < elf->e_phnum; i++) { - Elf32_Phdr phdr; - (void)lseek(fd, elf->e_phoff + sizeof(phdr) * i, SEEK_SET); - if (read(fd, (void *)&phdr, sizeof(phdr)) != sizeof(phdr)) { - printf("read phdr: %s\n", strerror(errno)); - return (1); - } - if (phdr.p_type != PT_LOAD || - (phdr.p_flags & (PF_W|PF_X)) == 0) - continue; - - /* Read in segment. */ - printf("%s%lu@0x%lx", first ? "" : "+", phdr.p_filesz, - (u_long)phdr.p_vaddr); - (void)lseek(fd, phdr.p_offset, SEEK_SET); - if (OF_claim((void *)phdr.p_vaddr, phdr.p_memsz, 0) == - (void *)-1) - panic("cannot claim memory"); - maxp = maxp > (phdr.p_vaddr+ phdr.p_memsz) ? - maxp : (phdr.p_vaddr+ phdr.p_memsz); - if (read(fd, (void *)phdr.p_vaddr, phdr.p_filesz) != - phdr.p_filesz) { - printf("read segment: %s\n", strerror(errno)); - return (1); - } - syncicache((void *)phdr.p_vaddr, phdr.p_filesz); - - /* Zero BSS. */ - if (phdr.p_filesz < phdr.p_memsz) { - printf("+%lu@0x%lx", phdr.p_memsz - phdr.p_filesz, - (u_long)(phdr.p_vaddr + phdr.p_filesz)); - bzero((void *)(phdr.p_vaddr + phdr.p_filesz), - phdr.p_memsz - phdr.p_filesz); - } - first = 0; - } - *esymp = 0; /* in case it is not set later */ - -#if 0 - /* - * Copy the ELF and section headers. - */ - maxp = roundup(maxp, sizeof(long)); - if (flags & (LOAD_HDR|COUNT_HDR)) { - if (OF_claim((void *)maxp, sizeof(Elf_Ehdr), 0) == - (void *)-1) - panic("cannot claim memory"); - elfp = maxp; - maxp += sizeof(Elf_Ehdr); - } - - if (flags & (LOAD_SYM|COUNT_SYM)) { - if (lseek(fd, elf->e_shoff, SEEK_SET) == -1) { - WARN(("lseek section headers")); - return 1; - } - sz = elf->e_shnum * sizeof(Elf_Shdr); - - if (OF_claim((void *)maxp, sizeof(Elf_Ehdr), 0) == - (void *)-1) - panic("cannot claim memory"); - shpp = maxp; - maxp += roundup(sz, sizeof(long)); - - if (read(fd, shpp, sz) != sz) { - WARN(("read section headers")); - return 1; - } - /* - * Now load the symbol sections themselves. Make sure the - * sections are aligned. Don't bother with string tables if - * there are no symbol sections. - */ - off = roundup((sizeof(Elf_Ehdr) + sz), sizeof(long)); - - for (havesyms = i = 0; i < elf->e_shnum; i++) - if (shpp[i].sh_type == Elf_sht_symtab) - havesyms = 1; - - for (first = 1, i = 0; i < elf->e_shnum; i++) { - if (shpp[i].sh_type == Elf_sht_symtab || - shpp[i].sh_type == Elf_sht_strtab) { - if (havesyms && (flags & LOAD_SYM)) { - PROGRESS(("%s%ld", first ? " [" : "+", - (u_long)shpp[i].sh_size)); - if (lseek(fd, shpp[i].sh_offset, - SEEK_SET) == -1) { - WARN(("lseek symbols")); - FREE(shp, sz); - return 1; - } - if (READ(fd, maxp, shpp[i].sh_size) != - shpp[i].sh_size) { - WARN(("read symbols")); - return 1; - } - } - maxp += roundup(shpp[i].sh_size, - sizeof(long)); - shpp[i].sh_offset = off; - off += roundup(shpp[i].sh_size, sizeof(long)); - first = 0; - } - } - if (flags & LOAD_SYM) { - BCOPY(shp, shpp, sz); - - if (first == 0) - PROGRESS(("]")); - } - } - - /* - * Frob the copied ELF header to give information relative - * to elfp. - */ - if (flags & LOAD_HDR) { - elf->e_phoff = 0; - elf->e_shoff = sizeof(Elf_Ehdr); - elf->e_phentsize = 0; - elf->e_phnum = 0; - BCOPY(elf, elfp, sizeof(*elf)); - } -#endif - printf(" \n"); - - - *entryp = elf->e_entry; - return (0); -} -#endif /* POWERPC_BOOT_ELF */ - -int main() { int chosen; char bootline[512]; /* Should check size? */ char *cp; + u_long marks[MARK_MAX]; + u_int32_t entry; + void *ssym, *esym; int fd; printf("\n>> OpenBSD/powerpc Boot\n"); @@ -486,7 +203,8 @@ main() gets(bootline); parseargs(bootline, &boothowto); } - if ((fd = open(bootline, 0)) >= 0) + marks[MARK_START] = 0; + if (loadfile(bootline, marks, LOAD_ALL) >= 0) break; if (errno) printf("open %s: %s\n", opened_name, strerror(errno)); @@ -518,8 +236,11 @@ main() #ifdef __notyet__ OF_setprop(chosen, "bootargs", bootline, strlen(bootline) + 1); #endif - /* XXX void, for now */ - (void)loadfile(fd, bootline); + entry = marks[MARK_ENTRY]; + ssym = (void *)marks[MARK_SYM]; + esym = (void *)marks[MARK_END]; + + chain ((void*)entry, bootline, ssym, esym); _rtt(); return 0; diff --git a/sys/arch/powerpc/stand/boot.mac/Makefile b/sys/arch/powerpc/stand/boot.mac/Makefile index 62380cfd927..8cb43416b21 100644 --- a/sys/arch/powerpc/stand/boot.mac/Makefile +++ b/sys/arch/powerpc/stand/boot.mac/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.7 2001/02/09 05:20:51 drahn Exp $ +# $OpenBSD: Makefile,v 1.8 2001/06/23 01:53:02 drahn Exp $ # $NetBSD: Makefile,v 1.1 1996/09/30 16:35:05 ws Exp $ R= .. @@ -6,16 +6,20 @@ R= .. RELOC= 6c0000 ENTRY= _entry PROG= boot.mac -SRCS= Locore.c boot.c ofdev.c net.c netif_of.c alloc.c hfs.c +SRCS= Locore.c boot.c ofdev.c net.c netif_of.c alloc.c cache.c hfs.c CFLAGS+= -DDEBUG -DNETIF_DEBUG -CFLAGS+= -DXCOFF_GLUE NOMAN= INSTALL_STRIP= BINDIR= /usr/mdec OBJCOPY?= objcopy OBJCOPY_ARGS= -O aixcoff-rs6000 -R .stab -R .stabstr -R .comment LDFLAGS= -X -Ttext ${RELOC} -e $(ENTRY) -T ${.CURDIR}/ld.script + +CPPFLAGS+= -I. -I${.CURDIR}/../../.. -I${.CURDIR}/../../../.. +CPPFLAGS+= -DRELOC=0x${RELOC} +CPPFLAGS+= -DFIRMWORKSBUGS CPPFLAGS+= -DPOWERPC_BOOT_ELF +CPPFLAGS+= -DXCOFF_GLUE # for booting PCI Powermacs LIBS!= cd $(.CURDIR)/$(R); $(MAKE) libdep |