aboutsummaryrefslogtreecommitdiff
path: root/memory.h
diff options
context:
space:
mode:
Diffstat (limited to 'memory.h')
-rw-r--r--memory.h71
1 files changed, 54 insertions, 17 deletions
diff --git a/memory.h b/memory.h
index 1472a8b..bdeba52 100644
--- a/memory.h
+++ b/memory.h
@@ -1,35 +1,72 @@
#ifndef MEMORY_H
#define MEMORY_H
-#define INTERRUPT_VECTOR_TABLE_START ((uint32_t) 0x0)
+#include <stddef.h>
+
+// These macros were heavily used b4 I moved all the address
+// computation to the linker script. Now I'm just keeping them
+// in case they're needed for something else :)
+#define POWER_OF_2(EXP) (((size_t) 1) << EXP)
+
+#define ALIGN_POWER_OF_2(ADDR, EXP) \
+ (((ADDR - 1) & ~(POWER_OF_2(EXP) - 1)) + POWER_OF_2(EXP))
+
+#define SECTION_SIZE POWER_OF_2(20)
+
+#define ALIGN_SECTION(ADDR) ALIGN_POWER_OF_2(ADDR, 20)
-#define STACK_START ((uint32_t) 0x4000)
-#define STACK_END ((uint32_t) 0x8000)
+// memory layout
+
+#define INTERRUPT_VECTOR_TABLE_START ((uint32_t) 0x0)
+
+// all those symbols are defined in the linker script
extern char __end;
extern char __start;
+extern char _translation_table_start;
+extern char _translation_table_end;
+extern char _sections_list_start;
+extern char _sections_list_end;
+extern char _stack_start;
+extern char _fiq_stack_start;
+extern char _fiq_stack_top;
+extern char _irq_stack_start;
+extern char _irq_stack_top;
+extern char _supervisor_stack_start;
+extern char _supervisor_stack_top;
+extern char _stack_end;
-#define KERNEL_START ((uint32_t) &__start)
-#define KERNEL_END ((uint32_t) &__end)
+#define KERNEL_START ((size_t) &__start) // this is 0x0
+#define KERNEL_END ((size_t) &__end)
// first 2^14 aligned address after the kernel
-#define TRANSLATION_TABLE_BASE \
- (((KERNEL_END - (uint32_t) 1) & ~((uint32_t) 0x3fff)) \
- + (uint32_t) 0x4000)
+#define TRANSLATION_TABLE_BASE ((size_t) &_translation_table_start)
+#define TRANSLATION_TABLE_END ((size_t) &_translation_table_end)
-#define TRANSLATION_TABLE_END \
- (TRANSLATION_TABLE_BASE + (uint32_t) (4096 * 4))
+// another 32KB after the translation table are used for sections list
+#define SECTIONS_LIST_START ((size_t) &_sections_list_start)
+#define SECTIONS_LIST_END ((size_t) &_sections_list_end)
-#define PRIVILEGED_MEMORY_END TRANSLATION_TABLE_END
+// first section after the translation table is left unused;
+// the next section is used as the stack
+#define STACK_START ((size_t) &_stack_start)
+#define FIQ_STACK_START ((size_t) &_fiq_stack_start)
+#define FIQ_STACK_END ((size_t) &_fiq_stack_top)
+#define IRQ_STACK_START ((size_t) &_irq_stack_start)
+#define IRQ_STACK_END ((size_t) &_irq_stack_top)
+#define SUPERVISOR_STACK_START ((size_t) &_supervisor_stack_start)
+#define SUPERVISOR_STACK_END ((size_t) &_supervisor_stack_top)
+#define STACK_END ((size_t) &_stack_end)
-#define UNPRIVILEGED_MEMORY_START \
- (((PRIVILEGED_MEMORY_END - (uint32_t) 1) & ~((uint32_t) 0xfffff)) \
- + (uint32_t) 0x100000)
+#define PRIVILEGED_MEMORY_END STACK_END
-#define PL0_SECTION_NUMBER ((uint32_t) 0b101010101010)
-#define PL0_SECTION_NUMBER_STR "0b101010101010"
+
+// the following describes the virtual section for our PL0 programs
+#define PL0_SECTION_NUMBER ((size_t) 0xaaa)
#define VIRTUAL_PL0_MEMORY_START (PL0_SECTION_NUMBER << 20)
+#define VIRTUAL_PL0_MEMORY_END \
+ (VIRTUAL_PL0_MEMORY_START + SECTION_SIZE)
#endif // MEMORY_H
-
+