Hi,

It seems that the page table is corrupted after a program requesting some non-conventional memory under x86-64 SMP.

Here is a test case to reproduce the problem. The program would execute successfully. However, when I try to dump the page table in KDB, the output goes as follows:


> ptab
Space [current]: 0000003a00000001
CPU id [0]: 0
Memory area (Complete/User/Kernel(w/o tcb&remap)/Tcb/Remap/Manual) [complete]: complete
0000000000000000 [0000000000c3e027]: tree=ffffffffc0c3e000
0000000000000000 [0000000000c46027]:   tree=ffffffffc0c46000
0000000002000000 [0000000000c48027]:     tree=ffffffffc0c48000
0000000002000000 [0000000002000027]: phys=0000000002000000 map=ffffffffc0c47028 4KB rw~ (R~X) user WB 0000000002001000 [0000000002001027]: phys=0000000002001000 map=ffffffffc0c47088 4KB rw~ (R~X) user WB 0000000002011000 [0000000002011067]: phys=0000000002011000 map=ffffffffc0c47040 4KB rw~ (RWX) user WB
0000000080000000 [0000000000c3f027]:   tree=ffffffffc0c3f000
00000000bf000000 [0000000000c44027]:     tree=ffffffffc0c44000
00000000bf000000 [0000000000c42067]: phys=0000000000c42000 map=00000000bf000000 4KB rw~ (RWX) user WB
00000000bfe00000 [0000000000c40027]:     tree=ffffffffc0c40000
00000000bff00000 [000000000062e025]: phys=000000000062e000 map=00000000bff00000 4KB r~~ (R~X) user WB
00000000c0000000 [0000000000c4d007]:   tree=ffffffffc0c4d000
L4 Kernel BUG: X64 shouldn't have non-global superpages
Not implemented: word_t pgent_t::smp_reference_bits(space_t*, pgent_t::pgsize_e, void*) /home/mai4/work/dOS/src/dOS/l4ka/kernel/src/glue/v4-x86/x64/space.cc, line 110

I've no idea where to look at. Any suggestions are highly appreciated.

Haohui
#include <l4io.h>
#include <l4/ipc.h>
#include <l4/sigma0.h>

int main(int argc, char * argv[]) {
  L4_Word_t phy_addr_base = 0xf0000000;
  L4_Word_t size = 1 << 22; // 4M
  L4_Fpage_t rfpage = L4_Fpage( (L4_Word_t) phy_addr_base, size);
  L4_Set_Rights( &rfpage, L4_FullyAccessible);
  L4_Fpage_t res = L4_Sigma0_GetPage(L4_nilthread, rfpage);
  printf("Done mapping\n");
  L4_Sleep(L4_Never);
  return 0;
}

Reply via email to