Changeset b6b576c in mainline
- Timestamp:
- 2006-03-16T11:34:51Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- d764ddc
- Parents:
- 8dfef11
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
arch/amd64/src/boot/boot.S
r8dfef11 rb6b576c 173 173 174 174 mods_invalid: 175 movq %rcx, init_size176 movq %rdx, init_addr175 # movq %rcx, init_size 176 # movq %rdx, init_addr 177 177 178 178 bt $6, %eax # mbi->flags[6] (mmap_length, mmap_addr valid) -
arch/ia32/src/boot/boot.S
r8dfef11 rb6b576c 100 100 movl %ecx, e801memorysize 101 101 102 bt $3, %eax # mbi->flags[3] (mods_count, mods_addr valid) 102 bt $3, %eax # mbi->flags[3] (mods_count, mods_addr valid) 103 103 jc mods_valid 104 104 105 105 xorl %ecx, %ecx 106 xorl %edx, %edx107 jmp mods_ invalid106 movl %ecx, init 107 jmp mods_end 108 108 109 109 mods_valid: 110 110 111 movl 20(%ebx), %ecx # mbi->mods_count 112 movl %ecx, init 113 111 114 cmpl $0, %ecx 112 je mods_ invalid115 je mods_end 113 116 114 117 movl 24(%ebx), %esi # mbi->mods_addr 115 movl 0(%esi), %edx # mods->mod_start 116 movl 4(%esi), %ecx # mods->mod_end 117 subl %edx, %ecx 118 addl $0x80000000, %edx 119 120 mods_invalid: 121 movl %ecx, init_size 122 movl %edx, init_addr 118 movl $init, %edi 119 120 mods_loop: 121 122 movl 0(%esi), %edx # mods->mod_start 123 addl $0x80000000, %edx 124 movl %edx, 4(%edi) 125 126 movl 4(%esi), %edx 127 subl 0(%esi), %edx # mods->mod_end - mods->mod_start 128 movl %edx, 8(%edi) 129 130 addl $16, %esi 131 addl $8 , %edi 132 133 loop mods_loop 134 135 mods_end: 123 136 124 137 bt $6, %eax # mbi->flags[6] (mmap_length, mmap_addr valid) -
arch/mips32/src/mips32.c
r8dfef11 rb6b576c 94 94 console_init(); 95 95 debugger_init(); 96 /* Setup usermode...*/ 97 config.init_addr = INIT_ADDRESS; 98 config.init_size = INIT_SIZE; 96 97 /* Setup usermode */ 98 init.cnt = 1; 99 init.tasks[0].addr = INIT_ADDRESS; 100 init.tasks[0].size = INIT_SIZE; 99 101 } 100 102 -
generic/include/config.h
r8dfef11 rb6b576c 36 36 #define STACK_SIZE PAGE_SIZE 37 37 38 #define CONFIG_MEMORY_SIZE (8 *1024*1024)38 #define CONFIG_MEMORY_SIZE (8 * 1024 * 1024) 39 39 #define CONFIG_STACK_SIZE STACK_SIZE 40 #define CONFIG_INIT_TASKS 32 40 41 41 struct config { 42 typedef struct { 43 __address addr; 44 size_t size; 45 } init_task_t; 46 47 typedef struct { 48 count_t cnt; 49 init_task_t tasks[CONFIG_INIT_TASKS]; 50 } init_t; 51 52 typedef struct { 42 53 count_t cpu_count; 43 54 volatile count_t cpu_active; … … 45 56 __address base; 46 57 size_t memory_size; 47 48 __address init_addr;49 size_t init_size;50 51 58 size_t kernel_size; /**< Size of memory in bytes taken by kernel and stack */ 52 } ;59 } config_t; 53 60 54 61 extern config_t config; 62 extern init_t init; 55 63 56 64 #endif -
generic/include/typedefs.h
r8dfef11 rb6b576c 41 41 typedef unsigned long long task_id_t; 42 42 43 typedef struct config config_t;44 43 typedef struct cpu_info cpu_info_t; 45 44 -
generic/src/main/kinit.c
r8dfef11 rb6b576c 133 133 134 134 interrupts_enable(); 135 136 if (config.init_size > 0) { 135 136 count_t i; 137 for (i = 0; i < init.cnt; i++) { 137 138 /* 138 * Create the first user task.139 * Run user tasks. 139 140 */ 140 141 141 if ( config.init_addr % FRAME_SIZE)142 panic(" config.init_addr is not frame aligned");142 if (init.tasks[i].addr % FRAME_SIZE) 143 panic("init[%d].addr is not frame aligned", i); 143 144 144 utask = task_run_program((void *) config.init_addr);145 utask = task_run_program((void *) init.tasks[i].addr); 145 146 if (utask) 146 147 ipc_phone_0 = &utask->answerbox; -
generic/src/main/main.c
r8dfef11 rb6b576c 64 64 65 65 config_t config; /**< Global configuration structure. */ 66 init_t init = {0}; /**< Initial user-space tasks */ 66 67 67 68 context_t ctx; … … 75 76 size_t hardcoded_ktext_size = 0; 76 77 size_t hardcoded_kdata_size = 0; 77 78 __address init_addr = 0;79 size_t init_size = 0;80 78 81 79 void main_bsp(void); … … 111 109 config.base = hardcoded_load_address; 112 110 config.memory_size = get_memory_size(); 113 config.init_addr = init_addr;114 config.init_size = init_size;115 111 116 112 config.kernel_size = ALIGN_UP(hardcoded_ktext_size + hardcoded_kdata_size, PAGE_SIZE); 117 113 stackaddr = config.base + config.kernel_size; 114 118 115 /* Avoid placing kernel on top of init */ 119 if (overlaps(stackaddr,CONFIG_STACK_SIZE, 120 config.init_addr, config.init_size)) { 121 122 stackaddr = ALIGN_UP(config.init_addr+config.init_size, 123 CONFIG_STACK_SIZE); 124 config.init_size = ALIGN_UP(config.init_size,CONFIG_STACK_SIZE) + CONFIG_STACK_SIZE; 125 } else { 116 count_t i; 117 bool overlap = false; 118 for (i = 0; i < init.cnt; i++) 119 if (overlaps(stackaddr, CONFIG_STACK_SIZE, init.tasks[i].addr, init.tasks[i].size)) { 120 stackaddr = ALIGN_UP(init.tasks[i].addr + init.tasks[i].size, CONFIG_STACK_SIZE); 121 init.tasks[i].size = ALIGN_UP(init.tasks[i].size, CONFIG_STACK_SIZE) + CONFIG_STACK_SIZE; 122 overlap = true; 123 } 124 125 if (!overlap) 126 126 config.kernel_size += CONFIG_STACK_SIZE; 127 }128 127 129 128 context_save(&ctx); … … 152 151 */ 153 152 kconsole_init(); 154 153 155 154 /* 156 155 * Exception handler initialization, before architecture … … 190 189 thread_init(); 191 190 192 if (config.init_size > 0) 193 printf("config.init_addr=%P, config.init_size=%d\n", config.init_addr, config.init_size); 191 count_t i; 192 for (i = 0; i < init.cnt; i++) 193 printf("init[%d].addr=%P, init[%d].size=%d\n", i, init.tasks[i].addr, i, init.tasks[i].size); 194 194 195 195 ipc_init(); -
generic/src/mm/frame.c
r8dfef11 rb6b576c 135 135 spinlock_lock(&zones.lock); 136 136 /* Try to merge */ 137 if (zones.count +1 == ZONES_MAX)137 if (zones.count + 1 == ZONES_MAX) 138 138 panic("Maximum zone(%d) count exceeded.", ZONES_MAX); 139 for (i =0; i < zones.count; i++) {139 for (i = 0; i < zones.count; i++) { 140 140 /* Check for overflow */ 141 141 z = zones.info[i]; … … 149 149 } 150 150 /* Move other zones up */ 151 for (j =i;j < zones.count;j++)152 zones.info[j +1] = zones.info[j];151 for (j = i;j < zones.count; j++) 152 zones.info[j + 1] = zones.info[j]; 153 153 zones.info[i] = newzone; 154 154 zones.count++; … … 690 690 /* Replace existing zones in zoneinfo list */ 691 691 zones.info[z1] = newzone; 692 for (i =z2+1;i < zones.count;i++)693 zones.info[i -1] = zones.info[i];692 for (i = z2 + 1; i < zones.count; i++) 693 zones.info[i - 1] = zones.info[i]; 694 694 zones.count--; 695 695 … … 809 809 confcount = SIZE2FRAMES(zone_conf_size(count)); 810 810 if (confframe >= start && confframe < start+count) { 811 for (;confframe < start +count;confframe++) {811 for (;confframe < start + count; confframe++) { 812 812 addr = PFN2ADDR(confframe); 813 if (overlaps(addr, PFN2ADDR(confcount), 814 KA2PA(config.base),config.kernel_size)) 813 if (overlaps(addr, PFN2ADDR(confcount), KA2PA(config.base), config.kernel_size)) 815 814 continue; 816 if (config.init_addr) 817 if (overlaps(addr,PFN2ADDR(confcount), 818 KA2PA(config.init_addr), 819 config.init_size)) 820 continue; 815 816 bool overlap = false; 817 count_t i; 818 for (i = 0; i < init.cnt; i++) 819 if (overlaps(addr, PFN2ADDR(confcount), KA2PA(init.tasks[i].addr), init.tasks[i].size)) { 820 overlap = true; 821 break; 822 } 823 if (overlap) 824 continue; 825 821 826 break; 822 827 } 823 if (confframe >= start +count)828 if (confframe >= start + count) 824 829 panic("Cannot find configuration data for zone."); 825 830 } … … 990 995 pfn_t lastframe = ADDR2PFN(KA2PA(config.base+config.kernel_size)); 991 996 frame_mark_unavailable(firstframe,lastframe-firstframe+1); 992 if (config.init_size > 0) 993 frame_mark_unavailable(ADDR2PFN(KA2PA(config.init_addr)), 994 SIZE2FRAMES(config.init_size)); 997 998 count_t i; 999 for (i = 0; i < init.cnt; i++) 1000 frame_mark_unavailable(ADDR2PFN(KA2PA(init.tasks[i].addr)), SIZE2FRAMES(init.tasks[i].size)); 995 1001 } 996 1002 } … … 1010 1016 printf("# Base address\tFree Frames\tBusy Frames\n"); 1011 1017 printf(" ------------\t-----------\t-----------\n"); 1012 for (i =0;i<zones.count;i++) {1018 for (i = 0; i < zones.count; i++) { 1013 1019 zone = zones.info[i]; 1014 1020 spinlock_lock(&zone->lock); … … 1033 1039 spinlock_lock(&zones.lock); 1034 1040 1035 for (i =0;i < zones.count; i++) {1041 for (i = 0; i < zones.count; i++) { 1036 1042 if (i == num || PFN2ADDR(zones.info[i]->base) == num) { 1037 1043 zone = zones.info[i];
Note:
See TracChangeset
for help on using the changeset viewer.