Port-mips archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: NetBSD/ews4800mips 9.0 on NEC EWS4800/360AD
I wrote:
> Note there is something wrong in bootloader (/usr/mdec/boot)
> binary so it gets "Illegal exception" error just after it's loaded
> by the primary bootxx_bfs. An old /usr/mdec/boot binary from
> NetBSD/ews4800mips 5.0 still works.
It turns out that the primary bootxx_bfs binary doesn't load the
secondary boot built by recent toolchain.
In sys/arch/ews4800mips/stand/common/bootxx.c, load_elf() just
loads the first two problem header sections:
---
int
load_elf(uint8_t *buf, uint32_t *entry)
{
Elf32_Ehdr *e = (void *)buf;
Elf32_Phdr *p;
[..]
BASSERT(e->e_phentsize == sizeof(Elf32_Phdr));
p = (void *)(buf + e->e_phoff);
#ifdef _STANDALONE
memcpy((void *)p->p_vaddr, buf + p->p_offset, p->p_filesz);
p++;
memcpy((void *)p->p_vaddr, buf + p->p_offset, p->p_filesz);
#else
---
but recent gcc/binutils seem to create three sections.
5.0 /usr/mdec/boot (by readelf -a):
---
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
REGINFO 0x014c18 0xa0a14b98 0xa0a14b98 0x00018 0x00018 R 0x4
LOAD 0x000080 0xa0a00000 0xa0a00000 0x14e60 0x1a538 RWE 0x40
---
9.0 /usr/mdec/boot:
---
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
ABIFLAGS 0x015088 0xa0a14fc8 0xa0a14fc8 0x00018 0x00018 R 0x8
REGINFO 0x015070 0xa0a14fb0 0xa0a14fb0 0x00018 0x00018 R 0x4
LOAD 0x0000c0 0xa0a00000 0xa0a00000 0x15280 0x1a978 RWE 0x40
---
It works to change bootxx.c to check all sections in the problem header
as MI libsa loadfile_elf32.c does:
---
Index: common/bootxx.c
===================================================================
RCS file: /cvsroot/src/sys/arch/ews4800mips/stand/common/bootxx.c,v
retrieving revision 1.5
diff -u -p -d -r1.5 bootxx.c
--- common/bootxx.c 4 Feb 2009 15:22:13 -0000 1.5
+++ common/bootxx.c 6 Jun 2020 18:11:54 -0000
@@ -46,6 +46,10 @@
#include "common.h"
+#define IS_TEXT(p) (p.p_flags & PF_X)
+#define IS_DATA(p) ((p.p_flags & PF_X) == 0)
+#define IS_BSS(p) (p.p_filesz < p.p_memsz)
+
#define FILHSZ (sizeof(struct ecoff_filehdr))
#define SCNHSZ (sizeof(struct ecoff_scnhdr))
#define N_TXTOFF(f, a) \
@@ -186,6 +190,7 @@ load_elf(uint8_t *buf, uint32_t *entry)
{
Elf32_Ehdr *e = (void *)buf;
Elf32_Phdr *p;
+ int i;
if (e->e_ident[EI_MAG2] != 'L' || e->e_ident[EI_MAG3] != 'F' ||
e->e_ident[EI_CLASS] != ELFCLASS32 ||
@@ -197,16 +202,39 @@ load_elf(uint8_t *buf, uint32_t *entry)
BASSERT(e->e_phentsize == sizeof(Elf32_Phdr));
p = (void *)(buf + e->e_phoff);
#ifdef _STANDALONE
- memcpy((void *)p->p_vaddr, buf + p->p_offset, p->p_filesz);
- p++;
- memcpy((void *)p->p_vaddr, buf + p->p_offset, p->p_filesz);
+ for (i = 0; i < e->e_phnum; i++) {
+ if (p[i].p_type != PT_LOAD ||
+ (p[i].p_flags & (PF_W|PF_R|PF_X)) == 0)
+ continue;
+ if (IS_TEXT(p[i]) || IS_DATA(p[i])) {
+ memcpy((void *)p[i].p_vaddr,
+ buf + p[i].p_offset, p[i].p_filesz);
+ }
+ if (IS_BSS(p[i])) {
+ memset((void *)(p[i].p_vaddr + p[i].p_filesz), 0,
+ p[i].p_memsz - p[i].p_filesz);
+ }
+ }
#else
DPRINTF("ELF entry point 0x%08x\n", e->e_entry);
- DPRINTF("[text] 0x%08x 0x%x %dbyte.\n", p->p_vaddr, p->p_offset,
- p->p_filesz);
- p++;
- DPRINTF("[data] 0x%08x 0x%x %dbyte.\n", p->p_vaddr, p->p_offset,
- p->p_filesz);
+ for (i = 0; i < e->e_phnum; i++) {
+ if (p[i].p_type != PT_LOAD ||
+ (p[i].p_flags & (PF_W|PF_R|PF_X)) == 0)
+ continue;
+ if (IS_TEXT(p[i])) {
+ DPRINTF("[text] 0x%08x 0x%x %dbyte.\n",
+ p[i].p_vaddr, p[i].p_offset, p[i].p_filesz);
+ }
+ if (IS_DATA(p[i])) {
+ DPRINTF("[data] 0x%08x 0x%x %dbyte.\n",
+ p[i].p_vaddr, p[i].p_offset, p[i].p_filesz);
+ }
+ if (IS_BSS(p[i])) {
+ DPRINTF("[bss] 0x%08x %dbyte.\n",
+ p[i].p_vaddr + p[i].p_filesz,
+ p[i].p_memsz - p[i].p_filesz);
+ }
+ }
#endif
*entry = e->e_entry;
---
I'll commit fix and send a pullup request to netbsd-9.
---
Izumi Tsutsui
Home |
Main Index |
Thread Index |
Old Index