1 /****************************************************************************** 2 * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp> 3 * VA Linux Systems Japan K.K. 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 2 of the License, or 8 * (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program; if not, write to the Free Software 17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 18 * 19 */ 20 21 #ifndef __ASM_PARAVIRT_PATCH_H 22 #define __ASM_PARAVIRT_PATCH_H 23 24 #ifdef __ASSEMBLY__ 25 26 .section .paravirt_branches, "a" 27 .previous 28 #define PARAVIRT_PATCH_SITE_BR(type) \ 29 { \ 30 [1:] ; \ 31 br.cond.sptk.many 2f ; \ 32 nop.b 0 ; \ 33 nop.b 0;; ; \ 34 } ; \ 35 2: \ 36 .xdata8 ".paravirt_branches", 1b, type 37 38 #else 39 40 #include <linux/stringify.h> 41 #include <asm/intrinsics.h> 42 43 /* for binary patch */ 44 struct paravirt_patch_site_bundle { 45 void *sbundle; 46 void *ebundle; 47 unsigned long type; 48 }; 49 50 /* label means the beginning of new bundle */ 51 #define paravirt_alt_bundle(instr, privop) \ 52 "\t998:\n" \ 53 "\t" instr "\n" \ 54 "\t999:\n" \ 55 "\t.pushsection .paravirt_bundles, \"a\"\n" \ 56 "\t.popsection\n" \ 57 "\t.xdata8 \".paravirt_bundles\", 998b, 999b, " \ 58 __stringify(privop) "\n" 59 60 61 struct paravirt_patch_bundle_elem { 62 const void *sbundle; 63 const void *ebundle; 64 unsigned long type; 65 }; 66 67 68 struct paravirt_patch_site_inst { 69 unsigned long stag; 70 unsigned long etag; 71 unsigned long type; 72 }; 73 74 #define paravirt_alt_inst(instr, privop) \ 75 "\t[998:]\n" \ 76 "\t" instr "\n" \ 77 "\t[999:]\n" \ 78 "\t.pushsection .paravirt_insts, \"a\"\n" \ 79 "\t.popsection\n" \ 80 "\t.xdata8 \".paravirt_insts\", 998b, 999b, " \ 81 __stringify(privop) "\n" 82 83 struct paravirt_patch_site_branch { 84 unsigned long tag; 85 unsigned long type; 86 }; 87 88 struct paravirt_patch_branch_target { 89 const void *entry; 90 unsigned long type; 91 }; 92 93 void 94 __paravirt_patch_apply_branch( 95 unsigned long tag, unsigned long type, 96 const struct paravirt_patch_branch_target *entries, 97 unsigned int nr_entries); 98 99 void 100 paravirt_patch_reloc_br(unsigned long tag, const void *target); 101 102 void 103 paravirt_patch_reloc_brl(unsigned long tag, const void *target); 104 105 106 #if defined(ASM_SUPPORTED) && defined(CONFIG_PARAVIRT) 107 unsigned long 108 ia64_native_patch_bundle(void *sbundle, void *ebundle, unsigned long type); 109 110 unsigned long 111 __paravirt_patch_apply_bundle(void *sbundle, void *ebundle, unsigned long type, 112 const struct paravirt_patch_bundle_elem *elems, 113 unsigned long nelems, 114 const struct paravirt_patch_bundle_elem **found); 115 116 void 117 paravirt_patch_apply_bundle(const struct paravirt_patch_site_bundle *start, 118 const struct paravirt_patch_site_bundle *end); 119 120 void 121 paravirt_patch_apply_inst(const struct paravirt_patch_site_inst *start, 122 const struct paravirt_patch_site_inst *end); 123 124 void paravirt_patch_apply(void); 125 #else 126 #define paravirt_patch_apply_bundle(start, end) do { } while (0) 127 #define paravirt_patch_apply_inst(start, end) do { } while (0) 128 #define paravirt_patch_apply() do { } while (0) 129 #endif 130 131 #endif /* !__ASSEMBLEY__ */ 132 133 #endif /* __ASM_PARAVIRT_PATCH_H */ 134 135 /* 136 * Local variables: 137 * mode: C 138 * c-set-style: "linux" 139 * c-basic-offset: 8 140 * tab-width: 8 141 * indent-tabs-mode: t 142 * End: 143 */ 144