1
0
Fork 0
mirror of https://github.com/tobast/libunwind-eh_elf.git synced 2024-11-23 07:57:38 +01:00
libunwind-eh_elf/tests/ia64-dyn-asm.S
Jan Kratochvil 57e5696463 Mark Wielaard <mwielaard@redhat.com> writes:
On some systems executable stacks are denied. Since libunwind and the
tests don't actually need executable stacks this patch marks all
assembly files as not needing it.

The original patch comes from frysk:

2007-04-05  Jan Kratochvil  <jan.kratochvil@redhat.com>

    * src/hppa/getcontext.S, src/hppa/setcontext.S, src/hppa/siglongjmp.S,
    src/ia64/Ginstall_cursor.S, src/ia64/Linstall_cursor.S,
    src/ia64/dyn_info_list.S, src/ia64/getcontext.S, src/ia64/longjmp.S,
    src/ia64/setjmp.S, src/ia64/siglongjmp.S, src/ia64/sigsetjmp.S,
    src/ppc64/longjmp.S, src/ppc64/siglongjmp.S, src/x86/longjmp.S,
    src/x86/siglongjmp.S, src/x86_64/longjmp.S, src/x86_64/setcontext.S,
    src/x86_64/siglongjmp.S: Stack should be non-executable, for SELinux.

I added a couple more markers for new files in current libunwind.

Before this patch you would get the following on selinux enabled
systems without allow_exec_stack: error while loading shared
libraries:

libunwind.so.7: cannot enable executable stack as shared object
	requires: Permission denied

After the patch that error disappears and all test results are similar
to the results on systems without executable stack protection.
2007-10-01 08:35:01 -06:00

102 lines
1.7 KiB
ArmAsm

.globl func_add1, func_add1_end
.proc func_add1
func_add1:
{.mib; add r8 = 1, r32
nop.i 0
br.ret.sptk.many rp
}
func_add1_end:
.endp func_add1
.globl func_add3, func_add3_end
.proc func_add3
func_add3:
{.mmi; alloc loc0 = ar.pfs, 2, 1, 2, 0
mov r2 = sp
add sp = -16, sp
} ;;
{.mii; ld8 r8 = [in1], 8 // load the function pointer
mov r3 = rp
mov rp = loc0 // trash rp
} ;;
{.mmi; ld8 r9 = [r8], 8 // load the entry-point
st8 [r2] = r3
mov out0 = in0
} ;;
{.mii; ld8 gp = [r8] // load the gp
mov b6 = r9
mov out1 = in1
}
{.mib; nop 0
nop 0
br.call.sptk rp = b6
}
{.mmi; add r2 = 16, sp
;;
ld8 r3 = [r2] // r3 = saved rp
mov ar.pfs = loc0
} ;;
{.mii; nop 0
mov rp = r3
adds sp = 16, sp
} ;;
{.mib; st8 [sp] = in0 // trash rp save location
add r8 = 2, r8
br.ret.sptk.many rp
}
func_add3_end:
.endp func_add3
.globl func_vframe, func_vframe_end
.proc func_vframe
func_vframe:
{.mii; alloc r16 = ar.pfs, 1, 2, 0, 0 // 0
mov loc0 = rp
mov loc1 = sp
} ;;
{.mmi; sub sp = sp, in0
st8 [loc1] = r16
mov r2 = -99 // 0
} ;;
{.mii; nop 0
mov rp = r2
mov ar.pfs = r0
}
{.mib; mov r16 = r2
tbit.nz p6, p0 = in0, 4
(p6) br.cond.sptk.many .exit
} ;;
{.mmi; ld8 r16 = [loc1]
;;
mov r3 = loc0 // 8 move saved rp to r3
mov ar.pfs = r16
} ;;
{.mmi; mov sp = loc1 // 10
st8 [loc1] = r0 // trash saved pfs
mov loc0 = r2
} ;;
{.mib; mov r8 = 10
mov rp = r3
br.ret.sptk.many rp
}
.exit:
{.mmi; ld8 r16 = [loc1]
;;
sub sp = 32, sp
mov ar.pfs = r16
} ;;
{.mmi; mov sp = loc1
st8 [loc1] = r0 // trash saved pfs
mov rp = loc0
}
{.mib; nop 0
mov r8 = 4
br.ret.sptk.many rp
}
func_vframe_end:
.endp func_vframe
#ifdef __linux__
/* We do not need executable stack. */
.section .note.GNU-stack,"",@progbits
#endif