]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/sparc/mem_layout-sparc.cpp
update
[l4.git] / kernel / fiasco / src / kern / sparc / mem_layout-sparc.cpp
1 //---------------------------------------------------------------------------
2 INTERFACE [sparc]:
3
4 #include "initcalls.h"
5 #include "template_math.h"
6
7 EXTENSION class Mem_layout
8 {
9
10 //TODO cbass: check what can be omitted
11 public:
12   enum Phys_layout : Address
13   {
14     Utcb_ptr_page        = 0x3000,
15     Syscalls_phys        = 0x4000,
16     Tbuf_status_page     = 0x5000,
17     Kernel_start         = 0x6000,   //end phys pool
18     Syscalls             = 0xfffff000,
19
20     User_max             = 0xefffffff,
21     Tcbs                 = 0xc0000000,
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
28     Map_end              = 0xf5000000,
29     Caps_start           = 0xf5000000,
30     Caps_end             = 0xfd000000,
31     Kernel_image         = 0xfd000000,
32     Kernel_max           = 0x00000000,
33   };
34
35   static Address Tbuf_buffer_area;
36   static Address Tbuf_ubuffer_area;
37 };
38
39 //---------------------------------------------------------------------------
40 INTERFACE [sparc]:
41
42 EXTENSION class Mem_layout
43 {
44 public:
45   enum {
46     Uart_base = 0x80000100,
47   };
48 };
49
50
51 // ------------------------------------------------------------------------
52 IMPLEMENTATION [sparc]:
53
54 #include "panic.h"
55 #include "paging.h"
56 #include <cstdio>
57
58 Address Mem_layout::Tbuf_buffer_area = 0;
59 Address Mem_layout::Tbuf_ubuffer_area = 0;
60
61 PUBLIC static
62 Address
63 Mem_layout::phys_to_pmem (Address addr)
64 {
65   extern Mword kernel_srmmu_l1[256];
66   for (unsigned i = 0xF0; i < 0xFF; ++i)
67     {
68       if (kernel_srmmu_l1[i] != 0)
69         {
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;
72           if (entry == v_page)
73             return (i << Pte_ptr::Pdir_shift) | (addr & ~(0xFF << Pte_ptr::Pdir_shift));
74         }
75     }
76   return ~0L;
77 }
78
79 PUBLIC static inline
80 Address
81 Mem_layout::pmem_to_phys (Address addr)
82 {
83   (void)addr;
84   return ~0L;
85 }
86
87 PUBLIC static inline
88 Address
89 Mem_layout::pmem_to_phys (const void *ptr)
90 {
91   return reinterpret_cast<Address>(ptr);
92 }
93
94 PUBLIC static inline
95 template< typename V >
96 bool
97 Mem_layout::read_special_safe(V const * /* *address */, V &/*v*/)
98 {
99   panic("%s not implemented", __PRETTY_FUNCTION__);
100   return false;
101 }
102
103 PUBLIC static inline
104 template< typename T >
105 T
106 Mem_layout::read_special_safe(T const *a)
107 {
108   Mword res;
109   return T(res);
110 }
111
112
113 /* no page faults can occur, return true */
114 PUBLIC static inline
115 bool
116 Mem_layout::is_special_mapped(void const * /*a*/)
117 {
118   return true;
119 }
120
121
122 IMPLEMENTATION [sparc && debug]:
123
124 #include "kip_init.h"
125
126
127 PUBLIC static FIASCO_INIT
128 void
129 Mem_layout::init()
130 {
131   Mword alloc_size = 0x200000;
132   unsigned long max = ~0UL;
133   for (;;)
134     {
135       Mem_region r; r.start=2;r.end=1;// = Kip::k()->last_free(max);
136       if (r.start > r.end)
137         panic("Corrupt memory descscriptor in KIP...");
138
139       if (r.start == r.end)
140         panic("not enough kernel memory");
141
142       max = r.start;
143       Mword size = r.end - r.start + 1;
144       if(alloc_size <= size)
145         {
146           r.start += (size - alloc_size);
147           Kip::k()->add_mem_region(Mem_desc(r.start, r.end,
148                                             Mem_desc::Reserved));
149
150           printf("TBuf  installed at: [%08lx; %08lx] - %lu KB\n", 
151                  r.start, r.end, alloc_size / 1024);
152
153           Tbuf_buffer_area = Tbuf_ubuffer_area = r.start;
154           break;
155         }
156     }
157
158     if(!Tbuf_buffer_area)
159       panic("Could not allocate trace buffer");
160 }
161
162 IMPLEMENTATION [sparc && !debug]:
163
164 PUBLIC static FIASCO_INIT
165 void
166 Mem_layout::init()
167 {}