summaryrefslogtreecommitdiff
path: root/sys/arch/powerpc/stand
diff options
context:
space:
mode:
authorDale Rahn <drahn@cvs.openbsd.org>2001-06-23 01:53:03 +0000
committerDale Rahn <drahn@cvs.openbsd.org>2001-06-23 01:53:03 +0000
commitd2f51022c0ee895a2996e2f6735f063979d39cd1 (patch)
treef8c37c60114adabd7a3845fe09b09460654cca54 /sys/arch/powerpc/stand
parent14b39a831f4b4120bdaea878ee1854853b9c2d02 (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.c34
-rw-r--r--sys/arch/powerpc/stand/Makefile3
-rw-r--r--sys/arch/powerpc/stand/Makefile.inc11
-rw-r--r--sys/arch/powerpc/stand/boot.c319
-rw-r--r--sys/arch/powerpc/stand/boot.mac/Makefile10
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