Changeset e5c1186 in mainline
- Timestamp:
- 2010-06-14T22:58:20Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- fae1647
- Parents:
- 84d8837
- Location:
- kernel/arch/ia64/src
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/ia64/src/smp/smp.c
r84d8837 re5c1186 33 33 */ 34 34 35 #include <arch.h>36 #include <arch/drivers/ski.h>37 #include <arch/drivers/it.h>38 #include <arch/interrupt.h>39 #include <arch/barrier.h>40 #include <arch/asm.h>41 #include <arch/register.h>42 #include <typedefs.h>43 #include <arch/context.h>44 #include <arch/stack.h>45 #include <arch/mm/page.h>46 #include <mm/as.h>47 #include <config.h>48 #include <userspace.h>49 #include <console/console.h>50 #include <proc/uarg.h>51 #include <syscall/syscall.h>52 #include <ddi/irq.h>53 #include <ddi/device.h>54 #include <arch/bootinfo.h>55 35 #include <smp/smp.h> 56 36 #include <smp/ipi.h> 57 #include <arch/atomic.h>58 #include <panic.h>59 #include <print.h>60 37 61 38 #ifdef CONFIG_SMP 62 39 63 extern char cpu_by_id_eid_list[256][256]; 64 65 static void sapic_init(void) 40 void ipi_broadcast_arch(int ipi) 66 41 { 67 bootinfo->sapic = (unative_t *)(PA2KA((unative_t)(bootinfo->sapic)) |68 FW_OFFSET);69 }70 71 static void ipi_broadcast_arch_all(int ipi)72 {73 int id, eid;74 int myid, myeid;75 76 myid = ia64_get_cpu_id();77 myeid = ia64_get_cpu_eid();78 79 for (id = 0; id < 256; id++)80 for (eid = 0; eid < 256; eid++)81 if ((id != myid) || (eid != myeid))82 ipi_send_ipi(id, eid, ipi);83 }84 85 void ipi_broadcast_arch(int ipi )86 {87 int id, eid;88 int myid, myeid;89 90 myid = ia64_get_cpu_id();91 myeid = ia64_get_cpu_eid();92 93 for (id = 0; id < 256; id++)94 for (eid = 0; eid < 256; eid++)95 if ((id != myid) || (eid != myeid))96 if (cpu_by_id_eid_list[id][eid])97 ipi_send_ipi(id, eid, ipi);98 42 } 99 43 100 44 void smp_init(void) 101 45 { 102 if (!bootinfo->hello_configured)103 return;104 105 /*106 * If we have not got system prepared by hello, we are not able to start107 * AP's. This means we are running on a simulator.108 */109 110 sapic_init();111 ipi_broadcast_arch_all(bootinfo->wakeup_intno);112 volatile long long brk;113 for (brk = 0; brk < 100LL * 1024LL * 1024LL; brk++)114 ; /* wait a while before CPUs starts */115 116 config.cpu_count = 0;117 int id, eid;118 119 for (id = 0; id < 256; id++)120 for (eid = 0; eid < 256; eid++)121 if (cpu_by_id_eid_list[id][eid] == 1) {122 config.cpu_count++;123 cpu_by_id_eid_list[id][eid] = 2;124 }125 46 } 126 47 127 48 void kmp(void *arg __attribute__((unused))) 128 49 { 129 int id, eid;130 int myid, myeid;131 132 myid = ia64_get_cpu_id();133 myeid = ia64_get_cpu_eid();134 135 for (id = 0; id < 256; id++)136 for (eid = 0; eid < 256; eid++)137 if ((id != myid) || (eid != myeid))138 if (cpu_by_id_eid_list[id][eid] != 0) {139 if (cpu_by_id_eid_list[id][eid] == 1) {140 printf("Found Late CPU ID:%d "141 "EDI:%d Not added to "142 "system!!!\n", id, eid);143 continue;144 }145 cpu_by_id_eid_list[id][eid] = 3;146 /*147 * There may be just one AP being148 * initialized at the time. After149 * it comes completely up, it is150 * supposed to wake us up.151 */152 if (waitq_sleep_timeout(153 &ap_completion_wq, 1000000,154 SYNCH_FLAGS_NONE) ==155 ESYNCH_TIMEOUT) {156 printf("%s: waiting for cpu "157 "ID:%d EID:%d timed out\n",158 __FUNCTION__, id, eid);159 }160 }161 50 } 162 51 -
kernel/arch/ia64/src/start.S
r84d8837 re5c1186 49 49 kernel_image_start: 50 50 .auto 51 52 #ifdef CONFIG_SMP53 # Identify self(CPU) in OS structures by ID / EID54 55 mov r9 = cr6456 mov r10 = 157 movl r12 = 0xffffffff58 movl r8 = cpu_by_id_eid_list59 and r8 = r8, r1260 shr r9 = r9, 1661 add r8 = r8, r962 st1 [r8] = r1063 #endif64 51 65 52 mov psr.l = r0 … … 164 151 bsw.1 165 152 166 #ifdef CONFIG_SMP167 # Am I BSP or AP?168 movl r20 = bsp_started ;;169 ld8 r20 = [r20] ;;170 cmp.eq p3, p2 = r20, r0 ;;171 #else172 cmp.eq p3, p2 = r0, r0 ;; /* you are BSP */173 #endif /* CONFIG_SMP */174 175 153 # Initialize register stack 176 154 mov ar.rsc = r0 … … 191 169 * Initialize bootinfo on BSP. 192 170 */ 193 (p3)addl r21 = @gprel(bootinfo), gp ;;194 (p3)st8 [r21] = r20171 addl r21 = @gprel(bootinfo), gp ;; 172 st8 [r21] = r20 195 173 196 174 ssm (1 << 19) ;; /* Disable f32 - f127 */ 197 175 srlz.i 198 176 srlz.d ;; 199 200 #ifdef CONFIG_SMP201 (p2) movl r18 = main_ap ;;202 (p2) mov b1 = r18 ;;203 (p2) br.call.sptk.many b0 = b1204 205 # Mark that BSP is on206 207 mov r20 = 1 ;;208 movl r21 = bsp_started ;;209 st8 [r21] = r20 ;;210 #endif211 177 212 178 br.call.sptk.many b0 = arch_pre_main … … 218 184 0: 219 185 br 0b 220 221 #ifdef CONFIG_SMP222 223 .align 4096224 kernel_image_ap_start:225 .auto226 227 # Identify self(CPU) in OS structures by ID / EID228 229 mov r9 = cr64230 mov r10 = 1231 movl r12 = 0xffffffff232 movl r8 = cpu_by_id_eid_list233 and r8 = r8, r12234 shr r9 = r9, 16235 add r8 = r8, r9236 st1 [r8] = r10237 238 # Wait for wakeup synchro signal (#3 in cpu_by_id_eid_list)239 240 kernel_image_ap_start_loop:241 movl r11 = kernel_image_ap_start_loop242 and r11 = r11, r12243 mov b1 = r11244 245 ld1 r20 = [r8]246 movl r21 = 3247 cmp.eq p2, p3 = r20, r21248 (p3) br.call.sptk.many b0 = b1249 250 movl r11 = kernel_image_start251 and r11 = r11, r12252 mov b1 = r11253 br.call.sptk.many b0 = b1254 255 .align 16256 .global bsp_started257 bsp_started:258 .space 8259 260 .align 4096261 .global cpu_by_id_eid_list262 cpu_by_id_eid_list:263 .space 65536264 265 #endif /* CONFIG_SMP */
Note:
See TracChangeset
for help on using the changeset viewer.