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
69
70
71
72
73
74
75
76
|
### entry point code
.macro gdbasm_startup
# Align the stack pointer to an 8-byte boundary.
lhi %r0,-8
nr %r15,%r0
# Reserve space for the standard stack frame:
# back chain, and space for the callee to save its registers.
ahi %r15,-104
# Zero this frame's back chain pointer.
xc 0(4,%r15),0(%r15)
.endm
### Call a function.
.macro gdbasm_call subr
# Put the address of the constant in %r1, load the constant
# (SUBR's address), and jump to it.
bras %r1, .Lafterconst\@
.long \subr
.Lafterconst\@:
l %r1,0(%r1)
basr %r14,%r1
.endm
### Exit with a zero status.
.macro gdbasm_exit0
lhi %r2, 0
svc 1
.endm
### Standard subroutine prologue.
.macro gdbasm_enter
# Save all the callee-saves registers. What the heck.
stm %r6,%r15,24(%r15)
# Allocate the stack frame, and write the back chain pointer.
# Keep the original SP in %r11.
lr %r1,%r15
ahi %r15,-96
st %r1,0(%r15)
.endm
### Standard subroutine epilogue.
.macro gdbasm_leave
# Restore all our registers. This also pops the frame, and
# restores our return address.
lm %r6,%r15,120(%r15)
# Jump to the return address.
br %r14
.endm
### Several nops.
.macro gdbasm_several_nops
lr %r0, %r0
lr %r0, %r0
lr %r0, %r0
lr %r0, %r0
.endm
### Declare an `int' variable.
.purgem gdbasm_datavar
.macro gdbasm_datavar name value
.data
\name:
.long \value
.endm
|