]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/ia32/64/mem_layout-ia32-64.cpp
update
[l4.git] / kernel / fiasco / src / kern / ia32 / 64 / mem_layout-ia32-64.cpp
1 INTERFACE [amd64]:
2
3 #include "types.h"
4 #include "config.h"
5 #include "linking.h"
6
7 EXTENSION class Mem_layout
8 {
9 public:
10   enum Flags
11   {
12     /// Is the adapter memory in the kernel image super page?
13     Adap_in_kernel_image = FIASCO_IMAGE_PHYS_START < Config::SUPERPAGE_SIZE,
14   };
15
16   enum
17   {
18     Utcb_addr         = 0xffffffff8ff00000UL,    ///< % 4kB UTCB map address
19     Kip_auto_map      = 0xffffffff8fff2000UL,    ///< % 4kB
20     User_max          = 0x0000800000000000UL,
21     Slabs_start       = 0xffffffffe0000000UL,    ///<       multipage slabs
22     Slabs_end         = 0xffffffffea000000UL,    ///<       slabs_start + 160MB
23     Space_index       = 200,
24     Service_page      = 0xffffffffeac00000UL,    ///< % 4MB global mappings
25     Local_apic_page   = Service_page + 0x0000,   ///< % 4KB
26     Io_apic_page      = Service_page + 0x1000,   ///< % 4KB
27     Kmem_tmp_page_1   = Service_page + 0x2000,   ///< % 4KB size 8KB
28     Kmem_tmp_page_2   = Service_page + 0x4000,   ///< % 4KB size 8KB
29     Tbuf_status_page  = Service_page + 0x6000,   ///< % 4KB
30     Tbuf_ustatus_page = Tbuf_status_page,
31     Hpet_page         = Service_page + 0x7000,   ///< % 4KB
32     Jdb_bench_page    = Service_page + 0x8000,   ///< % 4KB
33     Utcb_ptr_page     = Service_page + 0xfd000,  ///< % 4KB
34     Utcb_ptr_offset   = Utcb_ptr_page,
35     Idt               = Service_page + 0xfe000,  ///< % 4KB
36     Syscalls          = Service_page + 0xff000,  ///< % 4KB syscall page
37     Tbuf_buffer_area  = Service_page + 0x200000, ///< % 2MB
38     Tbuf_ubuffer_area = Tbuf_buffer_area,
39     // 0xffffffffeb800000-0xfffffffffec000000 (8MB) free
40     ___free_1         = 0xffffffffec000000UL, ///< % 4MB
41     ___free_2         = 0xffffffffec400000UL, ///< % 4MB
42     ___free_3         = 0xffffffffec800000UL, ///< % 4MB
43     ___free_4         = 0xffffffffec880000UL, ///< % 4MB
44     Jdb_debug_start   = 0xffffffffecc00000UL,    ///< % 4MB   JDB symbols/lines
45     Jdb_debug_end     = 0xffffffffee000000UL,    ///< % 4MB
46     // 0xffffffffee000000-0xffffffffef800000 (24MB) free
47     Kstatic           = 0xffffffffef800000UL,    ///< % 4MB Io_bitmap
48     Io_bitmap         = 0xffffffffefc00000UL,    ///< % 4MB
49     Vmem_end          = 0xfffffffff0000000UL,
50
51     Kernel_image        = FIASCO_IMAGE_VIRT_START,
52     Kernel_image_end    = Kernel_image + Config::SUPERPAGE_SIZE,
53
54     Adap_image           = Adap_in_kernel_image
55                            ? Kernel_image
56                            : Kernel_image + Config::SUPERPAGE_SIZE,
57
58     Adap_vram_mda_beg = Adap_image + 0xb0000, ///< % 8KB video RAM MDA memory
59     Adap_vram_mda_end = Adap_image + 0xb8000,
60     Adap_vram_cga_beg = Adap_image + 0xb8000, ///< % 8KB video RAM CGA memory
61     Adap_vram_cga_end = Adap_image + 0xc0000,
62
63     Caps_start        = 0xfffffffff0800000UL,    ///< % 4MB
64     Caps_end          = 0xfffffffffc400000UL,    ///< % 4MB
65     Physmem           = 0xfffffffffc400000UL,    ///< % 4MB   kernel memory
66     Kernel_end        = 0xffffffffffffffffUL+1,    ///< % end of address space
67   };
68
69   enum Offsets
70   {
71     Kernel_image_offset = FIASCO_IMAGE_PHYS_OFFSET,
72   };
73
74   enum Phys_addrs
75   {
76     Kernel_image_phys = FIASCO_IMAGE_PHYS_START & Config::SUPERPAGE_MASK,
77     Adap_image_phys   = 0,
78   };
79
80   template < typename T > static T* boot_data (T const *addr);
81
82   static Address pmem_size;
83 private:
84   static Address physmem_offs asm ("PHYSMEM_OFFS");
85 };
86
87 IMPLEMENTATION [amd64]:
88
89 #include <cassert>
90 #include <kdb_ke.h>
91
92 Address Mem_layout::physmem_offs;
93 Address Mem_layout::pmem_size;
94
95
96 PUBLIC static inline
97 void
98 Mem_layout::kphys_base (Address base)
99 {
100   physmem_offs = (Address)Physmem - base;
101 }
102
103 PUBLIC static inline NEEDS[<cassert>]
104 Address
105 Mem_layout::pmem_to_phys (Address addr)
106 {
107   assert (in_pmem(addr));
108   return addr - physmem_offs;
109 }
110
111 PUBLIC static inline NEEDS[<kdb_ke.h>]
112 Address
113 Mem_layout::pmem_to_phys (const void *ptr)
114 {
115   Address addr = reinterpret_cast<Address>(ptr);
116
117   assert_kdb (in_pmem(addr));
118   return addr - physmem_offs;
119 }
120
121 PUBLIC static inline
122 Address
123 Mem_layout::phys_to_pmem(Address addr)
124 {
125   return addr + physmem_offs;
126 }
127
128 PUBLIC static inline
129 Mword
130 Mem_layout::in_kernel_image(Address addr)
131 {
132   return addr >= Kernel_image && addr < Kernel_image_end;
133 }
134
135 PUBLIC static inline
136 Mword
137 Mem_layout::in_pmem(Address addr)
138 {
139   return addr >= Physmem;
140 }