#ifndef MEMORY_H #define MEMORY_H #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) // 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 ((size_t) &__start) // this is 0x0 #define KERNEL_END ((size_t) &__end) // first 2^14 aligned address after the kernel #define TRANSLATION_TABLE_BASE ((size_t) &_translation_table_start) #define TRANSLATION_TABLE_END ((size_t) &_translation_table_end) // 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) // 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 PRIVILEGED_MEMORY_END STACK_END // 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