2 * Copyright 2014, Michael Ellerman, IBM Corp.
3 * Licensed under GPLv2.
10 /* ppc-asm.h defines most of the reg aliases, but not r1/r2. */
14 #define RFEBB .long 0x4c000924
20 * Back chain ------+ <- r1 <-------+
22 * Red zone / ABI Gap |
37 * Back chain <+ <- updated r1 --------+
41 #if defined(_CALL_ELF) && _CALL_ELF == 2
51 #define SAVE_AREA ((NR_GPR + NR_SPR) * 8 + (NR_VSR * 16))
52 #define CALLER_FRAME 112
54 #define STACK_FRAME (ABIGAP + SAVE_AREA + CALLER_FRAME)
56 #define CCR_SAVE (CALLER_FRAME)
57 #define LR_SAVE (CCR_SAVE + 8)
58 #define CTR_SAVE (LR_SAVE + 8)
59 #define XER_SAVE (CTR_SAVE + 8)
60 #define GPR_SAVE(n) (XER_SAVE + 8 + (8 * n))
61 #define FSCR_SAVE (GPR_SAVE(31) + 8)
62 #define VSCR_SAVE (FSCR_SAVE + 8)
63 #define VSR_SAVE(n) (VSCR_SAVE + 8 + (16 * n))
65 #define SAVE_GPR(n) std n,GPR_SAVE(n)(r1)
66 #define REST_GPR(n) ld n,GPR_SAVE(n)(r1)
67 #define TRASH_GPR(n) lis n,0xaaaa
69 #define SAVE_VSR(n, b) li b, VSR_SAVE(n); stxvd2x n,b,r1
70 #define LOAD_VSR(n, b) li b, VSR_SAVE(n); lxvd2x n,b,r1
72 #define LOAD_REG_IMMEDIATE(reg,expr) \
73 lis reg,(expr)@highest; \
74 ori reg,reg,(expr)@higher; \
75 rldicr reg,reg,32,31; \
76 oris reg,reg,(expr)@h; \
80 #if defined(_CALL_ELF) && _CALL_ELF == 2
81 #define ENTRY_POINT(name) \
82 .type FUNC_NAME(name),@function; \
83 .globl FUNC_NAME(name); \
86 #define RESTORE_TOC(name) \
87 /* Restore our TOC pointer using our entry point */ \
88 LOAD_REG_IMMEDIATE(r12, name) \
89 0: addis r2,r12,(.TOC.-0b)@ha; \
90 addi r2,r2,(.TOC.-0b)@l;
93 #define ENTRY_POINT(name) FUNC_START(name)
94 #define RESTORE_TOC(name) \
95 /* Restore our TOC pointer via our opd entry */ \
96 LOAD_REG_IMMEDIATE(r2, name) \
102 ENTRY_POINT(ebb_handler)
103 stdu r1,-STACK_FRAME(r1)
145 stfd f0, FSCR_SAVE(r1)
147 stfd f0, VSCR_SAVE(r1)
242 RESTORE_TOC(ebb_handler)
245 * r13 is our TLS pointer. We leave whatever value was in there when the
246 * EBB fired. That seems to be OK because once set the TLS pointer is not
247 * changed - but presumably that could change in future.
253 /* r2 may be changed here but we don't care */
255 lfd f0, FSCR_SAVE(r1)
257 lfd f0, VSCR_SAVE(r1)
363 addi r1,r1,STACK_FRAME
365 FUNC_END(ebb_handler)