added entries to gitignore
[barrelfish] / kernel / include / target / x86_64 / offsets_target.h
1 /**
2  * \file
3  * \brief X86-64 address space sizes and offsets
4  *
5  * The layout of the x86-64 virtual address space can be summarized as
6  * follows:
7  *
8  *<pre>
9  * +----------------------------------------------------+-----------------+
10  * | User-space                                         | Physical memory |
11  * | PML4 entries: 0 1 2 3 4 ... 510                    | 511             |
12  * +----------------------------------------------------+-----------------+</pre>
13  *
14  * User-space maps user-space programs. Physical memory maps all
15  * available physical memory (up to PADDR_SPACE_LIMIT).
16  *
17  * This partition is static and can only be changed at compile-time.
18  *
19  * Physical memory can grow downwards, towards user-space, although it
20  * is expected to stay within PML4 entry 511 for quite some time (one
21  * PML4 entry can map 512 GBytes). The rest of the address space can
22  * be freely mapped by (possibly multiple) user-space programs.
23  */
24
25 /*
26  * Copyright (c) 2007, 2008, 2009, 2010, 2011, ETH Zurich.
27  * All rights reserved.
28  *
29  * This file is distributed under the terms in the attached LICENSE file.
30  * If you do not find this file, copies can be found by writing to:
31  * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
32  */
33
34 #ifndef KERNEL_TARGET_X86_64_OFFSETS_H
35 #define KERNEL_TARGET_X86_64_OFFSETS_H
36
37 /**
38  * Absolute size of virtual address space. This is 48-bit on x86-64
39  * currently, which equals 256 TBytes and allows for 512 PML4 slots,
40  * each of which can map 512 GBytes.
41  */
42 #define X86_64_VADDR_SPACE_SIZE        ((genpaddr_t)1 << 48)
43
44 /**
45  * Absolute size of physical address space. This is also 48-bit.
46  */
47 #define X86_64_PADDR_SPACE_SIZE        ((genpaddr_t)1 << 48)
48
49 /**
50  * Start address of kernel image in physical memory. This is passed to
51  * the linker also. The bootloader will load us there.
52  */
53 #define X86_64_START_KERNEL_PHYS       0x100000
54
55 /**
56  * Kernel stack size -- 16KB
57  */
58 #define X86_64_KERNEL_STACK_SIZE       0x4000
59
60 /**
61  * Maximum physical address space mappable by the kernel.  Adjust this
62  * for a bigger physical address space.  We set this to 37-bit,
63  * i.e. 128 GBytes.
64  */
65 #define X86_64_PADDR_SPACE_LIMIT       ((genpaddr_t)1 << 37)
66
67 /**
68  * Static address space limit for the init user-space domain. The
69  * static space is used to map in code and static data of the init
70  * module, as well as all loaded multiboot modules. init can freely
71  * allocate dynamic memory as soon as it is running. This is 32 MBytes
72  * right now.
73  *
74  * You should make this constant a multiple of #BASE_PAGE_SIZE *
75  * #PTABLE_SIZE or you'll restrict init's static address space
76  * unneccessarily. init's lowest segment should also be based at these
77  * multiples or it restricts itself.
78  */
79 #define X86_64_INIT_SPACE_LIMIT        (32 * 1024 * 1024)
80
81 /**
82  * Base address of init address space in virtual memory. init should
83  * start at 4 MByte. The kernel maps in important structures at 2
84  * MByte. This address should be page-table size aligned (i.e. with 4
85  * KByte pages, a page table maps 2 MBytes. Thus, align it to
86  * multiples of 2 MBytes).
87  */
88 #define X86_64_INIT_VBASE              0x200000
89
90 /**
91  * Initial amount of physical memory to map during bootup. The low
92  * 1MByte of memory is always expected to be there and has to be
93  * specified here at minimum. If you need more during bootup, increase
94  * this value. This value is also the amount of memory you _expect_ to
95  * be in the system during bootup, or the kernel will crash!
96  */
97 #define X86_64_KERNEL_INIT_MEMORY      (1 * 1024 * 1024)
98
99 /**
100  * Aligns an address to the nearest PML4 entry by masking out lower 39
101  * bits.
102  */
103 #define X86_64_PML4_ALIGN(addr)        ((addr) & ((genpaddr_t)0x1ffffff << 39))
104
105 /**
106  * Absolute offset of mapped physical memory within virtual address
107  * space.  This occupies one or more (usually one) PML4 slots directly
108  * before the kernel. This needs to be aligned to PADDR_SPACE_LIMIT.
109  *
110  * Change VSPACE_END in lib/barrelfish if you change this.
111  */
112 #define X86_64_MEMORY_OFFSET        X86_64_PML4_ALIGN(-X86_64_PADDR_SPACE_LIMIT)
113
114 /**
115  * The real-mode addresses
116  */
117
118 #define X86_64_REAL_MODE_SEGMENT 0x0600 /**< The real-mode segment */
119 #define X86_64_REAL_MODE_OFFSET  0x0000 /**< The real-mode offset _has to be_ 0000!! */
120
121 #define X86_64_REAL_MODE_LINEAR_OFFSET \
122     (X86_64_REAL_MODE_SEGMENT << 4) /**< The linear offset
123                                        of the real-mode
124                                        segment */
125
126 #define X86_64_REAL_MODE_SEGMENT_TO_REAL_MODE_PAGE(seg) ((uint8_t)(seg >> 8))
127 #define X86_64_REAL_MODE_ADDR_TO_REAL_MODE_VECTOR(seg,off) ((uint32_t)(seg << 16) | off)
128
129 #ifndef __ASSEMBLER__
130
131 /**
132  * \brief The kernel stack.
133  */
134 extern uintptr_t x86_64_kernel_stack[X86_64_KERNEL_STACK_SIZE/sizeof(uintptr_t)];
135
136 #endif
137
138 #endif // KERNEL_TARGET_X86_64_OFFSETS_H