Currently, hpcboot loads all ELF files the
virtual address from the ELF
program headers... however, at least on ARM (and I believe
on SH and MIPS
too) the kernel is actually loaded into physical memory.
Is there any reason not to load the kernels at the physaddr
given in the
ELF header vs. the vaddr as we do now? That way, we could
load kernels
like the following and not have to redesign the VM layout
when the HW
memory layout changes.
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz
MemSiz Flg Align
LOAD 0x008000 0xc0200000 0xa0200000 0x1d3a94
0x1d3a94 R E 0x8000
LOAD 0x1e0000 0xc03d8000 0xa03d8000 0x05f48
0x4d9c0 RW 0x8000
Patch below.
--rafal
Index: load_elf.cpp
============================================================
=======
RCS file:
/cvsroot/src/sys/arch/hpc/stand/hpcboot/load_elf.cpp,v
retrieving revision 1.17
diff -u -p -r1.17 load_elf.cpp
--- load_elf.cpp 5 Mar 2006 04:04:13 -0000
1.17
+++ load_elf.cpp 10 Mar 2008 19:16:22 -0000
 -166,9
+166,9  ElfLoader::load()
if (ph->p_type == PT_LOAD) {
size_t filesz = ph->p_filesz;
size_t memsz = ph->p_memsz;
- kv = ph->p_vaddr;
+ kv = ph->p_paddr;
off_t fileofs = ph->p_offset;
- DPRINTF((TEXT("seg[%d] vaddr
0x%08x file size 0x%x mem s
ize 0x%xn"),
+ DPRINTF((TEXT("seg[%d] paddr
0x%08x file size 0x%x mem s
ize 0x%xn"),
i, kv, filesz, memsz));
_load_segment(kv, memsz, fileofs,
filesz);
kv += ROUND4(memsz);
--
Time is an illusion; lunchtime, doubly so. |//|
Rafal Boni
-- Ford Prefect |//|
rafal pobox.com
|