- Timestamp:
- 2008-11-11T08:00:42Z (17 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f3c4a26
- Parents:
- a2a5529
- Location:
- kernel
- Files:
-
- 1 added
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/ia64/Makefile.inc
ra2a5529 r59e4864 83 83 arch/$(ARCH)/src/proc/scheduler.c \ 84 84 arch/$(ARCH)/src/ddi/ddi.c \ 85 arch/$(ARCH)/src/smp/smp.c \ 85 86 arch/$(ARCH)/src/drivers/it.c 86 87 … … 99 100 endif 100 101 102 ifeq ($(CONFIG_SMP),y) 103 DEFS += -DCONFIG_SMP 104 endif 105 -
kernel/arch/ia64/include/atomic.h
ra2a5529 r59e4864 52 52 } 53 53 54 55 static inline uint64_t test_and_set(atomic_t *val) { 56 uint64_t v; 57 58 asm volatile ( 59 "movl %0=0x01;;\n" 60 "xchg8 %0=%1,%0;;\n" 61 : "=r" (v),"+m" (val->count) 62 ); 63 64 return v; 65 } 66 67 54 68 static inline void atomic_inc(atomic_t *val) { atomic_add(val, 1); } 55 69 static inline void atomic_dec(atomic_t *val) { atomic_add(val, -1); } -
kernel/arch/ia64/include/bootinfo.h
ra2a5529 r59e4864 30 30 #define KERN_ia64_BOOTINFO_H_ 31 31 32 32 #define BOOTINFO_ADDRESS 0x4401000 33 33 34 34 #define CONFIG_INIT_TASKS 32 … … 47 47 typedef struct { 48 48 binit_t taskmap; 49 50 unsigned long * sapic; 51 unsigned int wakeup_intno; 52 49 53 } bootinfo_t; 50 54 -
kernel/arch/ia64/include/cpu.h
ra2a5529 r59e4864 39 39 #include <arch/register.h> 40 40 #include <arch/asm.h> 41 #include <arch/bootinfo.h> 41 42 42 43 #define FAMILY_ITANIUM 0x7 … … 64 65 } 65 66 67 68 #define CR64_ID_SHIFT 24 69 #define CR64_ID_MASK 0xff000000 70 #define CR64_EID_SHIFT 16 71 #define CR64_EID_MASK 0xff0000 72 73 static inline int ia64_get_cpu_id(void) 74 { 75 uint64_t cr64=cr64_read(); 76 return ((CR64_ID_MASK)&cr64)>>CR64_ID_SHIFT; 77 } 78 79 static inline int ia64_get_cpu_eid(void) 80 { 81 uint64_t cr64=cr64_read(); 82 return ((CR64_EID_MASK)&cr64)>>CR64_EID_SHIFT; 83 } 84 85 86 87 static inline void ipi_send_ipi(int id,int eid,int intno) 88 { 89 (bootinfo->sapic)[2*(id*256+eid)]=intno; 90 } 91 92 93 66 94 #endif 67 95 -
kernel/arch/ia64/include/mm/page.h
ra2a5529 r59e4864 47 47 #define KERNEL_PAGE_WIDTH 28 /* 256M */ 48 48 #define IO_PAGE_WIDTH 26 /* 64M */ 49 #define FW_PAGE_WIDTH 28 /* 256M */ 50 51 /** Staticly mapped IO spaces */ 52 53 /* Firmware area (bellow 4GB in phys mem) */ 54 #define FW_OFFSET 0x00000000F0000000 55 /* Legacy IO space */ 56 #define IO_OFFSET 0x0001000000000000 57 /* Videoram - now mapped to 0 as VGA text mode vram on 0xb8000*/ 58 #define VIO_OFFSET 0x0002000000000000 59 60 49 61 50 62 -
kernel/arch/ia64/src/drivers/it.c
ra2a5529 r59e4864 56 56 { 57 57 cr_itv_t itv; 58 59 irq_initialize(&it_irq); 60 it_irq.inr = INTERRUPT_TIMER; 61 it_irq.devno = device_assign_devno(); 62 it_irq.claim = it_claim; 63 it_irq.handler = it_interrupt; 64 irq_register(&it_irq); 65 58 59 if(config.cpu_active==1) 60 { 61 irq_initialize(&it_irq); 62 it_irq.inr = INTERRUPT_TIMER; 63 it_irq.devno = device_assign_devno(); 64 it_irq.claim = it_claim; 65 it_irq.handler = it_interrupt; 66 irq_register(&it_irq); 67 } 68 66 69 /* initialize Interval Timer external interrupt vector */ 67 70 itv.value = itv_read(); -
kernel/arch/ia64/src/ia64.c
ra2a5529 r59e4864 55 55 #include <arch/bootinfo.h> 56 56 #include <genarch/kbd/i8042.h> 57 #include <genarch/kbd/ns16550.h> 58 #include <smp/smp.h> 59 #include <smp/ipi.h> 60 #include <arch/atomic.h> 61 #include <panic.h> 62 #include <print.h> 63 64 /*NS16550 as a COM 1*/ 65 #define NS16550_IRQ 4 66 #define NS16550_PORT 0x3f8 57 67 58 68 bootinfo_t *bootinfo; … … 103 113 void arch_post_mm_init(void) 104 114 { 105 irq_init(INR_COUNT, INR_COUNT); 106 #ifdef SKI 107 ski_init_console(); 115 if(config.cpu_active==1) 116 { 117 irq_init(INR_COUNT, INR_COUNT); 118 #ifdef SKI 119 ski_init_console(); 108 120 #else 109 ega_init();121 ega_init(); 110 122 #endif 123 } 111 124 it_init(); 112 125 } … … 128 141 while (1) { 129 142 i8042_poll(); 143 #ifdef CONFIG_NS16550 144 ns16550_poll(); 145 #endif 130 146 thread_usleep(POLL_INTERVAL); 131 147 } … … 136 152 { 137 153 138 if (config.cpu_active == 1){154 { 139 155 /* 140 156 * Create thread that polls keyboard. … … 154 170 i8042_init(kbd, IRQ_KBD, mouse, IRQ_MOUSE); 155 171 172 #ifdef CONFIG_NS16550 173 ns16550_init(kbd, NS16550_IRQ, NS16550_PORT); // as a COM 1 174 #else 175 #endif 156 176 thread_t *t; 157 177 t = thread_create(i8042_kkbdpoll, NULL, TASK, 0, "kkbdpoll", true); … … 164 184 } 165 185 } 186 166 187 167 188 /** Enter userspace and never return. */ … … 225 246 void arch_reboot(void) 226 247 { 227 // TODO248 outb(0x64,0xfe); 228 249 while (1); 229 250 } -
kernel/arch/ia64/src/mm/frame.c
ra2a5529 r59e4864 43 43 */ 44 44 #define MEMORY_SIZE (64 * 1024 * 1024) 45 #define MEMORY_BASE (64 * 1024 * 1024) 45 #define MEMORY_BASE (0 * 64 * 1024 * 1024) 46 47 #define ONE_TO_ONE_MAPPING_SIZE (256*1048576) // Mapped at start 46 48 47 49 #define ROM_BASE 0xa0000 //For ski 48 50 #define ROM_SIZE (384 * 1024) //For ski 49 51 void poke_char(int x,int y,char ch, char c); 52 53 uintptr_t last_frame; 54 50 55 void frame_arch_init(void) 51 56 { 52 zone_create(MEMORY_BASE >> FRAME_WIDTH, SIZE2FRAMES(MEMORY_SIZE), (MEMORY_SIZE) >> FRAME_WIDTH, 0); 57 58 if(config.cpu_active==1) 59 { 60 zone_create(MEMORY_BASE >> FRAME_WIDTH, SIZE2FRAMES(MEMORY_SIZE), (MEMORY_SIZE) >> FRAME_WIDTH, 0); 53 61 54 /* 55 * Blacklist ROM regions. 56 */ 57 frame_mark_unavailable(ADDR2PFN(ROM_BASE), SIZE2FRAMES(ROM_SIZE)); 58 62 /* 63 * Blacklist ROM regions. 64 */ 65 //frame_mark_unavailable(ADDR2PFN(ROM_BASE), SIZE2FRAMES(ROM_SIZE)); 66 67 frame_mark_unavailable(ADDR2PFN(0), SIZE2FRAMES(1048576)); 68 last_frame=SIZE2FRAMES((VRN_KERNEL<<VRN_SHIFT)+ONE_TO_ONE_MAPPING_SIZE); 69 } 59 70 } 60 71 -
kernel/arch/ia64/src/mm/page.c
ra2a5529 r59e4864 48 48 #include <arch/barrier.h> 49 49 #include <memstr.h> 50 #include <align.h> 50 51 51 52 static void set_environment(void); … … 263 264 } 264 265 266 extern uintptr_t last_frame; 267 268 269 uintptr_t hw_map(uintptr_t physaddr, size_t size) 270 { 271 if (last_frame + ALIGN_UP(size, PAGE_SIZE) > KA2PA(KERNEL_ADDRESS_SPACE_END_ARCH)) 272 panic("Unable to map physical memory %p (%d bytes)", physaddr, size) 273 274 uintptr_t virtaddr = PA2KA(last_frame); 275 pfn_t i; 276 for (i = 0; i < ADDR2PFN(ALIGN_UP(size, PAGE_SIZE)); i++) { 277 uintptr_t addr = PFN2ADDR(i); 278 page_mapping_insert(AS_KERNEL, virtaddr + addr, physaddr + addr, PAGE_NOT_CACHEABLE | PAGE_WRITE); 279 } 280 281 last_frame = ALIGN_UP(last_frame + size, FRAME_SIZE); 282 283 return virtaddr; 284 } 285 286 287 265 288 /** @} 266 289 */ -
kernel/arch/ia64/src/start.S
ra2a5529 r59e4864 40 40 #define KERNEL_TRANSLATION_VIO 0x0010000000000671 41 41 #define KERNEL_TRANSLATION_IO 0x00100FFFFC000671 42 #define VIO_OFFSET 0x0002000000000000 43 44 #define IO_OFFSET 0x0001000000000000 42 #define KERNEL_TRANSLATION_FW 0x00100000F0000671 45 43 46 44 … … 53 51 kernel_image_start: 54 52 .auto 53 54 #identifi self(CPU) in OS structures by ID / EID 55 mov r9=cr64 56 mov r10=1 57 movl r12=0xffffffff 58 movl r8=cpu_by_id_eid_list 59 and r8=r8,r12 60 shr r9=r9,16 61 add r8=r8,r9 62 st1 [r8]=r10 63 64 55 65 56 66 mov psr.l = r0 … … 113 123 movl r10 = (KERNEL_TRANSLATION_IO) 114 124 itr.d dtr[r7] = r10 125 126 127 #setup mapping for fimware arrea (also SAPIC) 128 mov r11 = cr.itir ;; 129 movl r10 = ~0xfc;; 130 and r10 =r10 , r11 ;; 131 movl r11 = (FW_PAGE_WIDTH << PS_SHIFT);; 132 or r10 =r10 , r11 ;; 133 mov cr.itir = r10;; 134 135 136 movl r7 = 3 137 movl r8 = (VRN_KERNEL << VRN_SHIFT) | FW_OFFSET 138 mov cr.ifa = r8 139 movl r10 = (KERNEL_TRANSLATION_FW) 140 itr.d dtr[r7] = r10 141 115 142 116 143 … … 143 170 # switch to register bank 1 144 171 bsw.1 172 173 #Am'I BSP or AP 174 movl r20=bsp_started;; 175 ld8 r20=[r20];; 176 cmp.eq p3,p2=r20,r0;; 177 145 178 146 179 # initialize register stack … … 161 194 162 195 /* 163 * Initialize hardcoded_* variables. 196 * Initialize hardcoded_* variables. Do only BSP 164 197 */ 165 movl r14 = _hardcoded_ktext_size166 movl r15 = _hardcoded_kdata_size167 movl r16 = _hardcoded_load_address ;;168 addl r17 = @gprel(hardcoded_ktext_size), gp169 addl r18 = @gprel(hardcoded_kdata_size), gp170 addl r19 = @gprel(hardcoded_load_address), gp171 addl r21 = @gprel(bootinfo), gp198 (p3) movl r14 = _hardcoded_ktext_size 199 (p3) movl r15 = _hardcoded_kdata_size 200 (p3) movl r16 = _hardcoded_load_address ;; 201 (p3) addl r17 = @gprel(hardcoded_ktext_size), gp 202 (p3) addl r18 = @gprel(hardcoded_kdata_size), gp 203 (p3) addl r19 = @gprel(hardcoded_load_address), gp 204 (p3) addl r21 = @gprel(bootinfo), gp 172 205 ;; 173 st8 [r17] = r14174 st8 [r18] = r15175 st8 [r19] = r16176 st8 [r21] = r20206 (p3) st8 [r17] = r14 207 (p3) st8 [r18] = r15 208 (p3) st8 [r19] = r16 209 (p3) st8 [r21] = r20 177 210 178 211 ssm (1 << 19) ;; /* Disable f32 - f127 */ … … 180 213 srlz.d ;; 181 214 215 (p2) movl r18 = main_ap ;; 216 (p2) mov b1 = r18 ;; 217 (p2) br.call.sptk.many b0 = b1 218 219 #Mark that BSP is on 220 mov r20=1;; 221 movl r21=bsp_started;; 222 st8 [r21]=r20;; 223 224 182 225 br.call.sptk.many b0 = arch_pre_main 183 226 … … 189 232 0: 190 233 br 0b 234 .align 4096 235 236 kernel_image_ap_start: 237 .auto 238 #identifi self(CPU) in OS structures by ID / EID 239 mov r9=cr64 240 mov r10=1 241 movl r12=0xffffffff 242 movl r8=cpu_by_id_eid_list 243 and r8=r8,r12 244 shr r9=r9,16 245 add r8=r8,r9 246 st1 [r8]=r10 247 248 #wait for wakeup sychro signal (#3 in cpu_by_id_eid_list) 249 kernel_image_ap_start_loop: 250 movl r11=kernel_image_ap_start_loop 251 and r11=r11,r12 252 mov b1 = r11 253 254 ld1 r20=[r8];; 255 movl r21=3;; 256 cmp.eq p2,p3=r20,r21;; 257 (p3)br.call.sptk.many b0 = b1 258 259 movl r11=kernel_image_start 260 and r11=r11,r12 261 mov b1 = r11 262 br.call.sptk.many b0 = b1 263 264 265 .align 16 266 .global bsp_started 267 bsp_started: 268 .space 8 269 270 271 .align 4096 272 .global cpu_by_id_eid_list 273 cpu_by_id_eid_list: 274 .space 65536 275 276 -
kernel/generic/include/synch/spinlock.h
ra2a5529 r59e4864 37 37 38 38 #include <arch/types.h> 39 #include <arch/barrier.h> 39 40 #include <preemption.h> 40 41 #include <atomic.h> -
kernel/generic/src/mm/tlb.c
ra2a5529 r59e4864 135 135 void tlb_shootdown_ipi_send(void) 136 136 { 137 #ifndef ia64 137 138 ipi_broadcast(VECTOR_TLB_SHOOTDOWN_IPI); 139 #endif 138 140 } 139 141 -
kernel/generic/src/proc/thread.c
ra2a5529 r59e4864 296 296 if (!t) 297 297 return NULL; 298 299 298 /* Not needed, but good for debugging */ 300 299 memsetb(t->kstack, THREAD_STACK_SIZE * 1 << STACK_FRAMES, 0);
Note:
See TracChangeset
for help on using the changeset viewer.