aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
Diffstat (limited to 'arch')
-rw-r--r--arch/parisc/kernel/head.S15
-rw-r--r--arch/parisc/kernel/hpmc.S16
-rw-r--r--arch/parisc/kernel/pacache.S80
-rw-r--r--arch/parisc/kernel/perf_asm.S26
-rw-r--r--arch/parisc/kernel/real2.S16
-rw-r--r--arch/parisc/kernel/syscall.S71
6 files changed, 99 insertions, 125 deletions
diff --git a/arch/parisc/kernel/head.S b/arch/parisc/kernel/head.S
index eaad2328fea1..9676c486bb63 100644
--- a/arch/parisc/kernel/head.S
+++ b/arch/parisc/kernel/head.S
@@ -2,7 +2,7 @@
2 * License. See the file "COPYING" in the main directory of this archive 2 * License. See the file "COPYING" in the main directory of this archive
3 * for more details. 3 * for more details.
4 * 4 *
5 * Copyright (C) 1999 by Helge Deller 5 * Copyright (C) 1999-2007 by Helge Deller <deller@gmx.de>
6 * Copyright 1999 SuSE GmbH (Philipp Rumpf) 6 * Copyright 1999 SuSE GmbH (Philipp Rumpf)
7 * Copyright 1999 Philipp Rumpf (prumpf@tux.org) 7 * Copyright 1999 Philipp Rumpf (prumpf@tux.org)
8 * Copyright 2000 Hewlett Packard (Paul Bame, bame@puffin.external.hp.com) 8 * Copyright 2000 Hewlett Packard (Paul Bame, bame@puffin.external.hp.com)
@@ -19,16 +19,17 @@
19#include <asm/assembly.h> 19#include <asm/assembly.h>
20#include <asm/pgtable.h> 20#include <asm/pgtable.h>
21 21
22#include <linux/linkage.h>
23
22 .level LEVEL 24 .level LEVEL
23 25
24 .data 26 .data
25 27ENTRY(boot_args)
26 .export boot_args
27boot_args:
28 .word 0 /* arg0 */ 28 .word 0 /* arg0 */
29 .word 0 /* arg1 */ 29 .word 0 /* arg1 */
30 .word 0 /* arg2 */ 30 .word 0 /* arg2 */
31 .word 0 /* arg3 */ 31 .word 0 /* arg3 */
32END(boot_args)
32 33
33 .text 34 .text
34 .align 4 35 .align 4
@@ -38,10 +39,9 @@ boot_args:
38 .import fault_vector_11,code /* IVA parisc 1.1 32 bit */ 39 .import fault_vector_11,code /* IVA parisc 1.1 32 bit */
39 .import $global$ /* forward declaration */ 40 .import $global$ /* forward declaration */
40#endif /*!CONFIG_64BIT*/ 41#endif /*!CONFIG_64BIT*/
41 .export stext
42 .export _stext,data /* Kernel want it this way! */ 42 .export _stext,data /* Kernel want it this way! */
43_stext: 43_stext:
44stext: 44ENTRY(stext)
45 .proc 45 .proc
46 .callinfo 46 .callinfo
47 47
@@ -343,6 +343,9 @@ smp_slave_stext:
343 343
344 .procend 344 .procend
345#endif /* CONFIG_SMP */ 345#endif /* CONFIG_SMP */
346
347ENDPROC(stext)
348
346#ifndef CONFIG_64BIT 349#ifndef CONFIG_64BIT
347 .data 350 .data
348 351
diff --git a/arch/parisc/kernel/hpmc.S b/arch/parisc/kernel/hpmc.S
index c412c0adc4a9..d8baa158d8a0 100644
--- a/arch/parisc/kernel/hpmc.S
+++ b/arch/parisc/kernel/hpmc.S
@@ -46,6 +46,8 @@
46#include <asm/assembly.h> 46#include <asm/assembly.h>
47#include <asm/pdc.h> 47#include <asm/pdc.h>
48 48
49#include <linux/linkage.h>
50
49 /* 51 /*
50 * stack for os_hpmc, the HPMC handler. 52 * stack for os_hpmc, the HPMC handler.
51 * buffer for IODC procedures (for the HPMC handler). 53 * buffer for IODC procedures (for the HPMC handler).
@@ -69,17 +71,15 @@ hpmc_raddr:
69 71
70#define HPMC_PIM_DATA_SIZE 896 /* Enough to hold all architected 2.0 state */ 72#define HPMC_PIM_DATA_SIZE 896 /* Enough to hold all architected 2.0 state */
71 73
72 .export hpmc_pim_data, data
73 .align 8 74 .align 8
74hpmc_pim_data: 75ENTRY(hpmc_pim_data)
75 .block HPMC_PIM_DATA_SIZE 76 .block HPMC_PIM_DATA_SIZE
77END(hpmc_pim_data)
76 78
77 .text 79 .text
78 80
79 .export os_hpmc, code
80 .import intr_save, code 81 .import intr_save, code
81 82ENTRY(os_hpmc)
82os_hpmc:
83 83
84 /* 84 /*
85 * registers modified: 85 * registers modified:
@@ -294,11 +294,9 @@ os_hpmc_6:
294 294
295 b . 295 b .
296 nop 296 nop
297ENDPROC(os_hpmc)
297 298
298 /* this label used to compute os_hpmc checksum */ 299 /* this label used to compute os_hpmc checksum */
299 300ENTRY(os_hpmc_end)
300 .export os_hpmc_end, code
301
302os_hpmc_end:
303 301
304 nop 302 nop
diff --git a/arch/parisc/kernel/pacache.S b/arch/parisc/kernel/pacache.S
index e81c9937d10a..75d522e2d058 100644
--- a/arch/parisc/kernel/pacache.S
+++ b/arch/parisc/kernel/pacache.S
@@ -45,13 +45,12 @@
45#include <asm/assembly.h> 45#include <asm/assembly.h>
46#include <asm/pgtable.h> 46#include <asm/pgtable.h>
47#include <asm/cache.h> 47#include <asm/cache.h>
48#include <linux/linkage.h>
48 49
49 .text 50 .text
50 .align 128 51 .align 128
51 52
52 .export flush_tlb_all_local,code 53ENTRY(flush_tlb_all_local)
53
54flush_tlb_all_local:
55 .proc 54 .proc
56 .callinfo NO_CALLS 55 .callinfo NO_CALLS
57 .entry 56 .entry
@@ -200,11 +199,11 @@ fdtdone:
200 199
201 .exit 200 .exit
202 .procend 201 .procend
202ENDPROC(flush_tlb_all_local)
203 203
204 .export flush_instruction_cache_local,code
205 .import cache_info,data 204 .import cache_info,data
206 205
207flush_instruction_cache_local: 206ENTRY(flush_instruction_cache_local)
208 .proc 207 .proc
209 .callinfo NO_CALLS 208 .callinfo NO_CALLS
210 .entry 209 .entry
@@ -241,11 +240,11 @@ fisync:
241 .exit 240 .exit
242 241
243 .procend 242 .procend
243ENDPROC(flush_instruction_cache_local)
244 244
245 .export flush_data_cache_local, code
246 .import cache_info, data
247 245
248flush_data_cache_local: 246 .import cache_info, data
247ENTRY(flush_data_cache_local)
249 .proc 248 .proc
250 .callinfo NO_CALLS 249 .callinfo NO_CALLS
251 .entry 250 .entry
@@ -283,11 +282,11 @@ fdsync:
283 .exit 282 .exit
284 283
285 .procend 284 .procend
285ENDPROC(flush_data_cache_local)
286 286
287 .export copy_user_page_asm,code
288 .align 16 287 .align 16
289 288
290copy_user_page_asm: 289ENTRY(copy_user_page_asm)
291 .proc 290 .proc
292 .callinfo NO_CALLS 291 .callinfo NO_CALLS
293 .entry 292 .entry
@@ -409,6 +408,7 @@ copy_user_page_asm:
409 .exit 408 .exit
410 409
411 .procend 410 .procend
411ENDPROC(copy_user_page_asm)
412 412
413/* 413/*
414 * NOTE: Code in clear_user_page has a hard coded dependency on the 414 * NOTE: Code in clear_user_page has a hard coded dependency on the
@@ -446,9 +446,7 @@ copy_user_page_asm:
446 * lobby for such a change. 446 * lobby for such a change.
447 */ 447 */
448 448
449 .export copy_user_page_asm,code 449ENTRY(copy_user_page_asm)
450
451copy_user_page_asm:
452 .proc 450 .proc
453 .callinfo NO_CALLS 451 .callinfo NO_CALLS
454 .entry 452 .entry
@@ -534,11 +532,10 @@ copy_user_page_asm:
534 .exit 532 .exit
535 533
536 .procend 534 .procend
535ENDPROC(copy_user_page_asm)
537#endif 536#endif
538 537
539 .export __clear_user_page_asm,code 538ENTRY(__clear_user_page_asm)
540
541__clear_user_page_asm:
542 .proc 539 .proc
543 .callinfo NO_CALLS 540 .callinfo NO_CALLS
544 .entry 541 .entry
@@ -618,10 +615,9 @@ __clear_user_page_asm:
618 .exit 615 .exit
619 616
620 .procend 617 .procend
618ENDPROC(__clear_user_page_asm)
621 619
622 .export flush_kernel_dcache_page_asm 620ENTRY(flush_kernel_dcache_page_asm)
623
624flush_kernel_dcache_page_asm:
625 .proc 621 .proc
626 .callinfo NO_CALLS 622 .callinfo NO_CALLS
627 .entry 623 .entry
@@ -662,10 +658,9 @@ flush_kernel_dcache_page_asm:
662 .exit 658 .exit
663 659
664 .procend 660 .procend
661ENDPROC(flush_kernel_dcache_page_asm)
665 662
666 .export flush_user_dcache_page 663ENTRY(flush_user_dcache_page)
667
668flush_user_dcache_page:
669 .proc 664 .proc
670 .callinfo NO_CALLS 665 .callinfo NO_CALLS
671 .entry 666 .entry
@@ -706,10 +701,9 @@ flush_user_dcache_page:
706 .exit 701 .exit
707 702
708 .procend 703 .procend
704ENDPROC(flush_user_dcache_page)
709 705
710 .export flush_user_icache_page 706ENTRY(flush_user_icache_page)
711
712flush_user_icache_page:
713 .proc 707 .proc
714 .callinfo NO_CALLS 708 .callinfo NO_CALLS
715 .entry 709 .entry
@@ -750,11 +744,10 @@ flush_user_icache_page:
750 .exit 744 .exit
751 745
752 .procend 746 .procend
747ENDPROC(flush_user_icache_page)
753 748
754 749
755 .export purge_kernel_dcache_page 750ENTRY(purge_kernel_dcache_page)
756
757purge_kernel_dcache_page:
758 .proc 751 .proc
759 .callinfo NO_CALLS 752 .callinfo NO_CALLS
760 .entry 753 .entry
@@ -794,15 +787,14 @@ purge_kernel_dcache_page:
794 .exit 787 .exit
795 788
796 .procend 789 .procend
790ENDPROC(purge_kernel_dcache_page)
797 791
798#if 0 792#if 0
799 /* Currently not used, but it still is a possible alternate 793 /* Currently not used, but it still is a possible alternate
800 * solution. 794 * solution.
801 */ 795 */
802 796
803 .export flush_alias_page 797ENTRY(flush_alias_page)
804
805flush_alias_page:
806 .proc 798 .proc
807 .callinfo NO_CALLS 799 .callinfo NO_CALLS
808 .entry 800 .entry
@@ -882,10 +874,9 @@ flush_user_dcache_range_asm:
882 .exit 874 .exit
883 875
884 .procend 876 .procend
877ENDPROC(flush_alias_page)
885 878
886 .export flush_kernel_dcache_range_asm 879ENTRY(flush_kernel_dcache_range_asm)
887
888flush_kernel_dcache_range_asm:
889 .proc 880 .proc
890 .callinfo NO_CALLS 881 .callinfo NO_CALLS
891 .entry 882 .entry
@@ -905,10 +896,9 @@ flush_kernel_dcache_range_asm:
905 .exit 896 .exit
906 897
907 .procend 898 .procend
899ENDPROC(flush_kernel_dcache_range_asm)
908 900
909 .export flush_user_icache_range_asm 901ENTRY(flush_user_icache_range_asm)
910
911flush_user_icache_range_asm:
912 .proc 902 .proc
913 .callinfo NO_CALLS 903 .callinfo NO_CALLS
914 .entry 904 .entry
@@ -927,10 +917,9 @@ flush_user_icache_range_asm:
927 .exit 917 .exit
928 918
929 .procend 919 .procend
920ENDPROC(flush_user_icache_range_asm)
930 921
931 .export flush_kernel_icache_page 922ENTRY(flush_kernel_icache_page)
932
933flush_kernel_icache_page:
934 .proc 923 .proc
935 .callinfo NO_CALLS 924 .callinfo NO_CALLS
936 .entry 925 .entry
@@ -971,10 +960,9 @@ flush_kernel_icache_page:
971 .exit 960 .exit
972 961
973 .procend 962 .procend
963ENDPROC(flush_kernel_icache_page)
974 964
975 .export flush_kernel_icache_range_asm 965ENTRY(flush_kernel_icache_range_asm)
976
977flush_kernel_icache_range_asm:
978 .proc 966 .proc
979 .callinfo NO_CALLS 967 .callinfo NO_CALLS
980 .entry 968 .entry
@@ -992,14 +980,13 @@ flush_kernel_icache_range_asm:
992 nop 980 nop
993 .exit 981 .exit
994 .procend 982 .procend
983ENDPROC(flush_kernel_icache_range_asm)
995 984
996 /* align should cover use of rfi in disable_sr_hashing_asm and 985 /* align should cover use of rfi in disable_sr_hashing_asm and
997 * srdis_done. 986 * srdis_done.
998 */ 987 */
999 .align 256 988 .align 256
1000 .export disable_sr_hashing_asm,code 989ENTRY(disable_sr_hashing_asm)
1001
1002disable_sr_hashing_asm:
1003 .proc 990 .proc
1004 .callinfo NO_CALLS 991 .callinfo NO_CALLS
1005 .entry 992 .entry
@@ -1088,5 +1075,6 @@ srdis_done:
1088 .exit 1075 .exit
1089 1076
1090 .procend 1077 .procend
1078ENDPROC(disable_sr_hashing_asm)
1091 1079
1092 .end 1080 .end
diff --git a/arch/parisc/kernel/perf_asm.S b/arch/parisc/kernel/perf_asm.S
index 5e7bb90e7e08..43874ca3ed67 100644
--- a/arch/parisc/kernel/perf_asm.S
+++ b/arch/parisc/kernel/perf_asm.S
@@ -20,6 +20,7 @@
20 */ 20 */
21 21
22#include <asm/assembly.h> 22#include <asm/assembly.h>
23#include <linux/linkage.h>
23 24
24#ifdef CONFIG_64BIT 25#ifdef CONFIG_64BIT
25 .level 2.0w 26 .level 2.0w
@@ -41,10 +42,8 @@
41; starting/stopping the coprocessor with the pmenb/pmdis. 42; starting/stopping the coprocessor with the pmenb/pmdis.
42; 43;
43 .text 44 .text
44 .align 32
45 45
46 .export perf_intrigue_enable_perf_counters,code 46ENTRY(perf_intrigue_enable_perf_counters)
47perf_intrigue_enable_perf_counters:
48 .proc 47 .proc
49 .callinfo frame=0,NO_CALLS 48 .callinfo frame=0,NO_CALLS
50 .entry 49 .entry
@@ -69,9 +68,9 @@ perf_intrigue_enable_perf_counters:
69 nop 68 nop
70 .exit 69 .exit
71 .procend 70 .procend
71ENDPROC(perf_intrigue_enable_perf_counters)
72 72
73 .export perf_intrigue_disable_perf_counters,code 73ENTRY(perf_intrigue_disable_perf_counters)
74perf_intrigue_disable_perf_counters:
75 .proc 74 .proc
76 .callinfo frame=0,NO_CALLS 75 .callinfo frame=0,NO_CALLS
77 .entry 76 .entry
@@ -86,6 +85,7 @@ perf_intrigue_disable_perf_counters:
86 mtctl %r26,ccr ; turn off performance coprocessor 85 mtctl %r26,ccr ; turn off performance coprocessor
87 .exit 86 .exit
88 .procend 87 .procend
88ENDPROC(perf_intrigue_disable_perf_counters)
89 89
90;*********************************************************************** 90;***********************************************************************
91;* 91;*
@@ -117,8 +117,7 @@ perf_intrigue_disable_perf_counters:
117;* 117;*
118;*********************************************************************** 118;***********************************************************************
119 119
120 .export perf_rdr_shift_in_W,code 120ENTRY(perf_rdr_shift_in_W)
121perf_rdr_shift_in_W:
122 .proc 121 .proc
123 .callinfo frame=0,NO_CALLS 122 .callinfo frame=0,NO_CALLS
124 .entry 123 .entry
@@ -550,6 +549,7 @@ perf_rdr_shift_in_W_leave:
550 .exit 549 .exit
551 MTDIAG_2 (24) ; restore DR2 550 MTDIAG_2 (24) ; restore DR2
552 .procend 551 .procend
552ENDPROC(perf_rdr_shift_in_W)
553 553
554 554
555;*********************************************************************** 555;***********************************************************************
@@ -575,8 +575,7 @@ perf_rdr_shift_in_W_leave:
575;* 575;*
576;*********************************************************************** 576;***********************************************************************
577 577
578 .export perf_rdr_shift_out_W,code 578ENTRY(perf_rdr_shift_out_W)
579perf_rdr_shift_out_W:
580 .proc 579 .proc
581 .callinfo frame=0,NO_CALLS 580 .callinfo frame=0,NO_CALLS
582 .entry 581 .entry
@@ -983,6 +982,7 @@ perf_rdr_shift_out_W_leave:
983 .exit 982 .exit
984 MTDIAG_2 (23) ; restore DR2 983 MTDIAG_2 (23) ; restore DR2
985 .procend 984 .procend
985ENDPROC(perf_rdr_shift_out_W)
986 986
987 987
988;*********************************************************************** 988;***********************************************************************
@@ -1012,8 +1012,7 @@ perf_rdr_shift_out_W_leave:
1012;* 1012;*
1013;*********************************************************************** 1013;***********************************************************************
1014 1014
1015 .export perf_rdr_shift_in_U,code 1015ENTRY(perf_rdr_shift_in_U)
1016perf_rdr_shift_in_U:
1017 .proc 1016 .proc
1018 .callinfo frame=0,NO_CALLS 1017 .callinfo frame=0,NO_CALLS
1019 .entry 1018 .entry
@@ -1343,6 +1342,7 @@ perf_rdr_shift_in_U_leave:
1343 .exit 1342 .exit
1344 MTDIAG_2 (24) ; restore DR2 1343 MTDIAG_2 (24) ; restore DR2
1345 .procend 1344 .procend
1345ENDPROC(perf_rdr_shift_in_U)
1346 1346
1347;*********************************************************************** 1347;***********************************************************************
1348;* 1348;*
@@ -1369,8 +1369,7 @@ perf_rdr_shift_in_U_leave:
1369;* 1369;*
1370;*********************************************************************** 1370;***********************************************************************
1371 1371
1372 .export perf_rdr_shift_out_U,code 1372ENTRY(perf_rdr_shift_out_U)
1373perf_rdr_shift_out_U:
1374 .proc 1373 .proc
1375 .callinfo frame=0,NO_CALLS 1374 .callinfo frame=0,NO_CALLS
1376 .entry 1375 .entry
@@ -1687,4 +1686,5 @@ perf_rdr_shift_out_U_leave:
1687 .exit 1686 .exit
1688 MTDIAG_2 (23) ; restore DR2 1687 MTDIAG_2 (23) ; restore DR2
1689 .procend 1688 .procend
1689ENDPROC(perf_rdr_shift_out_U)
1690 1690
diff --git a/arch/parisc/kernel/real2.S b/arch/parisc/kernel/real2.S
index 789061f6ceb4..7a92695d95a6 100644
--- a/arch/parisc/kernel/real2.S
+++ b/arch/parisc/kernel/real2.S
@@ -11,6 +11,8 @@
11#include <asm/psw.h> 11#include <asm/psw.h>
12#include <asm/assembly.h> 12#include <asm/assembly.h>
13 13
14#include <linux/linkage.h>
15
14 .section .bss 16 .section .bss
15 .export real_stack 17 .export real_stack
16 .export real32_stack 18 .export real32_stack
@@ -39,8 +41,6 @@ save_cr_end:
39 41
40 .text 42 .text
41 43
42 .export real32_call_asm
43
44 /* unsigned long real32_call_asm(unsigned int *sp, 44 /* unsigned long real32_call_asm(unsigned int *sp,
45 * unsigned int *arg0p, 45 * unsigned int *arg0p,
46 * unsigned int iodc_fn) 46 * unsigned int iodc_fn)
@@ -49,7 +49,7 @@ save_cr_end:
49 * iodc_fn is the IODC function to call 49 * iodc_fn is the IODC function to call
50 */ 50 */
51 51
52real32_call_asm: 52ENTRY(real32_call_asm)
53 STREG %rp, -RP_OFFSET(%sp) /* save RP */ 53 STREG %rp, -RP_OFFSET(%sp) /* save RP */
54#ifdef CONFIG_64BIT 54#ifdef CONFIG_64BIT
55 callee_save 55 callee_save
@@ -107,6 +107,7 @@ ric_ret:
107 LDREG -RP_OFFSET(%sp), %rp /* restore RP */ 107 LDREG -RP_OFFSET(%sp), %rp /* restore RP */
108 bv 0(%rp) 108 bv 0(%rp)
109 nop 109 nop
110ENDPROC(real32_call_asm)
110 111
111 112
112# define PUSH_CR(r, where) mfctl r, %r1 ! STREG,ma %r1, REG_SZ(where) 113# define PUSH_CR(r, where) mfctl r, %r1 ! STREG,ma %r1, REG_SZ(where)
@@ -218,7 +219,6 @@ rfi_r2v_1:
218/************************ 64-bit real-mode calls ***********************/ 219/************************ 64-bit real-mode calls ***********************/
219/* This is only usable in wide kernels right now and will probably stay so */ 220/* This is only usable in wide kernels right now and will probably stay so */
220 .text 221 .text
221 .export real64_call_asm
222 /* unsigned long real64_call_asm(unsigned long *sp, 222 /* unsigned long real64_call_asm(unsigned long *sp,
223 * unsigned long *arg0p, 223 * unsigned long *arg0p,
224 * unsigned long fn) 224 * unsigned long fn)
@@ -226,7 +226,7 @@ rfi_r2v_1:
226 * arg0p points to where saved arg values may be found 226 * arg0p points to where saved arg values may be found
227 * iodc_fn is the IODC function to call 227 * iodc_fn is the IODC function to call
228 */ 228 */
229real64_call_asm: 229ENTRY(real64_call_asm)
230 std %rp, -0x10(%sp) /* save RP */ 230 std %rp, -0x10(%sp) /* save RP */
231 std %sp, -8(%arg0) /* save SP on real-mode stack */ 231 std %sp, -8(%arg0) /* save SP on real-mode stack */
232 copy %arg0, %sp /* adopt the real-mode SP */ 232 copy %arg0, %sp /* adopt the real-mode SP */
@@ -272,19 +272,21 @@ r64_ret:
272 ldd -0x10(%sp), %rp /* restore RP */ 272 ldd -0x10(%sp), %rp /* restore RP */
273 bv 0(%rp) 273 bv 0(%rp)
274 nop 274 nop
275ENDPROC(real64_call_asm)
275 276
276#endif 277#endif
277 278
278 .export __canonicalize_funcptr_for_compare
279 .text 279 .text
280 /* http://lists.parisc-linux.org/hypermail/parisc-linux/10916.html 280 /* http://lists.parisc-linux.org/hypermail/parisc-linux/10916.html
281 ** GCC 3.3 and later has a new function in libgcc.a for 281 ** GCC 3.3 and later has a new function in libgcc.a for
282 ** comparing function pointers. 282 ** comparing function pointers.
283 */ 283 */
284__canonicalize_funcptr_for_compare: 284ENTRY(__canonicalize_funcptr_for_compare)
285#ifdef CONFIG_64BIT 285#ifdef CONFIG_64BIT
286 bve (%r2) 286 bve (%r2)
287#else 287#else
288 bv %r0(%r2) 288 bv %r0(%r2)
289#endif 289#endif
290 copy %r26,%r28 290 copy %r26,%r28
291ENDPROC(__canonicalize_funcptr_for_compare)
292
diff --git a/arch/parisc/kernel/syscall.S b/arch/parisc/kernel/syscall.S
index a05800429304..de1812de5183 100644
--- a/arch/parisc/kernel/syscall.S
+++ b/arch/parisc/kernel/syscall.S
@@ -12,10 +12,11 @@
12#include <asm/errno.h> 12#include <asm/errno.h>
13#include <asm/psw.h> 13#include <asm/psw.h>
14#include <asm/thread_info.h> 14#include <asm/thread_info.h>
15
16#include <asm/assembly.h> 15#include <asm/assembly.h>
17#include <asm/processor.h> 16#include <asm/processor.h>
18 17
18#include <linux/linkage.h>
19
19 /* We fill the empty parts of the gateway page with 20 /* We fill the empty parts of the gateway page with
20 * something that will kill the kernel or a 21 * something that will kill the kernel or a
21 * userspace application. 22 * userspace application.
@@ -28,11 +29,18 @@
28 .level 1.1 29 .level 1.1
29#endif 30#endif
30 31
32/* on 64bit pad to 64bit values */
33#ifdef CONFIG_64BIT
34#define ULONG_WORD(x) .word 0, x
35#else
36#define ULONG_WORD(x) .word x
37#endif
38
39
31 .text 40 .text
32 41
33 .import syscall_exit,code 42 .import syscall_exit,code
34 .import syscall_exit_rfi,code 43 .import syscall_exit_rfi,code
35 .export linux_gateway_page
36 44
37 /* Linux gateway page is aliased to virtual page 0 in the kernel 45 /* Linux gateway page is aliased to virtual page 0 in the kernel
38 * address space. Since it is a gateway page it cannot be 46 * address space. Since it is a gateway page it cannot be
@@ -43,7 +51,7 @@
43 */ 51 */
44 52
45 .align ASM_PAGE_SIZE 53 .align ASM_PAGE_SIZE
46linux_gateway_page: 54ENTRY(linux_gateway_page)
47 55
48 /* ADDRESS 0x00 to 0xb0 = 176 bytes / 4 bytes per insn = 44 insns */ 56 /* ADDRESS 0x00 to 0xb0 = 176 bytes / 4 bytes per insn = 44 insns */
49 .rept 44 57 .rept 44
@@ -595,73 +603,49 @@ cas_action:
595 the other for the store. Either return -EFAULT. 603 the other for the store. Either return -EFAULT.
596 Each of the entries must be relocated. */ 604 Each of the entries must be relocated. */
597 .section __ex_table,"aw" 605 .section __ex_table,"aw"
598#ifdef CONFIG_64BIT 606 ULONG_WORD(2b - linux_gateway_page)
599 /* Pad the address calculation */ 607 ULONG_WORD(3b - linux_gateway_page)
600 .word 0,(2b - linux_gateway_page)
601 .word 0,(3b - linux_gateway_page)
602#else
603 .word (2b - linux_gateway_page)
604 .word (3b - linux_gateway_page)
605#endif
606 .previous 608 .previous
607 609
608 .section __ex_table,"aw" 610 .section __ex_table,"aw"
609#ifdef CONFIG_64BIT 611 ULONG_WORD(1b - linux_gateway_page)
610 /* Pad the address calculation */ 612 ULONG_WORD(3b - linux_gateway_page)
611 .word 0,(1b - linux_gateway_page)
612 .word 0,(3b - linux_gateway_page)
613#else
614 .word (1b - linux_gateway_page)
615 .word (3b - linux_gateway_page)
616#endif
617 .previous 613 .previous
618 614
619end_compare_and_swap: 615end_compare_and_swap:
620 616
621 /* Make sure nothing else is placed on this page */ 617 /* Make sure nothing else is placed on this page */
622 .align ASM_PAGE_SIZE 618 .align ASM_PAGE_SIZE
623 .export end_linux_gateway_page 619END(linux_gateway_page)
624end_linux_gateway_page: 620ENTRY(end_linux_gateway_page)
625 621
626 /* Relocate symbols assuming linux_gateway_page is mapped 622 /* Relocate symbols assuming linux_gateway_page is mapped
627 to virtual address 0x0 */ 623 to virtual address 0x0 */
628#ifdef CONFIG_64BIT 624
629 /* FIXME: The code will always be on the gateay page 625#define LWS_ENTRY(_name_) ULONG_WORD(lws_##_name_ - linux_gateway_page)
630 and thus it will be on the first 4k, the
631 assembler seems to think that the final
632 subtraction result is only a word in
633 length, so we pad the value.
634 */
635#define LWS_ENTRY(_name_) .word 0,(lws_##_name_ - linux_gateway_page)
636#else
637#define LWS_ENTRY(_name_) .word (lws_##_name_ - linux_gateway_page)
638#endif
639 626
640 .section .rodata,"a" 627 .section .rodata,"a"
641 628
642 .align ASM_PAGE_SIZE 629 .align ASM_PAGE_SIZE
643 /* Light-weight-syscall table */ 630 /* Light-weight-syscall table */
644 /* Start of lws table. */ 631 /* Start of lws table. */
645 .export lws_table 632ENTRY(lws_table)
646.Llws_table:
647lws_table:
648 LWS_ENTRY(compare_and_swap32) /* 0 - ELF32 Atomic compare and swap */ 633 LWS_ENTRY(compare_and_swap32) /* 0 - ELF32 Atomic compare and swap */
649 LWS_ENTRY(compare_and_swap64) /* 1 - ELF64 Atomic compare and swap */ 634 LWS_ENTRY(compare_and_swap64) /* 1 - ELF64 Atomic compare and swap */
635END(lws_table)
650 /* End of lws table */ 636 /* End of lws table */
651 637
652 .align ASM_PAGE_SIZE 638 .align ASM_PAGE_SIZE
653 .export sys_call_table 639ENTRY(sys_call_table)
654.Lsys_call_table:
655sys_call_table:
656#include "syscall_table.S" 640#include "syscall_table.S"
641END(sys_call_table)
657 642
658#ifdef CONFIG_64BIT 643#ifdef CONFIG_64BIT
659 .align ASM_PAGE_SIZE 644 .align ASM_PAGE_SIZE
660 .export sys_call_table64 645ENTRY(sys_call_table64)
661.Lsys_call_table64:
662sys_call_table64:
663#define SYSCALL_TABLE_64BIT 646#define SYSCALL_TABLE_64BIT
664#include "syscall_table.S" 647#include "syscall_table.S"
648END(sys_call_table64)
665#endif 649#endif
666 650
667#ifdef CONFIG_SMP 651#ifdef CONFIG_SMP
@@ -671,9 +655,7 @@ sys_call_table64:
671 */ 655 */
672 .section .data 656 .section .data
673 .align 4096 657 .align 4096
674 .export lws_lock_start 658ENTRY(lws_lock_start)
675.Llws_lock_start:
676lws_lock_start:
677 /* lws locks */ 659 /* lws locks */
678 .align 16 660 .align 16
679 .rept 16 661 .rept 16
@@ -683,6 +665,7 @@ lws_lock_start:
683 .word 0 665 .word 0
684 .word 0 666 .word 0
685 .endr 667 .endr
668END(lws_lock_start)
686 .previous 669 .previous
687#endif 670#endif
688/* CONFIG_SMP for lws_lock_start */ 671/* CONFIG_SMP for lws_lock_start */