Skip to content

Commit

Permalink
parisc: Add cfi_startproc and cfi_endproc to assembly code
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Helge Deller committed Oct 5, 2016
1 parent 2929e73 commit f39cce6
Show file tree
Hide file tree
Showing 8 changed files with 121 additions and 80 deletions.
23 changes: 23 additions & 0 deletions arch/parisc/include/asm/dwarf.h
Original file line number Diff line number Diff line change
@@ -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 */
12 changes: 12 additions & 0 deletions arch/parisc/include/asm/linkage.h
Original file line number Diff line number Diff line change
@@ -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"
Expand All @@ -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) \
Expand All @@ -26,6 +30,14 @@
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 */
46 changes: 24 additions & 22 deletions arch/parisc/kernel/entry.S
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -782,15 +782,15 @@ ENTRY(ret_from_kernel_thread)
copy %r31, %r2
b finish_child_return
nop
ENDPROC(ret_from_kernel_thread)
ENDPROC_CFI(ret_from_kernel_thread)


/*
* struct task_struct *_switch_to(struct task_struct *prev,
* 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
Expand All @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -1117,7 +1117,7 @@ skip_save_ior:

b handle_interruption
ldo R%intr_check_sig(%r2), %r2
ENDPROC(intr_save)
ENDPROC_CFI(intr_save)


/*
Expand Down Expand Up @@ -1720,23 +1720,23 @@ 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
mfctl %cr27, %r28
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
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:
Expand All @@ -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. */
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -1979,7 +1979,7 @@ syscall_do_resched:
#else
nop
#endif
ENDPROC(syscall_exit)
ENDPROC_CFI(syscall_exit)


#ifdef CONFIG_FUNCTION_TRACER
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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 */

Expand All @@ -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,
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -2266,4 +2267,5 @@ set_register:
copy %r1,%r30
bv %r0(%r25) /* r31 */
copy %r1,%r31
ENDPROC_CFI(set_register)

4 changes: 2 additions & 2 deletions arch/parisc/kernel/hpmc.S
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ END(hpmc_pim_data)
.text

.import intr_save, code
ENTRY(os_hpmc)
ENTRY_CFI(os_hpmc)
.os_hpmc:

/*
Expand Down Expand Up @@ -299,7 +299,7 @@ os_hpmc_6:

b .
nop
ENDPROC(os_hpmc)
ENDPROC_CFI(os_hpmc)
.os_hpmc_end:


Expand Down
Loading

0 comments on commit f39cce6

Please sign in to comment.