1 //---------------------------------------------------------------------------
5 #include "template_math.h"
7 EXTENSION class Mem_layout
10 //TODO cbass: check what can be omitted
13 Utcb_ptr_page = 0x3000,
14 Syscalls_phys = 0x4000,
15 Tbuf_status_page = 0x5000,
16 Kernel_start = 0x6000, //end phys pool
17 Syscalls = 0xfffff000,
19 User_max = 0xf0000000,
21 Utcb_addr = User_max - 0x2000,
22 utcb_ptr_align = Tl_math::Ld<sizeof(void*)>::Res,
23 Tcbs_end = 0xe0000000,
24 __free_1_start = 0xec000000,
25 __free_1_end = 0xed000000,
26 Map_base = 0xf0000000, ///< % 80MB kernel memory
28 Caps_start = 0xf5000000,
29 Caps_end = 0xfd000000,
30 Kernel_image = 0xfd000000,
31 Kernel_max = 0x00000000,
34 static Address Tbuf_buffer_area;
35 static Address Tbuf_ubuffer_area;
38 //---------------------------------------------------------------------------
41 EXTENSION class Mem_layout
45 Uart_base = 0x80000100,
50 // ------------------------------------------------------------------------
51 IMPLEMENTATION [sparc]:
57 Address Mem_layout::Tbuf_buffer_area = 0;
58 Address Mem_layout::Tbuf_ubuffer_area = 0;
62 Mem_layout::phys_to_pmem (Address addr)
64 extern Mword kernel_srmmu_l1[256];
65 for (unsigned i = 0xF0; i < 0xFF; ++i)
67 if (kernel_srmmu_l1[i] != 0)
69 Mword v_page = addr & (0xFF << Pte_base::Pdir_shift);
70 Mword entry = (kernel_srmmu_l1[i] & Pte_base::Ppn_mask) << Pte_base::Ppn_addr_shift;
72 return (i << Pte_base::Pdir_shift) | (addr & ~(0xFF << Pte_base::Pdir_shift));
80 Mem_layout::pmem_to_phys (Address addr)
88 Mem_layout::pmem_to_phys (const void *ptr)
90 return reinterpret_cast<Address>(ptr);
94 template< typename V >
96 Mem_layout::read_special_safe(V const * /* *address */, V &/*v*/)
98 panic("%s not implemented", __PRETTY_FUNCTION__);
103 template< typename T >
105 Mem_layout::read_special_safe(T const *a)
112 /* no page faults can occur, return true */
115 Mem_layout::is_special_mapped(void const * /*a*/)
121 IMPLEMENTATION [sparc && debug]:
123 #include "kip_init.h"
126 PUBLIC static FIASCO_INIT
130 Mword alloc_size = 0x200000;
131 unsigned long max = ~0UL;
134 Mem_region r; r.start=2;r.end=1;// = Kip::k()->last_free(max);
136 panic("Corrupt memory descscriptor in KIP...");
138 if (r.start == r.end)
139 panic("not enough kernel memory");
142 Mword size = r.end - r.start + 1;
143 if(alloc_size <= size)
145 r.start += (size - alloc_size);
146 Kip::k()->add_mem_region(Mem_desc(r.start, r.end,
147 Mem_desc::Reserved));
149 printf("TBuf installed at: [%08lx; %08lx] - %lu KB\n",
150 r.start, r.end, alloc_size / 1024);
152 Tbuf_buffer_area = Tbuf_ubuffer_area = r.start;
157 if(!Tbuf_buffer_area)
158 panic("Could not allocate trace buffer");
161 IMPLEMENTATION [sparc && !debug]:
163 PUBLIC static FIASCO_INIT