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[1<<(32-Config::SUPERPAGE_SHIFT)];
20 IMPLEMENTATION [noncont_mem]:
27 Mem_layout::pmem_to_phys (Address addr)
29 printf("Mem_layout::pmem_to_phys(Address addr=%lx) is not implemented\n",
36 Mem_layout::pmem_to_phys(void const *addr)
38 return pmem_to_phys(Address(addr));
40 unsigned short Mem_layout::__ph_to_pm[1<<(32-Config::SUPERPAGE_SHIFT)];
42 IMPLEMENT inline NEEDS[<config.h>]
44 Mem_layout::phys_to_pmem(Address phys)
46 Address virt = ((unsigned long)__ph_to_pm[phys >> Config::SUPERPAGE_SHIFT])
52 return virt | (phys & (Config::SUPERPAGE_SIZE-1));
57 IMPLEMENT inline NEEDS[<config.h>]
59 Mem_layout::add_pmem(Address phys, Address virt, unsigned long size)
61 for (;size >= Config::SUPERPAGE_SIZE; size -= Config::SUPERPAGE_SIZE)
63 __ph_to_pm[phys >> Config::SUPERPAGE_SHIFT] = virt >> 16;
64 phys += Config::SUPERPAGE_SIZE;
65 virt += Config::SUPERPAGE_SIZE;