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