1 //---------------------------------------------------------------------------
5 #include "template_math.h"
7 EXTENSION class Mem_layout
10 //TODO cbass: check what can be omitted
12 enum Phys_layout : Address
14 Utcb_ptr_page = 0x3000,
15 Syscalls_phys = 0x4000,
16 Tbuf_status_page = 0x5000,
17 Kernel_start = 0x6000, //end phys pool
18 Syscalls = 0xfffff000,
20 User_max = 0xefffffff,
22 Utcb_addr = User_max + 1 - 0x2000,
23 utcb_ptr_align = Tl_math::Ld<sizeof(void*)>::Res,
24 Tcbs_end = 0xe0000000,
25 __free_1_start = 0xec000000,
26 __free_1_end = 0xed000000,
27 Map_base = 0xf0000000, ///< % 80MB kernel memory
29 Caps_start = 0xf5000000,
30 Caps_end = 0xfd000000,
31 Kernel_image = 0xfd000000,
32 Kernel_max = 0x00000000,
35 static Address Tbuf_buffer_area;
36 static Address Tbuf_ubuffer_area;
39 //---------------------------------------------------------------------------
42 EXTENSION class Mem_layout
46 Uart_base = 0x80000100,
51 // ------------------------------------------------------------------------
52 IMPLEMENTATION [sparc]:
58 Address Mem_layout::Tbuf_buffer_area = 0;
59 Address Mem_layout::Tbuf_ubuffer_area = 0;
63 Mem_layout::phys_to_pmem (Address addr)
65 extern Mword kernel_srmmu_l1[256];
66 for (unsigned i = 0xF0; i < 0xFF; ++i)
68 if (kernel_srmmu_l1[i] != 0)
70 Mword v_page = addr & (0xFF << Pte_ptr::Pdir_shift);
71 Mword entry = (kernel_srmmu_l1[i] & Pte_ptr::Ppn_mask) << Pte_ptr::Ppn_addr_shift;
73 return (i << Pte_ptr::Pdir_shift) | (addr & ~(0xFF << Pte_ptr::Pdir_shift));
81 Mem_layout::pmem_to_phys (Address addr)
89 Mem_layout::pmem_to_phys (const void *ptr)
91 return reinterpret_cast<Address>(ptr);
95 template< typename V >
97 Mem_layout::read_special_safe(V const * /* *address */, V &/*v*/)
99 panic("%s not implemented", __PRETTY_FUNCTION__);
104 template< typename T >
106 Mem_layout::read_special_safe(T const *a)
113 /* no page faults can occur, return true */
116 Mem_layout::is_special_mapped(void const * /*a*/)
122 IMPLEMENTATION [sparc && debug]:
124 #include "kip_init.h"
127 PUBLIC static FIASCO_INIT
131 Mword alloc_size = 0x200000;
132 unsigned long max = ~0UL;
135 Mem_region r; r.start=2;r.end=1;// = Kip::k()->last_free(max);
137 panic("Corrupt memory descscriptor in KIP...");
139 if (r.start == r.end)
140 panic("not enough kernel memory");
143 Mword size = r.end - r.start + 1;
144 if(alloc_size <= size)
146 r.start += (size - alloc_size);
147 Kip::k()->add_mem_region(Mem_desc(r.start, r.end,
148 Mem_desc::Reserved));
150 printf("TBuf installed at: [%08lx; %08lx] - %lu KB\n",
151 r.start, r.end, alloc_size / 1024);
153 Tbuf_buffer_area = Tbuf_ubuffer_area = r.start;
158 if(!Tbuf_buffer_area)
159 panic("Could not allocate trace buffer");
162 IMPLEMENTATION [sparc && !debug]:
164 PUBLIC static FIASCO_INIT