1 /* 2 * bpf_jit64.h: BPF JIT compiler for PPC64 3 * 4 * Copyright 2016 Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com> 5 * IBM Corporation 6 * 7 * This program is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU General Public License 9 * as published by the Free Software Foundation; version 2 10 * of the License. 11 */ 12 #ifndef _BPF_JIT64_H 13 #define _BPF_JIT64_H 14 15 #include "bpf_jit.h" 16 17 /* 18 * Stack layout: 19 * Ensure the top half (upto local_tmp_var) stays consistent 20 * with our redzone usage. 21 * 22 * [ prev sp ] <------------- 23 * [ nv gpr save area ] 6*8 | 24 * [ tail_call_cnt ] 8 | 25 * [ local_tmp_var ] 8 | 26 * fp (r31) --> [ ebpf stack space ] upto 512 | 27 * [ frame header ] 32/112 | 28 * sp (r1) ---> [ stack pointer ] -------------- 29 */ 30 31 /* for gpr non volatile registers BPG_REG_6 to 10 */ 32 #define BPF_PPC_STACK_SAVE (6*8) 33 /* for bpf JIT code internal usage */ 34 #define BPF_PPC_STACK_LOCALS 16 35 /* stack frame excluding BPF stack, ensure this is quadword aligned */ 36 #define BPF_PPC_STACKFRAME (STACK_FRAME_MIN_SIZE + \ 37 BPF_PPC_STACK_LOCALS + BPF_PPC_STACK_SAVE) 38 39 #ifndef __ASSEMBLY__ 40 41 /* BPF register usage */ 42 #define TMP_REG_1 (MAX_BPF_JIT_REG + 0) 43 #define TMP_REG_2 (MAX_BPF_JIT_REG + 1) 44 45 /* BPF to ppc register mappings */ 46 static const int b2p[] = { 47 /* function return value */ 48 [BPF_REG_0] = 8, 49 /* function arguments */ 50 [BPF_REG_1] = 3, 51 [BPF_REG_2] = 4, 52 [BPF_REG_3] = 5, 53 [BPF_REG_4] = 6, 54 [BPF_REG_5] = 7, 55 /* non volatile registers */ 56 [BPF_REG_6] = 27, 57 [BPF_REG_7] = 28, 58 [BPF_REG_8] = 29, 59 [BPF_REG_9] = 30, 60 /* frame pointer aka BPF_REG_10 */ 61 [BPF_REG_FP] = 31, 62 /* eBPF jit internal registers */ 63 [BPF_REG_AX] = 2, 64 [TMP_REG_1] = 9, 65 [TMP_REG_2] = 10 66 }; 67 68 /* PPC NVR range -- update this if we ever use NVRs below r27 */ 69 #define BPF_PPC_NVR_MIN 27 70 71 #define SEEN_FUNC 0x1000 /* might call external helpers */ 72 #define SEEN_STACK 0x2000 /* uses BPF stack */ 73 #define SEEN_TAILCALL 0x4000 /* uses tail calls */ 74 75 struct codegen_context { 76 /* 77 * This is used to track register usage as well 78 * as calls to external helpers. 79 * - register usage is tracked with corresponding 80 * bits (r3-r10 and r27-r31) 81 * - rest of the bits can be used to track other 82 * things -- for now, we use bits 16 to 23 83 * encoded in SEEN_* macros above 84 */ 85 unsigned int seen; 86 unsigned int idx; 87 unsigned int stack_size; 88 }; 89 90 #endif /* !__ASSEMBLY__ */ 91 92 #endif 93