1/* 2 * 64-bit switch cpu code 3 * 4 * Copyright IBM Corp. 2009 5 * 6 */ 7 8#include <linux/linkage.h> 9#include <asm/asm-offsets.h> 10#include <asm/ptrace.h> 11 12# smp_switch_to_cpu switches to destination cpu and executes the passed function 13# Parameter: %r2 - function to call 14# %r3 - function parameter 15# %r4 - stack poiner 16# %r5 - current cpu 17# %r6 - destination cpu 18 19 .section .text 20ENTRY(smp_switch_to_cpu) 21 stmg %r6,%r15,__SF_GPRS(%r15) 22 lgr %r1,%r15 23 aghi %r15,-STACK_FRAME_OVERHEAD 24 stg %r1,__SF_BACKCHAIN(%r15) 25 larl %r1,.gprregs 26 stmg %r0,%r15,0(%r1) 271: sigp %r0,%r6,__SIGP_RESTART /* start destination CPU */ 28 brc 2,1b /* busy, try again */ 292: sigp %r0,%r5,__SIGP_STOP /* stop current CPU */ 30 brc 2,2b /* busy, try again */ 313: j 3b 32 33ENTRY(smp_restart_cpu) 34 larl %r1,.gprregs 35 lmg %r0,%r15,0(%r1) 361: sigp %r0,%r5,__SIGP_SENSE /* Wait for calling CPU */ 37 brc 10,1b /* busy, accepted (status 0), running */ 38 tmll %r0,0x40 /* Test if calling CPU is stopped */ 39 jz 1b 40 ltgr %r4,%r4 /* New stack ? */ 41 jz 1f 42 lgr %r15,%r4 431: lgr %r14,%r2 /* r14: Function to call */ 44 lgr %r2,%r3 /* r2 : Parameter for function*/ 45 basr %r14,%r14 /* Call function */ 46 47 .section .data,"aw",@progbits 48.gprregs: 49 .rept 16 50 .quad 0 51 .endr 52