1 INTERFACE [noncont_mem]:
5 EXTENSION class Mem_layout
8 static Address phys_to_pmem(Address addr);
9 static void add_pmem(Address phys, Address virt, unsigned long size);
11 static inline unsigned long round_superpage(unsigned long addr)
12 { return (addr + Config::SUPERPAGE_SIZE - 1) & ~(Config::SUPERPAGE_SIZE-1); }
13 static inline unsigned long trunc_superpage(unsigned long addr)
14 { return addr & ~(Config::SUPERPAGE_SIZE-1); }
16 static unsigned short __ph_to_pm[1UL<<(32-Config::SUPERPAGE_SHIFT)];
20 IMPLEMENTATION [noncont_mem]:
28 Mem_layout::pmem_to_phys(Address addr)
30 printf("Mem_layout::pmem_to_phys(Address addr=%lx) is not implemented\n",
37 Mem_layout::pmem_to_phys(void const *addr)
39 return pmem_to_phys(Address(addr));
41 unsigned short Mem_layout::__ph_to_pm[1<<(32-Config::SUPERPAGE_SHIFT)];
43 IMPLEMENT inline NEEDS[<config.h>]
45 Mem_layout::phys_to_pmem(Address phys)
47 Address virt = ((unsigned long)__ph_to_pm[phys >> Config::SUPERPAGE_SHIFT])
53 return virt | (phys & (Config::SUPERPAGE_SIZE-1));
58 IMPLEMENT inline ALWAYS_INLINE NEEDS[<config.h>]
60 Mem_layout::add_pmem(Address phys, Address virt, unsigned long size)
62 for (;size >= Config::SUPERPAGE_SIZE; size -= Config::SUPERPAGE_SIZE)
64 __ph_to_pm[phys >> Config::SUPERPAGE_SHIFT] = virt >> 16;
65 phys += Config::SUPERPAGE_SIZE;
66 virt += Config::SUPERPAGE_SIZE;