parisc: Add cfi_startproc and cfi_endproc to assembly code
Add ENTRY_CFI() and ENDPROC_CFI() macros for dwarf debug info and convert assembly users to new macros. Signed-off-by: Helge Deller <deller@gmx.de>
This commit is contained in:
		
							parent
							
								
									2929e73800
								
							
						
					
					
						commit
						f39cce654f
					
				
							
								
								
									
										23
									
								
								arch/parisc/include/asm/dwarf.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								arch/parisc/include/asm/dwarf.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,23 @@ | ||||
| /*
 | ||||
|  * Copyright (C) 2016 Helge Deller <deller@gmx.de> | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License version 2 as | ||||
|  * published by the Free Software Foundation. | ||||
|  */ | ||||
| 
 | ||||
| #ifndef _ASM_PARISC_DWARF_H | ||||
| #define _ASM_PARISC_DWARF_H | ||||
| 
 | ||||
| #ifdef __ASSEMBLY__ | ||||
| 
 | ||||
| #define CFI_STARTPROC	.cfi_startproc | ||||
| #define CFI_ENDPROC	.cfi_endproc | ||||
| #define CFI_DEF_CFA	.cfi_def_cfa | ||||
| #define CFI_REGISTER	.cfi_register | ||||
| #define CFI_REL_OFFSET	.cfi_rel_offset | ||||
| #define CFI_UNDEFINED	.cfi_undefined | ||||
| 
 | ||||
| #endif	/* __ASSEMBLY__ */ | ||||
| 
 | ||||
| #endif	/* _ASM_PARISC_DWARF_H */ | ||||
| @ -1,6 +1,8 @@ | ||||
| #ifndef __ASM_PARISC_LINKAGE_H | ||||
| #define __ASM_PARISC_LINKAGE_H | ||||
| 
 | ||||
| #include <asm/dwarf.h> | ||||
| 
 | ||||
| #ifndef __ALIGN | ||||
| #define __ALIGN         .align 4 | ||||
| #define __ALIGN_STR     ".align 4" | ||||
| @ -10,6 +12,8 @@ | ||||
|  * In parisc assembly a semicolon marks a comment while a | ||||
|  * exclamation mark is used to separate independent lines. | ||||
|  */ | ||||
| #define ASM_NL	! | ||||
| 
 | ||||
| #ifdef __ASSEMBLY__ | ||||
| 
 | ||||
| #define ENTRY(name) \ | ||||
| @ -26,6 +30,14 @@ name: | ||||
| 	END(name) | ||||
| #endif | ||||
| 
 | ||||
| #define ENTRY_CFI(name) \ | ||||
| 	ENTRY(name)	ASM_NL\ | ||||
| 	CFI_STARTPROC | ||||
| 
 | ||||
| #define ENDPROC_CFI(name) \ | ||||
| 	ENDPROC(name)	ASM_NL\ | ||||
| 	CFI_ENDPROC | ||||
| 
 | ||||
| #endif /* __ASSEMBLY__ */ | ||||
| 
 | ||||
| #endif  /* __ASM_PARISC_LINKAGE_H */ | ||||
|  | ||||
| @ -766,7 +766,7 @@ ENTRY(end_fault_vector) | ||||
| 	 * copy_thread moved args into task save area. | ||||
| 	 */ | ||||
| 
 | ||||
| ENTRY(ret_from_kernel_thread) | ||||
| ENTRY_CFI(ret_from_kernel_thread) | ||||
| 
 | ||||
| 	/* Call schedule_tail first though */ | ||||
| 	BL	schedule_tail, %r2 | ||||
| @ -782,7 +782,7 @@ ENTRY(ret_from_kernel_thread) | ||||
| 	copy	%r31, %r2 | ||||
| 	b	finish_child_return | ||||
| 	nop | ||||
| ENDPROC(ret_from_kernel_thread) | ||||
| ENDPROC_CFI(ret_from_kernel_thread) | ||||
| 
 | ||||
| 
 | ||||
| 	/* | ||||
| @ -790,7 +790,7 @@ ENDPROC(ret_from_kernel_thread) | ||||
| 	 *	struct task_struct *next) | ||||
| 	 * | ||||
| 	 * switch kernel stacks and return prev */ | ||||
| ENTRY(_switch_to) | ||||
| ENTRY_CFI(_switch_to) | ||||
| 	STREG	 %r2, -RP_OFFSET(%r30) | ||||
| 
 | ||||
| 	callee_save_float | ||||
| @ -815,7 +815,7 @@ _switch_to_ret: | ||||
| 	LDREG	-RP_OFFSET(%r30), %r2 | ||||
| 	bv	%r0(%r2) | ||||
| 	copy	%r26, %r28 | ||||
| ENDPROC(_switch_to) | ||||
| ENDPROC_CFI(_switch_to) | ||||
| 
 | ||||
| 	/* | ||||
| 	 * Common rfi return path for interruptions, kernel execve, and | ||||
| @ -833,7 +833,7 @@ ENDPROC(_switch_to) | ||||
| 
 | ||||
| 	.align	PAGE_SIZE
 | ||||
| 
 | ||||
| ENTRY(syscall_exit_rfi) | ||||
| ENTRY_CFI(syscall_exit_rfi) | ||||
| 	mfctl   %cr30,%r16 | ||||
| 	LDREG	TI_TASK(%r16), %r16	/* thread_info -> task_struct */ | ||||
| 	ldo	TASK_REGS(%r16),%r16 | ||||
| @ -1037,12 +1037,12 @@ intr_extint: | ||||
| 
 | ||||
| 	b	do_cpu_irq_mask | ||||
| 	ldo	R%intr_return(%r2), %r2	/* return to intr_return, not here */ | ||||
| ENDPROC(syscall_exit_rfi) | ||||
| ENDPROC_CFI(syscall_exit_rfi) | ||||
| 
 | ||||
| 
 | ||||
| 	/* Generic interruptions (illegal insn, unaligned, page fault, etc) */ | ||||
| 
 | ||||
| ENTRY(intr_save)		/* for os_hpmc */ | ||||
| ENTRY_CFI(intr_save)		/* for os_hpmc */ | ||||
| 	mfsp    %sr7,%r16 | ||||
| 	cmpib,COND(=),n 0,%r16,1f | ||||
| 	get_stack_use_cr30 | ||||
| @ -1117,7 +1117,7 @@ skip_save_ior: | ||||
| 
 | ||||
| 	b		handle_interruption | ||||
| 	ldo		R%intr_check_sig(%r2), %r2 | ||||
| ENDPROC(intr_save) | ||||
| ENDPROC_CFI(intr_save) | ||||
| 
 | ||||
| 
 | ||||
| 	/* | ||||
| @ -1720,7 +1720,7 @@ dtlb_fault: | ||||
| 	.endm | ||||
| 
 | ||||
| 	.macro	fork_like name | ||||
| ENTRY(sys_\name\()_wrapper) | ||||
| ENTRY_CFI(sys_\name\()_wrapper) | ||||
| 	LDREG	TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30), %r1 | ||||
| 	ldo	TASK_REGS(%r1),%r1 | ||||
| 	reg_save %r1 | ||||
| @ -1728,7 +1728,7 @@ ENTRY(sys_\name\()_wrapper) | ||||
| 	ldil	L%sys_\name, %r31 | ||||
| 	be	R%sys_\name(%sr4,%r31) | ||||
| 	STREG	%r28, PT_CR27(%r1) | ||||
| ENDPROC(sys_\name\()_wrapper) | ||||
| ENDPROC_CFI(sys_\name\()_wrapper) | ||||
| 	.endm | ||||
| 
 | ||||
| fork_like clone | ||||
| @ -1736,7 +1736,7 @@ fork_like fork | ||||
| fork_like vfork | ||||
| 
 | ||||
| 	/* Set the return value for the child */ | ||||
| ENTRY(child_return) | ||||
| ENTRY_CFI(child_return) | ||||
| 	BL	schedule_tail, %r2 | ||||
| 	nop | ||||
| finish_child_return: | ||||
| @ -1748,9 +1748,9 @@ finish_child_return: | ||||
| 	reg_restore %r1 | ||||
| 	b	syscall_exit | ||||
| 	copy	%r0,%r28 | ||||
| ENDPROC(child_return) | ||||
| ENDPROC_CFI(child_return) | ||||
| 
 | ||||
| ENTRY(sys_rt_sigreturn_wrapper) | ||||
| ENTRY_CFI(sys_rt_sigreturn_wrapper) | ||||
| 	LDREG	TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r26 | ||||
| 	ldo	TASK_REGS(%r26),%r26	/* get pt regs */ | ||||
| 	/* Don't save regs, we are going to restore them from sigcontext. */ | ||||
| @ -1778,9 +1778,9 @@ ENTRY(sys_rt_sigreturn_wrapper) | ||||
| 	 */ | ||||
| 	bv	%r0(%r2) | ||||
| 	LDREG	PT_GR28(%r1),%r28  /* reload original r28 for syscall_exit */ | ||||
| ENDPROC(sys_rt_sigreturn_wrapper) | ||||
| ENDPROC_CFI(sys_rt_sigreturn_wrapper) | ||||
| 
 | ||||
| ENTRY(syscall_exit) | ||||
| ENTRY_CFI(syscall_exit) | ||||
| 	/* NOTE: Not all syscalls exit this way.  rt_sigreturn will exit | ||||
| 	 * via syscall_exit_rfi if the signal was received while the process | ||||
| 	 * was running. | ||||
| @ -1979,7 +1979,7 @@ syscall_do_resched: | ||||
| #else | ||||
| 	nop | ||||
| #endif | ||||
| ENDPROC(syscall_exit) | ||||
| ENDPROC_CFI(syscall_exit) | ||||
| 
 | ||||
| 
 | ||||
| #ifdef CONFIG_FUNCTION_TRACER | ||||
| @ -2023,7 +2023,7 @@ ENDPROC(mcount) | ||||
| 	.align 8
 | ||||
| 	.globl return_to_handler
 | ||||
| 	.type  return_to_handler, @function
 | ||||
| ENTRY(return_to_handler) | ||||
| ENTRY_CFI(return_to_handler) | ||||
| 	.proc | ||||
| 	.callinfo caller,frame=FRAME_SIZE | ||||
| 	.entry | ||||
| @ -2067,7 +2067,7 @@ parisc_return_to_handler: | ||||
| 	LDREGM -FRAME_SIZE(%sp),%r3 | ||||
| 	.exit | ||||
| 	.procend | ||||
| ENDPROC(return_to_handler) | ||||
| ENDPROC_CFI(return_to_handler) | ||||
| 
 | ||||
| #endif /* CONFIG_FUNCTION_GRAPH_TRACER */ | ||||
| 
 | ||||
| @ -2076,7 +2076,7 @@ ENDPROC(return_to_handler) | ||||
| #ifdef CONFIG_IRQSTACKS | ||||
| /* void call_on_stack(unsigned long param1, void *func, | ||||
| 		      unsigned long new_stack) */ | ||||
| ENTRY(call_on_stack) | ||||
| ENTRY_CFI(call_on_stack) | ||||
| 	copy	%sp, %r1 | ||||
| 
 | ||||
| 	/* Regarding the HPPA calling conventions for function pointers, | ||||
| @ -2112,10 +2112,10 @@ ENTRY(call_on_stack) | ||||
| 	bv	(%rp) | ||||
| 	LDREG	-68(%sp), %sp | ||||
| # endif /* CONFIG_64BIT */ | ||||
| ENDPROC(call_on_stack) | ||||
| ENDPROC_CFI(call_on_stack) | ||||
| #endif /* CONFIG_IRQSTACKS */ | ||||
| 
 | ||||
| get_register: | ||||
| ENTRY_CFI(get_register) | ||||
| 	/* | ||||
| 	 * get_register is used by the non access tlb miss handlers to | ||||
| 	 * copy the value of the general register specified in r8 into | ||||
| @ -2192,9 +2192,10 @@ get_register: | ||||
| 	copy    %r30,%r1 | ||||
| 	bv      %r0(%r25)    /* r31 */ | ||||
| 	copy    %r31,%r1 | ||||
| ENDPROC_CFI(get_register) | ||||
| 
 | ||||
| 
 | ||||
| set_register: | ||||
| ENTRY_CFI(set_register) | ||||
| 	/* | ||||
| 	 * set_register is used by the non access tlb miss handlers to | ||||
| 	 * copy the value of r1 into the general register specified in | ||||
| @ -2266,4 +2267,5 @@ set_register: | ||||
| 	copy    %r1,%r30 | ||||
| 	bv      %r0(%r25)    /* r31 */ | ||||
| 	copy    %r1,%r31 | ||||
| ENDPROC_CFI(set_register) | ||||
| 
 | ||||
|  | ||||
| @ -83,7 +83,7 @@ END(hpmc_pim_data) | ||||
| 	.text | ||||
| 
 | ||||
| 	.import intr_save, code | ||||
| ENTRY(os_hpmc) | ||||
| ENTRY_CFI(os_hpmc) | ||||
| .os_hpmc: | ||||
| 
 | ||||
| 	/* | ||||
| @ -299,7 +299,7 @@ os_hpmc_6: | ||||
| 
 | ||||
| 	b . | ||||
| 	nop | ||||
| ENDPROC(os_hpmc) | ||||
| ENDPROC_CFI(os_hpmc) | ||||
| .os_hpmc_end: | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -41,7 +41,7 @@ | ||||
| 	.text | ||||
| 	.align	128
 | ||||
| 
 | ||||
| ENTRY(flush_tlb_all_local) | ||||
| ENTRY_CFI(flush_tlb_all_local) | ||||
| 	.proc | ||||
| 	.callinfo NO_CALLS
 | ||||
| 	.entry | ||||
| @ -190,11 +190,11 @@ fdtdone: | ||||
| 
 | ||||
| 	.exit | ||||
| 	.procend | ||||
| ENDPROC(flush_tlb_all_local) | ||||
| ENDPROC_CFI(flush_tlb_all_local) | ||||
| 
 | ||||
| 	.import cache_info,data | ||||
| 
 | ||||
| ENTRY(flush_instruction_cache_local) | ||||
| ENTRY_CFI(flush_instruction_cache_local) | ||||
| 	.proc | ||||
| 	.callinfo NO_CALLS
 | ||||
| 	.entry | ||||
| @ -257,11 +257,11 @@ fisync: | ||||
| 	.exit | ||||
| 
 | ||||
| 	.procend | ||||
| ENDPROC(flush_instruction_cache_local) | ||||
| ENDPROC_CFI(flush_instruction_cache_local) | ||||
| 
 | ||||
| 
 | ||||
| 	.import cache_info, data | ||||
| ENTRY(flush_data_cache_local) | ||||
| ENTRY_CFI(flush_data_cache_local) | ||||
| 	.proc | ||||
| 	.callinfo NO_CALLS
 | ||||
| 	.entry | ||||
| @ -325,7 +325,7 @@ fdsync: | ||||
| 	.exit | ||||
| 
 | ||||
| 	.procend | ||||
| ENDPROC(flush_data_cache_local) | ||||
| ENDPROC_CFI(flush_data_cache_local) | ||||
| 
 | ||||
| 	.align	16
 | ||||
| 
 | ||||
| @ -356,7 +356,7 @@ ENDPROC(flush_data_cache_local) | ||||
| 
 | ||||
| /* Clear page using kernel mapping.  */ | ||||
| 
 | ||||
| ENTRY(clear_page_asm) | ||||
| ENTRY_CFI(clear_page_asm) | ||||
| 	.proc | ||||
| 	.callinfo NO_CALLS
 | ||||
| 	.entry | ||||
| @ -422,11 +422,11 @@ ENTRY(clear_page_asm) | ||||
| 	.exit | ||||
| 
 | ||||
| 	.procend | ||||
| ENDPROC(clear_page_asm) | ||||
| ENDPROC_CFI(clear_page_asm) | ||||
| 
 | ||||
| /* Copy page using kernel mapping.  */ | ||||
| 
 | ||||
| ENTRY(copy_page_asm) | ||||
| ENTRY_CFI(copy_page_asm) | ||||
| 	.proc | ||||
| 	.callinfo NO_CALLS
 | ||||
| 	.entry | ||||
| @ -540,7 +540,7 @@ ENTRY(copy_page_asm) | ||||
| 	.exit | ||||
| 
 | ||||
| 	.procend | ||||
| ENDPROC(copy_page_asm) | ||||
| ENDPROC_CFI(copy_page_asm) | ||||
| 
 | ||||
| /* | ||||
|  * NOTE: Code in clear_user_page has a hard coded dependency on the | ||||
| @ -592,7 +592,7 @@ ENDPROC(copy_page_asm) | ||||
| 	 * | ||||
| 	 */ | ||||
| 
 | ||||
| ENTRY(copy_user_page_asm) | ||||
| ENTRY_CFI(copy_user_page_asm) | ||||
| 	.proc | ||||
| 	.callinfo NO_CALLS
 | ||||
| 	.entry | ||||
| @ -748,9 +748,9 @@ ENTRY(copy_user_page_asm) | ||||
| 	.exit | ||||
| 
 | ||||
| 	.procend | ||||
| ENDPROC(copy_user_page_asm) | ||||
| ENDPROC_CFI(copy_user_page_asm) | ||||
| 
 | ||||
| ENTRY(clear_user_page_asm) | ||||
| ENTRY_CFI(clear_user_page_asm) | ||||
| 	.proc | ||||
| 	.callinfo NO_CALLS
 | ||||
| 	.entry | ||||
| @ -834,9 +834,9 @@ ENTRY(clear_user_page_asm) | ||||
| 	.exit | ||||
| 
 | ||||
| 	.procend | ||||
| ENDPROC(clear_user_page_asm) | ||||
| ENDPROC_CFI(clear_user_page_asm) | ||||
| 
 | ||||
| ENTRY(flush_dcache_page_asm) | ||||
| ENTRY_CFI(flush_dcache_page_asm) | ||||
| 	.proc | ||||
| 	.callinfo NO_CALLS
 | ||||
| 	.entry | ||||
| @ -910,9 +910,9 @@ ENTRY(flush_dcache_page_asm) | ||||
| 	.exit | ||||
| 
 | ||||
| 	.procend | ||||
| ENDPROC(flush_dcache_page_asm) | ||||
| ENDPROC_CFI(flush_dcache_page_asm) | ||||
| 
 | ||||
| ENTRY(flush_icache_page_asm) | ||||
| ENTRY_CFI(flush_icache_page_asm) | ||||
| 	.proc | ||||
| 	.callinfo NO_CALLS
 | ||||
| 	.entry | ||||
| @ -988,9 +988,9 @@ ENTRY(flush_icache_page_asm) | ||||
| 	.exit | ||||
| 
 | ||||
| 	.procend | ||||
| ENDPROC(flush_icache_page_asm) | ||||
| ENDPROC_CFI(flush_icache_page_asm) | ||||
| 
 | ||||
| ENTRY(flush_kernel_dcache_page_asm) | ||||
| ENTRY_CFI(flush_kernel_dcache_page_asm) | ||||
| 	.proc | ||||
| 	.callinfo NO_CALLS
 | ||||
| 	.entry | ||||
| @ -1031,9 +1031,9 @@ ENTRY(flush_kernel_dcache_page_asm) | ||||
| 	.exit | ||||
| 
 | ||||
| 	.procend | ||||
| ENDPROC(flush_kernel_dcache_page_asm) | ||||
| ENDPROC_CFI(flush_kernel_dcache_page_asm) | ||||
| 
 | ||||
| ENTRY(purge_kernel_dcache_page_asm) | ||||
| ENTRY_CFI(purge_kernel_dcache_page_asm) | ||||
| 	.proc | ||||
| 	.callinfo NO_CALLS
 | ||||
| 	.entry | ||||
| @ -1073,9 +1073,9 @@ ENTRY(purge_kernel_dcache_page_asm) | ||||
| 	.exit | ||||
| 
 | ||||
| 	.procend | ||||
| ENDPROC(purge_kernel_dcache_page_asm) | ||||
| ENDPROC_CFI(purge_kernel_dcache_page_asm) | ||||
| 
 | ||||
| ENTRY(flush_user_dcache_range_asm) | ||||
| ENTRY_CFI(flush_user_dcache_range_asm) | ||||
| 	.proc | ||||
| 	.callinfo NO_CALLS
 | ||||
| 	.entry | ||||
| @ -1094,9 +1094,9 @@ ENTRY(flush_user_dcache_range_asm) | ||||
| 	.exit | ||||
| 
 | ||||
| 	.procend | ||||
| ENDPROC(flush_user_dcache_range_asm) | ||||
| ENDPROC_CFI(flush_user_dcache_range_asm) | ||||
| 
 | ||||
| ENTRY(flush_kernel_dcache_range_asm) | ||||
| ENTRY_CFI(flush_kernel_dcache_range_asm) | ||||
| 	.proc | ||||
| 	.callinfo NO_CALLS
 | ||||
| 	.entry | ||||
| @ -1116,9 +1116,9 @@ ENTRY(flush_kernel_dcache_range_asm) | ||||
| 	.exit | ||||
| 
 | ||||
| 	.procend | ||||
| ENDPROC(flush_kernel_dcache_range_asm) | ||||
| ENDPROC_CFI(flush_kernel_dcache_range_asm) | ||||
| 
 | ||||
| ENTRY(flush_user_icache_range_asm) | ||||
| ENTRY_CFI(flush_user_icache_range_asm) | ||||
| 	.proc | ||||
| 	.callinfo NO_CALLS
 | ||||
| 	.entry | ||||
| @ -1137,9 +1137,9 @@ ENTRY(flush_user_icache_range_asm) | ||||
| 	.exit | ||||
| 
 | ||||
| 	.procend | ||||
| ENDPROC(flush_user_icache_range_asm) | ||||
| ENDPROC_CFI(flush_user_icache_range_asm) | ||||
| 
 | ||||
| ENTRY(flush_kernel_icache_page) | ||||
| ENTRY_CFI(flush_kernel_icache_page) | ||||
| 	.proc | ||||
| 	.callinfo NO_CALLS
 | ||||
| 	.entry | ||||
| @ -1180,9 +1180,9 @@ ENTRY(flush_kernel_icache_page) | ||||
| 	.exit | ||||
| 
 | ||||
| 	.procend | ||||
| ENDPROC(flush_kernel_icache_page) | ||||
| ENDPROC_CFI(flush_kernel_icache_page) | ||||
| 
 | ||||
| ENTRY(flush_kernel_icache_range_asm) | ||||
| ENTRY_CFI(flush_kernel_icache_range_asm) | ||||
| 	.proc | ||||
| 	.callinfo NO_CALLS
 | ||||
| 	.entry | ||||
| @ -1200,13 +1200,13 @@ ENTRY(flush_kernel_icache_range_asm) | ||||
| 	nop | ||||
| 	.exit | ||||
| 	.procend | ||||
| ENDPROC(flush_kernel_icache_range_asm) | ||||
| ENDPROC_CFI(flush_kernel_icache_range_asm) | ||||
| 
 | ||||
| 	/* align should cover use of rfi in disable_sr_hashing_asm and | ||||
| 	 * srdis_done. | ||||
| 	 */ | ||||
| 	.align	256
 | ||||
| ENTRY(disable_sr_hashing_asm) | ||||
| ENTRY_CFI(disable_sr_hashing_asm) | ||||
| 	.proc | ||||
| 	.callinfo NO_CALLS
 | ||||
| 	.entry | ||||
| @ -1295,6 +1295,6 @@ srdis_done: | ||||
| 	.exit | ||||
| 
 | ||||
| 	.procend | ||||
| ENDPROC(disable_sr_hashing_asm) | ||||
| ENDPROC_CFI(disable_sr_hashing_asm) | ||||
| 
 | ||||
| 	.end | ||||
|  | ||||
| @ -61,7 +61,7 @@ save_cr_end: | ||||
| 	 *	iodc_fn is the IODC function to call | ||||
| 	 */ | ||||
| 
 | ||||
| ENTRY(real32_call_asm) | ||||
| ENTRY_CFI(real32_call_asm) | ||||
| 	STREG	%rp, -RP_OFFSET(%sp)	/* save RP */ | ||||
| #ifdef CONFIG_64BIT | ||||
| 	callee_save | ||||
| @ -119,14 +119,14 @@ ric_ret: | ||||
| 	LDREG	-RP_OFFSET(%sp), %rp	/* restore RP */ | ||||
| 	bv	0(%rp) | ||||
| 	nop | ||||
| ENDPROC(real32_call_asm) | ||||
| ENDPROC_CFI(real32_call_asm) | ||||
| 
 | ||||
| 
 | ||||
| #  define PUSH_CR(r, where) mfctl r, %r1 ! STREG,ma %r1, REG_SZ(where) | ||||
| #  define POP_CR(r, where) LDREG,mb -REG_SZ(where), %r1 ! mtctl %r1, r | ||||
| 
 | ||||
| 	.text | ||||
| save_control_regs: | ||||
| ENTRY_CFI(save_control_regs) | ||||
| 	load32	PA(save_cr_space), %r28 | ||||
| 	PUSH_CR(%cr24, %r28) | ||||
| 	PUSH_CR(%cr25, %r28) | ||||
| @ -139,8 +139,9 @@ save_control_regs: | ||||
| 	PUSH_CR(%cr15, %r28) | ||||
| 	bv 0(%r2) | ||||
| 	nop | ||||
| ENDPROC_CFI(save_control_regs) | ||||
| 
 | ||||
| restore_control_regs: | ||||
| ENTRY_CFI(restore_control_regs) | ||||
| 	load32	PA(save_cr_end), %r26 | ||||
| 	POP_CR(%cr15, %r26) | ||||
| 	POP_CR(%cr31, %r26) | ||||
| @ -153,13 +154,14 @@ restore_control_regs: | ||||
| 	POP_CR(%cr24, %r26) | ||||
| 	bv 0(%r2) | ||||
| 	nop | ||||
| ENDPROC_CFI(restore_control_regs) | ||||
| 
 | ||||
| /* rfi_virt2real() and rfi_real2virt() could perhaps be adapted for | ||||
|  * more general-purpose use by the several places which need RFIs | ||||
|  */ | ||||
| 	.text | ||||
| 	.align 128
 | ||||
| rfi_virt2real: | ||||
| ENTRY_CFI(rfi_virt2real) | ||||
| 	/* switch to real mode... */ | ||||
| 	rsm		PSW_SM_I,%r0 | ||||
| 	load32		PA(rfi_v2r_1), %r1 | ||||
| @ -191,10 +193,11 @@ rfi_v2r_1: | ||||
| 	tophys_r1 %r2 | ||||
| 	bv	0(%r2) | ||||
| 	nop | ||||
| ENDPROC_CFI(rfi_virt2real) | ||||
| 
 | ||||
| 	.text | ||||
| 	.align 128
 | ||||
| rfi_real2virt: | ||||
| ENTRY_CFI(rfi_real2virt) | ||||
| 	rsm		PSW_SM_I,%r0 | ||||
| 	load32		(rfi_r2v_1), %r1 | ||||
| 	nop | ||||
| @ -225,6 +228,7 @@ rfi_r2v_1: | ||||
| 	tovirt_r1 %r2 | ||||
| 	bv	0(%r2) | ||||
| 	nop | ||||
| ENDPROC_CFI(rfi_real2virt) | ||||
| 
 | ||||
| #ifdef CONFIG_64BIT | ||||
| 
 | ||||
| @ -238,7 +242,7 @@ rfi_r2v_1: | ||||
| 	 *	arg0p points to where saved arg values may be found | ||||
| 	 *	iodc_fn is the IODC function to call | ||||
| 	 */ | ||||
| ENTRY(real64_call_asm) | ||||
| ENTRY_CFI(real64_call_asm) | ||||
| 	std	%rp, -0x10(%sp)		/* save RP */ | ||||
| 	std	%sp, -8(%arg0)		/* save SP on real-mode stack */ | ||||
| 	copy	%arg0, %sp		/* adopt the real-mode SP */ | ||||
| @ -284,7 +288,7 @@ r64_ret: | ||||
| 	ldd	-0x10(%sp), %rp		/* restore RP */ | ||||
| 	bv	0(%rp) | ||||
| 	nop | ||||
| ENDPROC(real64_call_asm) | ||||
| ENDPROC_CFI(real64_call_asm) | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| @ -293,12 +297,12 @@ ENDPROC(real64_call_asm) | ||||
| 	**	GCC 3.3 and later has a new function in libgcc.a for | ||||
| 	**	comparing function pointers. | ||||
| 	*/ | ||||
| ENTRY(__canonicalize_funcptr_for_compare) | ||||
| ENTRY_CFI(__canonicalize_funcptr_for_compare) | ||||
| #ifdef CONFIG_64BIT | ||||
| 	bve (%r2) | ||||
| #else | ||||
| 	bv %r0(%r2) | ||||
| #endif | ||||
| 	copy %r26,%r28 | ||||
| ENDPROC(__canonicalize_funcptr_for_compare) | ||||
| ENDPROC_CFI(__canonicalize_funcptr_for_compare) | ||||
| 
 | ||||
|  | ||||
| @ -65,34 +65,34 @@ | ||||
| 	.section .fixup, "ax" | ||||
| 
 | ||||
| 	/* get_user() fixups, store -EFAULT in r8, and 0 in r9 */ | ||||
| ENTRY(fixup_get_user_skip_1) | ||||
| ENTRY_CFI(fixup_get_user_skip_1) | ||||
| 	get_fault_ip %r1,%r8 | ||||
| 	ldo 4(%r1), %r1 | ||||
| 	ldi -EFAULT, %r8 | ||||
| 	bv %r0(%r1) | ||||
| 	copy %r0, %r9 | ||||
| ENDPROC(fixup_get_user_skip_1) | ||||
| ENDPROC_CFI(fixup_get_user_skip_1) | ||||
| 
 | ||||
| ENTRY(fixup_get_user_skip_2) | ||||
| ENTRY_CFI(fixup_get_user_skip_2) | ||||
| 	get_fault_ip %r1,%r8 | ||||
| 	ldo 8(%r1), %r1 | ||||
| 	ldi -EFAULT, %r8 | ||||
| 	bv %r0(%r1) | ||||
| 	copy %r0, %r9 | ||||
| ENDPROC(fixup_get_user_skip_2) | ||||
| ENDPROC_CFI(fixup_get_user_skip_2) | ||||
| 
 | ||||
| 	/* put_user() fixups, store -EFAULT in r8 */ | ||||
| ENTRY(fixup_put_user_skip_1) | ||||
| ENTRY_CFI(fixup_put_user_skip_1) | ||||
| 	get_fault_ip %r1,%r8 | ||||
| 	ldo 4(%r1), %r1 | ||||
| 	bv %r0(%r1) | ||||
| 	ldi -EFAULT, %r8 | ||||
| ENDPROC(fixup_put_user_skip_1) | ||||
| ENDPROC_CFI(fixup_put_user_skip_1) | ||||
| 
 | ||||
| ENTRY(fixup_put_user_skip_2) | ||||
| ENTRY_CFI(fixup_put_user_skip_2) | ||||
| 	get_fault_ip %r1,%r8 | ||||
| 	ldo 8(%r1), %r1 | ||||
| 	bv %r0(%r1) | ||||
| 	ldi -EFAULT, %r8 | ||||
| ENDPROC(fixup_put_user_skip_2) | ||||
| ENDPROC_CFI(fixup_put_user_skip_2) | ||||
| 
 | ||||
|  | ||||
| @ -67,7 +67,7 @@ | ||||
| 	 * otherwise, returns number of bytes not transferred. | ||||
| 	 */ | ||||
| 
 | ||||
| ENTRY(lclear_user) | ||||
| ENTRY_CFI(lclear_user) | ||||
| 	.proc | ||||
| 	.callinfo NO_CALLS
 | ||||
| 	.entry | ||||
| @ -81,7 +81,7 @@ $lclu_done: | ||||
| 	bv          %r0(%r2) | ||||
| 	copy        %r25,%r28 | ||||
| 	.exit | ||||
| ENDPROC(lclear_user) | ||||
| ENDPROC_CFI(lclear_user) | ||||
| 
 | ||||
| 	.section .fixup,"ax" | ||||
| 2:      fixup_branch $lclu_done | ||||
| @ -100,7 +100,7 @@ ENDPROC(lclear_user) | ||||
| 	 *         else strlen + 1 (i.e. includes zero byte). | ||||
| 	 */ | ||||
| 
 | ||||
| ENTRY(lstrnlen_user) | ||||
| ENTRY_CFI(lstrnlen_user) | ||||
| 	.proc | ||||
| 	.callinfo NO_CALLS
 | ||||
| 	.entry | ||||
| @ -120,7 +120,7 @@ $lslen_done: | ||||
| $lslen_nzero: | ||||
| 	b           $lslen_done | ||||
| 	ldo         1(%r26),%r26 /* special case for N == 0 */ | ||||
| ENDPROC(lstrnlen_user) | ||||
| ENDPROC_CFI(lstrnlen_user) | ||||
| 
 | ||||
| 	.section .fixup,"ax" | ||||
| 3:      fixup_branch $lslen_done | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user