File: make_sparc64_sysv_elf_gas.S

package info (click to toggle)
php8.4 8.4.11-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 208,108 kB
  • sloc: ansic: 1,060,628; php: 35,345; sh: 11,866; cpp: 7,201; pascal: 4,913; javascript: 3,091; asm: 2,810; yacc: 2,411; makefile: 689; xml: 446; python: 301; awk: 148
file content (68 lines) | stat: -rw-r--r-- 1,829 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/*
       Copyright Claudio Jeker 2024
   Distributed under the Boost Software License, Version 1.0.
      (See accompanying file LICENSE_1_0.txt or copy at
          http://www.boost.org/LICENSE_1_0.txt)
*/

/*
 * void *make_fcontext(void *sp, size_t size, void (*fn)(boost_context_data));
 */
#define CC64FSZ 176
#define BIAS 2047
#define FP 112
#define SP 128
#define I7 136

.file "make_sparc64_sysv_elf_gas.S"
.text
.align  4
.global make_fcontext
.type   make_fcontext, %function
make_fcontext:
	save	%sp, -CC64FSZ, %sp

	# shift address in %i0 (allocated stack) to lower 16 byte boundary
	and	%i0, -0xf, %i0

	# reserve space for two frames on the stack
	# the first frame is for the call the second one holds the data
	# for jump_fcontext
	sub	%i0, 2 * CC64FSZ, %i0

	# third argument of make_fcontext() is the context-function to call
	# store it in the first stack frame, also clear %fp there to indicate
	# the end of the stack.
	stx	%i2, [%i0 + CC64FSZ + I7]
	stx	%g0, [%i0 + CC64FSZ + FP]

	# On OpenBSD stackghost prevents overriding the return address on
	# a stack frame. So this code uses an extra trampoline to load
	# to call the context-function and then do the _exit(0) dance.
	# Extract the full address of the trampoline via pc relative addressing
1:
	rd	%pc, %l0
	add	%l0, (trampoline - 1b - 8), %l0
	stx	%l0, [%i0 + I7]

	# Save framepointer to first stack frame but first substract the BIAS
	add	%i0, CC64FSZ - BIAS, %l0
	stx	%l0, [%i0 + SP]

	# Return context-data which is also includes the BIAS
	ret
	 restore %i0, -BIAS, %o0

trampoline:
	ldx	[%sp + BIAS + I7], %l0

	# no need to setup boost_context_data, already in %o0 and %o1
	jmpl	%l0, %o7
	 nop

	call	_exit
	 clr	%o0
	unimp
.size	make_fcontext,.-make_fcontext
# Mark that we don't need executable stack.
.section .note.GNU-stack,"",%progbits