• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6/arch/s390/kernel/
1/*
2 * 31-bit switch cpu code
3 *
4 * Copyright IBM Corp. 2009
5 *
6 */
7
8#include <asm/asm-offsets.h>
9#include <asm/ptrace.h>
10
11# smp_switch_to_cpu switches to destination cpu and executes the passed function
12# Parameter: %r2 - function to call
13#	     %r3 - function parameter
14#	     %r4 - stack poiner
15#	     %r5 - current cpu
16#	     %r6 - destination cpu
17
18	.section .text
19	.align 4
20	.globl smp_switch_to_cpu
21smp_switch_to_cpu:
22	stm	%r6,%r15,__SF_GPRS(%r15)
23	lr	%r1,%r15
24	ahi	%r15,-STACK_FRAME_OVERHEAD
25	st	%r1,__SF_BACKCHAIN(%r15)
26	basr	%r13,0
270:	la	%r1,.gprregs_addr-0b(%r13)
28	l	%r1,0(%r1)
29	stm	%r0,%r15,0(%r1)
301:	sigp	%r0,%r6,__SIGP_RESTART	/* start destination CPU */
31	brc	2,1b			/* busy, try again */
322:	sigp	%r0,%r5,__SIGP_STOP	/* stop current CPU */
33	brc	2,2b			/* busy, try again */
343:	j	3b
35
36	.globl	smp_restart_cpu
37smp_restart_cpu:
38	basr	%r13,0
390:	la	%r1,.gprregs_addr-0b(%r13)
40	l	%r1,0(%r1)
41	lm	%r0,%r15,0(%r1)
421:	sigp	%r0,%r5,__SIGP_SENSE	/* Wait for calling CPU */
43	brc	10,1b			/* busy, accepted (status 0), running */
44	tmll	%r0,0x40		/* Test if calling CPU is stopped */
45	jz	1b
46	ltr	%r4,%r4			/* New stack ? */
47	jz	1f
48	lr	%r15,%r4
491:	basr	%r14,%r2
50
51.gprregs_addr:
52	.long	.gprregs
53
54	.section .data,"aw",@progbits
55.gprregs:
56	.rept	16
57	.long	0
58	.endr
59