Changeset 1fbbcd6 in mainline
- Timestamp:
- 2005-08-29T20:31:23Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 81887b7
- Parents:
- 4dd0704
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
arch/ia32/include/asm.h
r4dd0704 r1fbbcd6 162 162 * Return the base address of the current stack. 163 163 * The stack is assumed to be STACK_SIZE bytes long. 164 * The stack must start on page boundary. 164 165 */ 165 166 static inline __address get_stack_base(void) -
arch/ia32/include/context.h
r4dd0704 r1fbbcd6 32 32 #include <arch/types.h> 33 33 34 #define STACK_ITEM_SIZE 4 35 34 36 /* 35 37 * Both context_save() and context_restore() eat two doublewords from the stack. 36 38 * First for pop of the saved register, second during ret instruction. 39 * 40 * One item is put onto stack to support get_stack_base(). 37 41 */ 38 #define SP_DELTA 842 #define SP_DELTA (8+STACK_ITEM_SIZE) 39 43 40 44 struct context { -
arch/ia32/include/cpu.h
r4dd0704 r1fbbcd6 30 30 #define __ia32_CPU_H__ 31 31 32 #include <config.h>33 #include <proc/thread.h>34 32 #include <typedefs.h> 35 33 #include <arch/pm.h> -
arch/ia64/include/asm.h
r4dd0704 r1fbbcd6 33 33 #include <config.h> 34 34 35 /* TODO: implement the real stuff */ 35 /** Return base address of current stack 36 * 37 * Return the base address of the current stack. 38 * The stack is assumed to be STACK_SIZE long. 39 * The stack must start on page boundary. 40 */ 36 41 static inline __address get_stack_base(void) 37 42 { 38 return NULL; 43 __u64 v; 44 45 __asm__ volatile ("and %0 = %1, r12" : "=r" (v) : "r" (~(STACK_SIZE-1))); 46 47 return v; 39 48 } 40 49 -
arch/ia64/include/context.h
r4dd0704 r1fbbcd6 32 32 #include <arch/types.h> 33 33 34 #define STACK_ITEM_SIZE 16 35 34 36 /* 35 37 * context_save() and context_restore() are both leaf procedures. 36 38 * No need to allocate scratch area. 39 * 40 * One item is put onto the stack to support get_stack_base(). 37 41 */ 38 #define SP_DELTA 042 #define SP_DELTA (0+STACK_ITEM_SIZE) 39 43 40 44 #ifdef context_set -
arch/mips/include/asm.h
r4dd0704 r1fbbcd6 39 39 * Return the base address of the current stack. 40 40 * The stack is assumed to be STACK_SIZE bytes long. 41 * The stack must start on page boundary. 41 42 */ 42 43 static inline __address get_stack_base(void) -
arch/mips/include/context.h
r4dd0704 r1fbbcd6 32 32 #include <arch/types.h> 33 33 34 #define SP_DELTA 0 34 #define STACK_ITEM_SIZE 4 35 36 /* 37 * Put one item onto the stack to support get_stack_base(). 38 */ 39 #define SP_DELTA (0+STACK_ITEM_SIZE) 35 40 36 41 -
src/main/main.c
r4dd0704 r1fbbcd6 74 74 size_t hardcoded_kdata_size = 0; 75 75 76 /* 77 * Size of memory in bytes taken by kernel and heap. 78 */ 79 static size_t kernel_size; 80 81 /* 82 * Extra space on heap to make the stack start on page boundary. 83 */ 84 static size_t heap_delta; 85 76 86 void main_bsp(void); 77 87 void main_ap(void); … … 86 96 static void main_ap_separated_stack(void); 87 97 88 89 98 /** Bootstrap CPU main kernel routine 90 99 * … … 98 107 config.cpu_count = 1; 99 108 config.cpu_active = 1; 100 size_t size, delta; 101 102 /* 103 * Calculate 'size' that kernel and heap occupies in memory. 104 */ 105 size = hardcoded_ktext_size + hardcoded_kdata_size + CONFIG_HEAP_SIZE; 106 107 /* 108 * We need the boot stack to start on page boundary. 109 * That is why 'delta' is calculated. 110 */ 111 delta = PAGE_SIZE - ((hardcoded_load_address + size) % PAGE_SIZE); 112 delta = (delta == PAGE_SIZE) ? 0 : delta; 113 114 size += delta; 109 110 kernel_size = hardcoded_ktext_size + hardcoded_kdata_size + CONFIG_HEAP_SIZE; 111 heap_delta = PAGE_SIZE - ((hardcoded_load_address + kernel_size) % PAGE_SIZE); 112 heap_delta = (heap_delta == PAGE_SIZE) ? 0 : heap_delta; 113 kernel_size += heap_delta; 115 114 116 115 config.base = hardcoded_load_address; 117 116 config.memory_size = get_memory_size(); 118 config.kernel_size = size + CONFIG_STACK_SIZE;117 config.kernel_size = kernel_size + CONFIG_STACK_SIZE; 119 118 120 119 context_save(&ctx); 121 context_set(&ctx, FADDR(main_bsp_separated_stack), config.base + size, CONFIG_STACK_SIZE);120 context_set(&ctx, FADDR(main_bsp_separated_stack), config.base + kernel_size, CONFIG_STACK_SIZE); 122 121 context_restore(&ctx); 123 122 /* not reached */ … … 136 135 thread_t *t; 137 136 137 THE->preemption_disabled = 0; 138 THE->cpu = NULL; 139 THE->thread = NULL; 140 THE->task = NULL; 141 138 142 arch_pre_mm_init(); 139 140 heap_init(config.base + hardcoded_ktext_size + hardcoded_kdata_size, CONFIG_HEAP_SIZE); 143 heap_init(config.base + hardcoded_ktext_size + hardcoded_kdata_size, CONFIG_HEAP_SIZE + heap_delta); 141 144 frame_init(); 142 145 page_init();
Note:
See TracChangeset
for help on using the changeset viewer.