diff --git a/arch/s390/Makefile b/arch/s390/Makefile index 494bb9ad5edfb388a6567fa597dbe7e139cb806c..aa37ba79c762e5314bb4b508cc30eb79e040a300 100644 --- a/arch/s390/Makefile +++ b/arch/s390/Makefile @@ -88,10 +88,13 @@ KBUILD_CFLAGS += -DCC_USING_HOTPATCH endif endif +# Test CFI features of binutils +cfi := $(call as-instr,.cfi_startproc\n.cfi_val_offset 15$(comma)-160\n.cfi_endproc,-DCONFIG_AS_CFI_VAL_OFFSET=1) + KBUILD_CFLAGS += -mbackchain -msoft-float $(cflags-y) KBUILD_CFLAGS += -pipe -fno-strength-reduce -Wno-sign-compare -KBUILD_CFLAGS += -fno-asynchronous-unwind-tables -KBUILD_AFLAGS += $(aflags-y) +KBUILD_CFLAGS += -fno-asynchronous-unwind-tables $(cfi) +KBUILD_AFLAGS += $(aflags-y) $(cfi) OBJCOPYFLAGS := -O binary diff --git a/arch/s390/include/asm/dwarf.h b/arch/s390/include/asm/dwarf.h index dffdb81e534f836f5361d2a92dd3e6b1a8c5e575..4f21ae561e4ddc7af7bc7a21f848f0fe4315ab59 100644 --- a/arch/s390/include/asm/dwarf.h +++ b/arch/s390/include/asm/dwarf.h @@ -4,6 +4,18 @@ #ifdef __ASSEMBLY__ +#define CFI_STARTPROC .cfi_startproc +#define CFI_ENDPROC .cfi_endproc +#define CFI_DEF_CFA_OFFSET .cfi_def_cfa_offset +#define CFI_ADJUST_CFA_OFFSET .cfi_adjust_cfa_offset +#define CFI_RESTORE .cfi_restore + +#ifdef CONFIG_AS_CFI_VAL_OFFSET +#define CFI_VAL_OFFSET .cfi_val_offset +#else +#define CFI_VAL_OFFSET # +#endif + #ifndef BUILD_VDSO /* * Emit CFI data in .debug_frame sections and not in .eh_frame diff --git a/arch/s390/kernel/vdso32/clock_getres.S b/arch/s390/kernel/vdso32/clock_getres.S index 6aeddf8e4bc732bc1f0a355c382285019e8daba8..eaf9cf1417f675818e46a9ddf575ba13428b5176 100644 --- a/arch/s390/kernel/vdso32/clock_getres.S +++ b/arch/s390/kernel/vdso32/clock_getres.S @@ -16,7 +16,7 @@ .globl __kernel_clock_getres .type __kernel_clock_getres,@function __kernel_clock_getres: - .cfi_startproc + CFI_STARTPROC basr %r1,0 la %r1,4f-.(%r1) chi %r2,__CLOCK_REALTIME @@ -38,7 +38,7 @@ __kernel_clock_getres: 3: lhi %r1,__NR_clock_getres /* fallback to svc */ svc 0 br %r14 + CFI_ENDPROC 4: .long __CLOCK_REALTIME_RES 5: .long __CLOCK_COARSE_RES - .cfi_endproc .size __kernel_clock_getres,.-__kernel_clock_getres diff --git a/arch/s390/kernel/vdso32/clock_gettime.S b/arch/s390/kernel/vdso32/clock_gettime.S index d0ac32c413e29a7ec0af766f31c8e25532a81673..a9418bf975db5a32db1c88b07d59f71454ce550b 100644 --- a/arch/s390/kernel/vdso32/clock_gettime.S +++ b/arch/s390/kernel/vdso32/clock_gettime.S @@ -16,8 +16,10 @@ .globl __kernel_clock_gettime .type __kernel_clock_gettime,@function __kernel_clock_gettime: - .cfi_startproc + CFI_STARTPROC ahi %r15,-16 + CFI_DEF_CFA_OFFSET 176 + CFI_VAL_OFFSET 15, -160 basr %r5,0 0: al %r5,21f-0b(%r5) /* get &_vdso_data */ chi %r2,__CLOCK_REALTIME_COARSE @@ -70,9 +72,13 @@ __kernel_clock_gettime: st %r1,4(%r3) /* store tp->tv_nsec */ lhi %r2,0 ahi %r15,16 + CFI_DEF_CFA_OFFSET 160 + CFI_RESTORE 15 br %r14 /* CLOCK_MONOTONIC_COARSE */ + CFI_DEF_CFA_OFFSET 176 + CFI_VAL_OFFSET 15, -160 9: l %r4,__VDSO_UPD_COUNT+4(%r5) /* load update counter */ tml %r4,0x0001 /* pending update ? loop */ jnz 9b @@ -152,15 +158,21 @@ __kernel_clock_gettime: st %r1,4(%r3) /* store tp->tv_nsec */ lhi %r2,0 ahi %r15,16 + CFI_DEF_CFA_OFFSET 160 + CFI_RESTORE 15 br %r14 /* Fallback to system call */ + CFI_DEF_CFA_OFFSET 176 + CFI_VAL_OFFSET 15, -160 19: lhi %r1,__NR_clock_gettime svc 0 ahi %r15,16 + CFI_DEF_CFA_OFFSET 160 + CFI_RESTORE 15 br %r14 + CFI_ENDPROC 20: .long 1000000000 21: .long _vdso_data - 0b - .cfi_endproc .size __kernel_clock_gettime,.-__kernel_clock_gettime diff --git a/arch/s390/kernel/vdso32/getcpu.S b/arch/s390/kernel/vdso32/getcpu.S index 539d92a2c61b19e15ffa351b4a031d55a11cfff9..25515f3fbcea8283b52b76739541c326b39d2683 100644 --- a/arch/s390/kernel/vdso32/getcpu.S +++ b/arch/s390/kernel/vdso32/getcpu.S @@ -15,7 +15,7 @@ .globl __kernel_getcpu .type __kernel_getcpu,@function __kernel_getcpu: - .cfi_startproc + CFI_STARTPROC la %r4,0 sacf 256 l %r5,__VDSO_CPU_NR(%r4) @@ -29,5 +29,5 @@ __kernel_getcpu: st %r4,0(%r3) 3: lhi %r2,0 br %r14 - .cfi_endproc + CFI_ENDPROC .size __kernel_getcpu,.-__kernel_getcpu diff --git a/arch/s390/kernel/vdso32/gettimeofday.S b/arch/s390/kernel/vdso32/gettimeofday.S index 435f819c3e65ee1a06faa6a697bd3285937d8c7e..3c0db0fa6ad90304929e7263ea2ca07bbe077eca 100644 --- a/arch/s390/kernel/vdso32/gettimeofday.S +++ b/arch/s390/kernel/vdso32/gettimeofday.S @@ -16,8 +16,10 @@ .globl __kernel_gettimeofday .type __kernel_gettimeofday,@function __kernel_gettimeofday: - .cfi_startproc + CFI_STARTPROC ahi %r15,-16 + CFI_ADJUST_CFA_OFFSET 16 + CFI_VAL_OFFSET 15, -160 basr %r5,0 0: al %r5,13f-0b(%r5) /* get &_vdso_data */ 1: ltr %r3,%r3 /* check if tz is NULL */ @@ -90,9 +92,11 @@ __kernel_gettimeofday: st %r0,4(%r2) /* store tv->tv_usec */ 10: slr %r2,%r2 ahi %r15,16 + CFI_ADJUST_CFA_OFFSET -16 + CFI_RESTORE 15 br %r14 + CFI_ENDPROC 11: .long 1000000000 12: .long 274877907 13: .long _vdso_data - 0b - .cfi_endproc .size __kernel_gettimeofday,.-__kernel_gettimeofday diff --git a/arch/s390/kernel/vdso64/clock_getres.S b/arch/s390/kernel/vdso64/clock_getres.S index 5b0d9c380de255f2e51816ed94fc8c5b1df35414..081435398e0a1f9690b2305e765576cb5c7da054 100644 --- a/arch/s390/kernel/vdso64/clock_getres.S +++ b/arch/s390/kernel/vdso64/clock_getres.S @@ -16,7 +16,7 @@ .globl __kernel_clock_getres .type __kernel_clock_getres,@function __kernel_clock_getres: - .cfi_startproc + CFI_STARTPROC larl %r1,4f cghi %r2,__CLOCK_REALTIME_COARSE je 0f @@ -44,7 +44,7 @@ __kernel_clock_getres: 2: lghi %r1,__NR_clock_getres /* fallback to svc */ svc 0 br %r14 + CFI_ENDPROC 3: .quad __CLOCK_REALTIME_RES 4: .quad __CLOCK_COARSE_RES - .cfi_endproc .size __kernel_clock_getres,.-__kernel_clock_getres diff --git a/arch/s390/kernel/vdso64/clock_gettime.S b/arch/s390/kernel/vdso64/clock_gettime.S index deccd793b2796eefc005853b17f07eeecb91d3ba..fac3ab5ec83a9c3a73f9201b5e094309dda3a1a9 100644 --- a/arch/s390/kernel/vdso64/clock_gettime.S +++ b/arch/s390/kernel/vdso64/clock_gettime.S @@ -16,8 +16,10 @@ .globl __kernel_clock_gettime .type __kernel_clock_gettime,@function __kernel_clock_gettime: - .cfi_startproc + CFI_STARTPROC aghi %r15,-16 + CFI_DEF_CFA_OFFSET 176 + CFI_VAL_OFFSET 15, -160 larl %r5,_vdso_data cghi %r2,__CLOCK_REALTIME_COARSE je 4f @@ -54,9 +56,13 @@ __kernel_clock_gettime: stg %r1,8(%r3) /* store tp->tv_nsec */ lghi %r2,0 aghi %r15,16 + CFI_DEF_CFA_OFFSET 160 + CFI_RESTORE 15 br %r14 /* CLOCK_MONOTONIC_COARSE */ + CFI_DEF_CFA_OFFSET 176 + CFI_VAL_OFFSET 15, -160 3: lg %r4,__VDSO_UPD_COUNT(%r5) /* load update counter */ tmll %r4,0x0001 /* pending update ? loop */ jnz 3b @@ -109,9 +115,13 @@ __kernel_clock_gettime: stg %r1,8(%r3) /* store tp->tv_nsec */ lghi %r2,0 aghi %r15,16 + CFI_DEF_CFA_OFFSET 160 + CFI_RESTORE 15 br %r14 /* CPUCLOCK_VIRT for this thread */ + CFI_DEF_CFA_OFFSET 176 + CFI_VAL_OFFSET 15, -160 9: lghi %r4,0 icm %r0,15,__VDSO_ECTG_OK(%r5) jz 12f @@ -132,15 +142,21 @@ __kernel_clock_gettime: stg %r4,8(%r3) lghi %r2,0 aghi %r15,16 + CFI_DEF_CFA_OFFSET 160 + CFI_RESTORE 15 br %r14 /* Fallback to system call */ + CFI_DEF_CFA_OFFSET 176 + CFI_VAL_OFFSET 15, -160 12: lghi %r1,__NR_clock_gettime svc 0 aghi %r15,16 + CFI_DEF_CFA_OFFSET 160 + CFI_RESTORE 15 br %r14 + CFI_ENDPROC 13: .quad 1000000000 14: .quad 19342813113834067 - .cfi_endproc .size __kernel_clock_gettime,.-__kernel_clock_gettime diff --git a/arch/s390/kernel/vdso64/getcpu.S b/arch/s390/kernel/vdso64/getcpu.S index 022acdecd5b9dd0eaa9d1751c4ef14e3a3f540db..2446e9dac8ab9cd77db7295f001cd63af97aff6d 100644 --- a/arch/s390/kernel/vdso64/getcpu.S +++ b/arch/s390/kernel/vdso64/getcpu.S @@ -15,7 +15,7 @@ .globl __kernel_getcpu .type __kernel_getcpu,@function __kernel_getcpu: - .cfi_startproc + CFI_STARTPROC la %r4,0 sacf 256 l %r5,__VDSO_CPU_NR(%r4) @@ -29,5 +29,5 @@ __kernel_getcpu: st %r4,0(%r3) 3: lghi %r2,0 br %r14 - .cfi_endproc + CFI_ENDPROC .size __kernel_getcpu,.-__kernel_getcpu diff --git a/arch/s390/kernel/vdso64/gettimeofday.S b/arch/s390/kernel/vdso64/gettimeofday.S index 964afb1de06d301e9fd976143d9c4db1ca1aba77..6e1f0b421695ac5c4b4bee16adee3690bf89b705 100644 --- a/arch/s390/kernel/vdso64/gettimeofday.S +++ b/arch/s390/kernel/vdso64/gettimeofday.S @@ -16,8 +16,10 @@ .globl __kernel_gettimeofday .type __kernel_gettimeofday,@function __kernel_gettimeofday: - .cfi_startproc + CFI_STARTPROC aghi %r15,-16 + CFI_ADJUST_CFA_OFFSET 16 + CFI_VAL_OFFSET 15, -160 larl %r5,_vdso_data 0: ltgr %r3,%r3 /* check if tz is NULL */ je 1f @@ -59,8 +61,10 @@ __kernel_gettimeofday: stg %r0,8(%r2) /* store tv->tv_usec */ 4: lghi %r2,0 aghi %r15,16 + CFI_ADJUST_CFA_OFFSET -16 + CFI_RESTORE 15 br %r14 + CFI_ENDPROC 5: .quad 1000000000 .long 274877907 - .cfi_endproc .size __kernel_gettimeofday,.-__kernel_gettimeofday