fixup.S 2.5 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
/*
 * Linux/PA-RISC Project (http://www.parisc-linux.org/)
 *
 *  Copyright (C) 2004  Randolph Chung <tausq@debian.org>
 *
 *    This program is free software; you can redistribute it and/or modify
 *    it under the terms of the GNU General Public License as published by
 *    the Free Software Foundation; either version 2, or (at your option)
 *    any later version.
 *
 *    This program is distributed in the hope that it will be useful,
 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *    GNU General Public License for more details.
 *
 *    You should have received a copy of the GNU General Public License
 *    along with this program; if not, write to the Free Software
 *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 * 
 * Fixup routines for kernel exception handling.
 */
22
#include <asm/asm-offsets.h>
L
Linus Torvalds 已提交
23 24
#include <asm/assembly.h>
#include <asm/errno.h>
25
#include <linux/linkage.h>
L
Linus Torvalds 已提交
26 27 28

#ifdef CONFIG_SMP
	.macro  get_fault_ip t1 t2
29
	loadgp
L
Linus Torvalds 已提交
30 31 32 33 34
	addil LT%__per_cpu_offset,%r27
	LDREG RT%__per_cpu_offset(%r1),\t1
	/* t2 = smp_processor_id() */
	mfctl 30,\t2
	ldw TI_CPU(\t2),\t2
35
#ifdef CONFIG_64BIT
L
Linus Torvalds 已提交
36 37 38
	extrd,u \t2,63,32,\t2
#endif
	/* t2 = &__per_cpu_offset[smp_processor_id()]; */
39
	LDREGX \t2(\t1),\t2 
R
Rusty Russell 已提交
40 41
	addil LT%exception_data,%r27
	LDREG RT%exception_data(%r1),\t1
42
	/* t1 = this_cpu_ptr(&exception_data) */
L
Linus Torvalds 已提交
43
	add,l \t1,\t2,\t1
44 45
	/* %r27 = t1->fault_gp - restore gp */
	LDREG EXCDATA_GP(\t1), %r27
L
Linus Torvalds 已提交
46 47 48 49 50
	/* t1 = t1->fault_ip */
	LDREG EXCDATA_IP(\t1), \t1
	.endm
#else
	.macro  get_fault_ip t1 t2
51
	loadgp
52
	/* t1 = this_cpu_ptr(&exception_data) */
R
Rusty Russell 已提交
53 54
	addil LT%exception_data,%r27
	LDREG RT%exception_data(%r1),\t2
55 56
	/* %r27 = t2->fault_gp - restore gp */
	LDREG EXCDATA_GP(\t2), %r27
L
Linus Torvalds 已提交
57 58 59 60 61
	/* t1 = t2->fault_ip */
	LDREG EXCDATA_IP(\t2), \t1
	.endm
#endif

62 63
	.level LEVEL

64
	.text
L
Linus Torvalds 已提交
65 66 67
	.section .fixup, "ax"

	/* get_user() fixups, store -EFAULT in r8, and 0 in r9 */
68
ENTRY_CFI(fixup_get_user_skip_1)
L
Linus Torvalds 已提交
69 70 71 72 73
	get_fault_ip %r1,%r8
	ldo 4(%r1), %r1
	ldi -EFAULT, %r8
	bv %r0(%r1)
	copy %r0, %r9
74
ENDPROC_CFI(fixup_get_user_skip_1)
L
Linus Torvalds 已提交
75

76
ENTRY_CFI(fixup_get_user_skip_2)
L
Linus Torvalds 已提交
77 78 79 80 81
	get_fault_ip %r1,%r8
	ldo 8(%r1), %r1
	ldi -EFAULT, %r8
	bv %r0(%r1)
	copy %r0, %r9
82
ENDPROC_CFI(fixup_get_user_skip_2)
L
Linus Torvalds 已提交
83 84

	/* put_user() fixups, store -EFAULT in r8 */
85
ENTRY_CFI(fixup_put_user_skip_1)
L
Linus Torvalds 已提交
86 87 88 89
	get_fault_ip %r1,%r8
	ldo 4(%r1), %r1
	bv %r0(%r1)
	ldi -EFAULT, %r8
90
ENDPROC_CFI(fixup_put_user_skip_1)
L
Linus Torvalds 已提交
91

92
ENTRY_CFI(fixup_put_user_skip_2)
L
Linus Torvalds 已提交
93 94 95 96
	get_fault_ip %r1,%r8
	ldo 8(%r1), %r1
	bv %r0(%r1)
	ldi -EFAULT, %r8
97
ENDPROC_CFI(fixup_put_user_skip_2)
98