Try to page align all segments up to 4MB pages.
This commit is contained in:
parent
39546c529f
commit
4a8841ada2
|
@ -1,4 +1,4 @@
|
|||
# $NetBSD: Makefile,v 1.13 2000/01/23 17:04:11 mycroft Exp $
|
||||
# $NetBSD: Makefile,v 1.14 2000/03/06 01:29:04 eeh Exp $
|
||||
|
||||
CURDIR= ${.CURDIR}
|
||||
S= ${CURDIR}/../../../..
|
||||
|
@ -14,9 +14,9 @@ SRCS= srt0.s Locore.c boot.c ofdev.c alloc.c net.c netif_of.c
|
|||
.PATH: ${S}/arch/sparc64/sparc64
|
||||
|
||||
.if CROSS
|
||||
CEXTRAFLAGS= -nostdinc
|
||||
CEXTRAFLAGS?= -nostdinc
|
||||
.else
|
||||
CEXTRAFLAGS= -D_LP64
|
||||
CEXTRAFLAGS?= -D_LP64
|
||||
.endif
|
||||
CFLAGS+= ${COPTS} -DNETIF_DEBUG -D__ELF__ ${CEXTRAFLAGS} -D_STANDALONE
|
||||
|
||||
|
@ -91,7 +91,7 @@ ${PROG}: ${OBJS} ${LIBSA} ${LIBZ} ${LIBKERN}
|
|||
.if CROSS
|
||||
AFLAGS= -x assembler-with-cpp -Wa,-Av9a -traditional-cpp -D_LOCORE -D__ELF__
|
||||
.else
|
||||
AFLAGS= -x assembler-with-cpp -traditional-cpp -D_LOCORE -D__ELF__ -D_LP64 -Wa,-Av9 #-Wa,-Av8plusa
|
||||
AFLAGS= -x assembler-with-cpp -traditional-cpp -D_LOCORE -D__ELF__ -Wa,-Av9a ${CEXTRAFLAGS} #-Wa,-Av8plusa
|
||||
.endif
|
||||
NORMAL_S= ${CC} ${AFLAGS} ${CPPFLAGS} -c $<
|
||||
srt0.o: srt0.s
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: boot.c,v 1.10 1999/10/25 14:04:38 kleink Exp $ */
|
||||
/* $NetBSD: boot.c,v 1.11 2000/03/06 01:29:04 eeh Exp $ */
|
||||
#define DEBUG
|
||||
/*
|
||||
* Copyright (c) 1997, 1999 Eduardo E. Horvath. All rights reserved.
|
||||
|
@ -61,6 +61,8 @@
|
|||
#include <sparc64/stand/ofwboot/ofdev.h>
|
||||
#include <sparc64/stand/ofwboot/openfirm.h>
|
||||
|
||||
#define MEG (1024*1024)
|
||||
|
||||
/*
|
||||
* Boot device is derived from ROM provided information, or if there is none,
|
||||
* this list is used in sequence, to find a kernel.
|
||||
|
@ -403,6 +405,7 @@ elf32_exec(fd, elf, entryp, ssymp, esymp)
|
|||
void *addr;
|
||||
size_t size;
|
||||
int i, first = 1;
|
||||
long align;
|
||||
int n;
|
||||
|
||||
/*
|
||||
|
@ -429,7 +432,15 @@ elf32_exec(fd, elf, entryp, ssymp, esymp)
|
|||
printf("%s%lu@0x%lx", first ? "" : "+", phdr.p_filesz,
|
||||
(u_long)phdr.p_vaddr);
|
||||
(void)lseek(fd, phdr.p_offset, SEEK_SET);
|
||||
/* NB need to do 4MB allocs here */
|
||||
|
||||
/*
|
||||
* 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");
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
/* $NetBSD: elfXX_exec.c,v 1.4 1999/10/25 14:04:38 kleink Exp $ */
|
||||
/* $NetBSD: elfXX_exec.c,v 1.5 2000/03/06 01:29:04 eeh Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1998-2000 Eduardo Horvath. All rights reserved.
|
||||
* Copyright (c) 1997 Jason R. Thorpe. All rights reserved.
|
||||
* Copyright (C) 1995, 1996 Wolfgang Solfrank.
|
||||
* Copyright (C) 1995, 1996 TooLs GmbH.
|
||||
|
@ -44,6 +45,7 @@
|
|||
|
||||
#define CONCAT(x,y) __CONCAT(x,y)
|
||||
#define CAT3(s,m,e) CONCAT(s,CONCAT(m,e))
|
||||
#define MEG (1024*1024)
|
||||
|
||||
#if 0
|
||||
int CAT3(elf,ELFSIZE,_exec) __P((int, CAT3(Elf,ELFSIZE,_Ehdr) *, u_int64_t *, void **, void **));
|
||||
|
@ -61,6 +63,7 @@ CAT3(elf, ELFSIZE, _exec)(fd, elf, entryp, ssymp, esymp)
|
|||
CAT3(Elf,ELFSIZE,_Off) off;
|
||||
void *addr;
|
||||
size_t size;
|
||||
u_int align;
|
||||
int i, first = 1;
|
||||
int n;
|
||||
|
||||
|
@ -72,18 +75,14 @@ CAT3(elf, ELFSIZE, _exec)(fd, elf, entryp, ssymp, esymp)
|
|||
printf("elf%d_exec: ", ELFSIZE);
|
||||
#endif
|
||||
printf("Booting %s\n", opened_name);
|
||||
printf("reading %ld program headers\n", (long)elf->e_phnum);
|
||||
|
||||
for (i = 0; i < elf->e_phnum; i++) {
|
||||
CAT3(Elf,ELFSIZE,_Phdr) phdr;
|
||||
printf("reading phdr %d at %lx\n", i, (long)(elf->e_phoff + sizeof(phdr) * i));
|
||||
size = lseek(fd, (size_t)(elf->e_phoff + sizeof(phdr) * i), SEEK_SET);
|
||||
printf("lseek sez: %lx %s\n", (long)size, (size<0)?strerror(errno):"");
|
||||
if (read(fd, (void *)&phdr, sizeof(phdr)) != sizeof(phdr)) {
|
||||
printf("read phdr: %s\n", strerror(errno));
|
||||
return (1);
|
||||
}
|
||||
printf("reading phdr worked, type %lx flags %lx\n", (long)phdr.p_type, (long)phdr.p_flags);
|
||||
if (phdr.p_type != PT_LOAD ||
|
||||
(phdr.p_flags & (PF_W|PF_X)) == 0)
|
||||
continue;
|
||||
|
@ -92,8 +91,15 @@ printf("reading phdr worked, type %lx flags %lx\n", (long)phdr.p_type, (long)phd
|
|||
printf("%s%lu@0x%lx", first ? "" : "+", (u_long)phdr.p_filesz,
|
||||
(u_long)phdr.p_vaddr);
|
||||
(void)lseek(fd, (size_t)phdr.p_offset, SEEK_SET);
|
||||
/* NB need to do 4MB allocs here */
|
||||
if (OF_claim((void *)(long)phdr.p_vaddr, phdr.p_memsz, phdr.p_align) ==
|
||||
/*
|
||||
* 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 *)(long)phdr.p_vaddr, phdr.p_memsz, align) ==
|
||||
(void *)-1)
|
||||
panic("cannot claim memory");
|
||||
if (read(fd, (void *)(long)phdr.p_vaddr, phdr.p_filesz) !=
|
||||
|
|
Loading…
Reference in New Issue