Revert the last change. Masking only 2 MSBs of the virtual address

to get the physical address doesn't work for all values of KVA_PAGES,
while masking 8 MSBs works for all values of KVA_PAGES that are
multiple of 4 for non-PAE and 8 for PAE.  (This leaves us limited
with 12MB for non-PAE kernels and 14MB for PAE kernels.)

To get things right, we'd need to subtract the KERNBASE from the
virtual address (but KERNBASE is not easy to figure out from here),
or have physical addresses set properly in the ELF headers.

Discussed with:	jhb
This commit is contained in:
Ruslan Ermilov 2006-11-02 17:28:38 +00:00
parent d99b0dd2c5
commit 593bbd2195
5 changed files with 10 additions and 10 deletions

View File

@ -263,7 +263,7 @@ __elfN(loadimage)(struct preloaded_file *fp, elf_file_t ef, u_int64_t off)
#if __ELF_WORD_SIZE == 64
off = - (off & 0xffffffffff000000ull);/* x86_64 relocates after locore */
#else
off = - (off & 0xc0000000u); /* i386 relocates after locore */
off = - (off & 0xff000000u); /* i386 relocates after locore */
#endif
#else
off = 0; /* other archs use direct mapped kernels */

View File

@ -334,7 +334,7 @@ load(void)
return;
}
if (fmt == 0) {
addr = hdr.ex.a_entry & 0x3fffffff;
addr = hdr.ex.a_entry & 0xffffff;
p = PTOV(addr);
fs_off = PAGE_SIZE;
if (xfsread(ino, p, hdr.ex.a_text))
@ -368,7 +368,7 @@ load(void)
j++;
}
for (i = 0; i < 2; i++) {
p = PTOV(ep[i].p_paddr & 0x3fffffff);
p = PTOV(ep[i].p_paddr & 0xffffff);
fs_off = ep[i].p_offset;
if (xfsread(ino, p, ep[i].p_filesz))
return;
@ -389,7 +389,7 @@ load(void)
p += es[i].sh_size;
}
}
addr = hdr.eh.e_entry & 0x3fffffff;
addr = hdr.eh.e_entry & 0xffffff;
}
bootinfo.bi_esymtab = VTOP(p);
bootinfo.bi_kernelname = VTOP(kname);

View File

@ -334,7 +334,7 @@ load(void)
return;
}
if (fmt == 0) {
addr = hdr.ex.a_entry & 0x3fffffff;
addr = hdr.ex.a_entry & 0xffffff;
p = PTOV(addr);
fs_off = PAGE_SIZE;
if (xfsread(ino, p, hdr.ex.a_text))
@ -368,7 +368,7 @@ load(void)
j++;
}
for (i = 0; i < 2; i++) {
p = PTOV(ep[i].p_paddr & 0x3fffffff);
p = PTOV(ep[i].p_paddr & 0xffffff);
fs_off = ep[i].p_offset;
if (xfsread(ino, p, ep[i].p_filesz))
return;
@ -389,7 +389,7 @@ load(void)
p += es[i].sh_size;
}
}
addr = hdr.eh.e_entry & 0x3fffffff;
addr = hdr.eh.e_entry & 0xffffff;
}
bootinfo.bi_esymtab = VTOP(p);
bootinfo.bi_kernelname = VTOP(kname);

View File

@ -65,7 +65,7 @@ elf32_exec(struct preloaded_file *fp)
err = bi_load32(fp->f_args, &boothowto, &bootdev, &bootinfop, &modulep, &kernend);
if (err != 0)
return(err);
entry = ehdr->e_entry & 0x3fffffff;
entry = ehdr->e_entry & 0xffffff;
#ifdef DEBUG
printf("Start @ 0x%lx ...\n", entry);

View File

@ -199,9 +199,9 @@ loadprog(void)
/*
* We assume that the entry address is the same as the lowest text
* address and that the kernel startup code handles relocation by
* this address rounded down to a multiple of 1G.
* this address rounded down to a multiple of 16M.
*/
startaddr = head.a_entry & 0x3FFFFFFF;
startaddr = head.a_entry & 0x00FFFFFF;
addr = startaddr;
printf("Booting %d:%s(%d,%c)%s @ 0x%x\n"
, dosdev & 0x0f