summaryrefslogtreecommitdiff
path: root/sys/arch/sparc64
diff options
context:
space:
mode:
Diffstat (limited to 'sys/arch/sparc64')
-rw-r--r--sys/arch/sparc64/stand/ofwboot/Makefile30
-rw-r--r--sys/arch/sparc64/stand/ofwboot/boot.c261
-rw-r--r--sys/arch/sparc64/stand/ofwboot/elfXX_exec.c8
-rw-r--r--sys/arch/sparc64/stand/ofwboot/srt0.s15
4 files changed, 12 insertions, 302 deletions
diff --git a/sys/arch/sparc64/stand/ofwboot/Makefile b/sys/arch/sparc64/stand/ofwboot/Makefile
index 28b26250e8d..28600b3765b 100644
--- a/sys/arch/sparc64/stand/ofwboot/Makefile
+++ b/sys/arch/sparc64/stand/ofwboot/Makefile
@@ -1,4 +1,4 @@
-# $OpenBSD: Makefile,v 1.6 2001/09/06 19:12:34 jason Exp $
+# $OpenBSD: Makefile,v 1.7 2003/06/10 02:42:58 brad Exp $
# $NetBSD: Makefile,v 1.2 2001/03/04 14:50:05 mrg Exp $
CURDIR= ${.CURDIR}
@@ -16,19 +16,18 @@ SRCS= srt0.s Locore.c boot.c ofdev.c alloc.c net.c netif_of.c vers.c
.PATH: ${S}/arch/sparc64/sparc64
CWARNFLAGS+= -Wno-main
-CFLAGS+= ${COPTS} ${CEXTRAFLAGS}
+AFLAGS+= -Wa,-Av9a
+AFLAGS+= -x assembler-with-cpp -traditional-cpp -D_LOCORE -D__ELF__
+CFLAGS+= ${COPTS}
CPPFLAGS+= -D_STANDALONE -DSUN4U -nostdinc
#CPPFLAGS+= -DNETIF_DEBUG
-MKMAN= no
-STRIPFLAG=
BINMODE= 444
-OBJCOPY?= objcopy
NEWVERSWHAT= "OpenFirmware Boot"
#
-# Elf64 defaults to 1MB
+# ELF64 defaults to 1MB
#
# We may get address conflicts with other bootloaders, say
# Sun's ufsboot, so we'll pick a reasonably empty address.
@@ -45,7 +44,6 @@ CPPFLAGS+= -DRELOC=0x${RELOC}
#
# XXXXX FIXME
#
-CPPFLAGS+= -DSPARC_BOOT_AOUT
CPPFLAGS+= -DSPARC_BOOT_ELF
CPPFLAGS+= -DSPARC_BOOT_UFS
CPPFLAGS+= -DSPARC_BOOT_NFS
@@ -64,25 +62,11 @@ ${PROG}: ${OBJS} ${LIBSA} ${LIBZ} ${LIBKERN}
${OBJS} -L${LIBSADIR} ${LIBSA} -L${LIBKERNDIR} ${LIBKERN} \
-L${LIBZDIR} ${LIBZ}
-.include <bsd.prog.mk>
-
-.if ${MACHINE_ARCH} == "sparc64"
-AFLAGS+= -Wa,-Av9a
-CEXTRAFLAGS?= -D_LP64
-.else
-AFLAGS+= -Wa,-Av8plusa
-.endif
-
-.if CROSS
-AFLAGS+= -x assembler-with-cpp -traditional-cpp -D_LOCORE -D__ELF__
-CEXTRAFLAGS?= -D_LP64
-.else
-AFLAGS+= -x assembler-with-cpp -traditional-cpp -D_LOCORE -D__ELF__ ${CEXTRAFLAGS}
-.endif
-
NORMAL_S= ${CC} ${AFLAGS} ${CPPFLAGS} -c $<
srt0.o: srt0.s
${NORMAL_S}
# Explicit dependency for this.
boot.o: boot.c elfXX_exec.c
+
+.include <bsd.prog.mk>
diff --git a/sys/arch/sparc64/stand/ofwboot/boot.c b/sys/arch/sparc64/stand/ofwboot/boot.c
index f397f57ff0b..5bb8230a75f 100644
--- a/sys/arch/sparc64/stand/ofwboot/boot.c
+++ b/sys/arch/sparc64/stand/ofwboot/boot.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: boot.c,v 1.9 2003/06/03 15:59:03 deraadt Exp $ */
+/* $OpenBSD: boot.c,v 1.10 2003/06/10 02:42:58 brad Exp $ */
/* $NetBSD: boot.c,v 1.3 2001/05/31 08:55:19 mrg Exp $ */
/*
* Copyright (c) 1997, 1999 Eduardo E. Horvath. All rights reserved.
@@ -43,9 +43,7 @@
* [promdev[{:|,}partition]]/[filename] [flags]
*/
-#ifdef ELFSIZE
-#undef ELFSIZE /* We use both. */
-#endif
+#define ELFSIZE 64
#include <lib/libsa/stand.h>
@@ -80,14 +78,9 @@ int debug;
#ifdef SPARC_BOOT_ELF
-int elf32_exec(int, Elf32_Ehdr *, u_int64_t *, void **, void **);
int elf64_exec(int, Elf64_Ehdr *, u_int64_t *, void **, void **);
#endif
-#ifdef SPARC_BOOT_AOUT
-int aout_exec(int, struct exec *, u_int64_t *, void **);
-#endif
-
#if 0
static void
prom2boot(dev)
@@ -223,11 +216,7 @@ loadfile(fd, args)
char *args;
{
union {
-#ifdef SPARC_BOOT_AOUT
- struct exec aout;
-#endif
#ifdef SPARC_BOOT_ELF
- Elf32_Ehdr elf32;
Elf64_Ehdr elf64;
#endif
} hdr;
@@ -254,16 +243,8 @@ loadfile(fd, args)
}
/* Determine file type, load kernel. */
-#ifdef SPARC_BOOT_AOUT
- if (N_BADMAG(hdr.aout) == 0 && N_GETMID(hdr.aout) == MID_SPARC) {
- rval = aout_exec(fd, &hdr.aout, &entry, &esym);
- } else
-#endif
#ifdef SPARC_BOOT_ELF
- if (bcmp(hdr.elf32.e_ident, ELFMAG, SELFMAG) == 0 &&
- hdr.elf32.e_ident[EI_CLASS] == ELFCLASS32) {
- rval = elf32_exec(fd, &hdr.elf32, &entry, &ssym, &esym);
- } else if (bcmp(hdr.elf64.e_ident, ELFMAG, SELFMAG) == 0 &&
+ if (bcmp(hdr.elf64.e_ident, ELFMAG, SELFMAG) == 0 &&
hdr.elf64.e_ident[EI_CLASS] == ELFCLASS64) {
rval = elf64_exec(fd, &hdr.elf64, &entry, &ssym, &esym);
} else
@@ -295,244 +276,8 @@ loadfile(fd, args)
return (rval);
}
-#ifdef SPARC_BOOT_AOUT
-int
-aout_exec(fd, hdr, entryp, esymp)
- int fd;
- struct exec *hdr;
- u_int64_t *entryp;
- void **esymp;
-{
- void *addr;
- int n, *paddr;
-
-#ifdef DEBUG
- printf("auout_exec: ");
-#endif
- /* Display the load address (entry point) for a.out. */
- printf("Booting %s @ 0x%lx\n", opened_name, hdr->a_entry);
- addr = (void *)((u_int64_t)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 /* SPARC_BOOT_AOUT */
-
#ifdef SPARC_BOOT_ELF
-#if 1
-/* New style */
-
-#ifdef ELFSIZE
-#undef ELFSIZE
-#endif
-
-#define ELFSIZE 32
#include "elfXX_exec.c"
-
-#undef ELFSIZE
-#define ELFSIZE 64
-#include "elfXX_exec.c"
-
-#else
-/* Old style */
-int
-elf32_exec(fd, elf, entryp, ssymp, esymp)
- int fd;
- Elf32_Ehdr *elf;
- u_int64_t *entryp;
- void **ssymp;
- void **esymp;
-{
- Elf32_Shdr *shp;
- Elf32_Off off;
- void *addr;
- size_t size;
- int i, first = 1;
- long align;
- int n;
-
- /*
- * Don't display load address for ELF; it's encoded in
- * each section.
- */
-#ifdef DEBUG
- printf("elf_exec: ");
-#endif
- 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 the segment's VA is aligned on a 4MB boundary, align its
- * request 4MB aligned physical memory. Otherwise use default
- * alignment.
- */
- align = phdr.p_align;
- if ((phdr.p_vaddr & (4*MEG-1)) == 0)
- align = 4*MEG;
- if (OF_claim((void *)phdr.p_vaddr, phdr.p_memsz, phdr.p_align) ==
- (void *)-1)
- panic("cannot claim memory");
- 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;
- }
-
- printf(" \n");
-
-#if 1 /* I want to rethink this... --thorpej@netbsd.org */
- /*
- * Compute the size of the symbol table.
- */
- size = sizeof(Elf32_Ehdr) + (elf->e_shnum * sizeof(Elf32_Shdr));
- shp = addr = alloc(elf->e_shnum * sizeof(Elf32_Shdr));
- (void)lseek(fd, elf->e_shoff, SEEK_SET);
- if (read(fd, addr, elf->e_shnum * sizeof(Elf32_Shdr)) !=
- elf->e_shnum * sizeof(Elf32_Shdr)) {
- printf("read section headers: %s\n", strerror(errno));
- return (1);
- }
- for (i = 0; i < elf->e_shnum; i++, shp++) {
- if (shp->sh_type == SHT_NULL)
- continue;
- if (shp->sh_type != SHT_SYMTAB &&
- shp->sh_type != SHT_STRTAB) {
- shp->sh_offset = 0;
- shp->sh_type = SHT_NOBITS;
- continue;
- }
- size += shp->sh_size;
- }
- shp = addr;
-
- /*
- * Reserve memory for the symbols.
- */
- if ((addr = OF_claim(0, size, NBPG)) == (void *)-1)
- panic("no space for symbol table");
-
- /*
- * Copy the headers.
- */
- elf->e_phoff = 0;
- elf->e_shoff = sizeof(Elf32_Ehdr);
- elf->e_phentsize = 0;
- elf->e_phnum = 0;
- bcopy(elf, addr, sizeof(Elf32_Ehdr));
- bcopy(shp, addr + sizeof(Elf32_Ehdr), elf->e_shnum * sizeof(Elf32_Shdr));
- free(shp, elf->e_shnum * sizeof(Elf32_Shdr));
- *ssymp = addr;
-
- /*
- * Now load the symbol sections themselves.
- */
- shp = addr + sizeof(Elf32_Ehdr);
- addr += sizeof(Elf32_Ehdr) + (elf->e_shnum * sizeof(Elf32_Shdr));
- off = sizeof(Elf32_Ehdr) + (elf->e_shnum * sizeof(Elf32_Shdr));
- for (first = 1, i = 0; i < elf->e_shnum; i++, shp++) {
- if (shp->sh_type == SHT_SYMTAB ||
- shp->sh_type == SHT_STRTAB) {
- if (first)
- printf("symbols @ 0x%lx ", (u_long)addr);
- printf("%s%d", first ? "" : "+", shp->sh_size);
- (void)lseek(fd, shp->sh_offset, SEEK_SET);
- if (read(fd, addr, shp->sh_size) != shp->sh_size) {
- printf("read symbols: %s\n", strerror(errno));
- return (1);
- }
- addr += (shp->sh_size+3)&(~3);
- shp->sh_offset = off;
- off += (shp->sh_size+3)&(~3);
- first = 0;
- }
- }
- *esymp = addr;
-#endif /* 0 */
-
- *entryp = elf->e_entry;
- return (0);
-}
-#endif
#endif /* SPARC_BOOT_ELF */
void
diff --git a/sys/arch/sparc64/stand/ofwboot/elfXX_exec.c b/sys/arch/sparc64/stand/ofwboot/elfXX_exec.c
index d8ceeb14e1f..ed587d5dfe7 100644
--- a/sys/arch/sparc64/stand/ofwboot/elfXX_exec.c
+++ b/sys/arch/sparc64/stand/ofwboot/elfXX_exec.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: elfXX_exec.c,v 1.4 2002/03/14 03:16:01 millert Exp $ */
+/* $OpenBSD: elfXX_exec.c,v 1.5 2003/06/10 02:42:58 brad Exp $ */
/* $NetBSD: elfXX_exec.c,v 1.2 2001/08/15 20:08:15 eeh Exp $ */
/*
@@ -51,13 +51,7 @@
#if 0
int CAT3(elf,ELFSIZE,_exec)(int, CAT3(Elf,ELFSIZE,_Ehdr) *, u_int64_t *, void **, void **);
#endif
-#if defined(ELFSIZE) && (ELFSIZE == 32)
-#define ELF_ALIGN(x) (((x)+3)&(~3))
-#elif defined(ELFSIZE) && (ELFSIZE == 64)
#define ELF_ALIGN(x) (((x)+7)&(~7))
-#else
-#error ELFSIZE must be either 32 or 64!
-#endif
int
CAT3(elf, ELFSIZE, _exec)(fd, elf, entryp, ssymp, esymp)
diff --git a/sys/arch/sparc64/stand/ofwboot/srt0.s b/sys/arch/sparc64/stand/ofwboot/srt0.s
index 8ffa5aa900b..edca81e7f88 100644
--- a/sys/arch/sparc64/stand/ofwboot/srt0.s
+++ b/sys/arch/sparc64/stand/ofwboot/srt0.s
@@ -1,4 +1,4 @@
-/* $OpenBSD: srt0.s,v 1.3 2002/03/14 03:16:01 millert Exp $ */
+/* $OpenBSD: srt0.s,v 1.4 2003/06/10 02:42:58 brad Exp $ */
/* $NetBSD: srt0.s,v 1.1 2000/08/20 14:58:42 mrg Exp $ */
/*
@@ -67,7 +67,6 @@ _start:
/*
* Start by creating a stack for ourselves.
*/
-#ifdef _LP64
/* 64-bit stack */
btst 1, %sp
set CC64FSZ, %g1 ! Frame Size (negative)
@@ -78,18 +77,6 @@ _start:
1:
sub %sp, %g1, %g1
save %g1, %g0, %sp
-#else
- /* 32-bit stack */
- btst 1, %sp
- set CC64FSZ, %g1 ! Frame Size (negative)
- bz 1f
- set BIAS, %g2
- sub %g1, %g2, %g1
-1:
- sub %sp, %g1, %g1 ! This is so we properly sign-extend things
- andn %g1, 0x7, %g1
- save %g1, %g0, %sp
-#endif
! mov %i0, %i4 ! Apparenty we get our CIF in i0