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 */ 44struct 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 61struct paravirt_patch_bundle_elem { 62 const void *sbundle; 63 const void *ebundle; 64 unsigned long type; 65}; 66 67 68struct 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 83struct paravirt_patch_site_branch { 84 unsigned long tag; 85 unsigned long type; 86}; 87 88struct paravirt_patch_branch_target { 89 const void *entry; 90 unsigned long type; 91}; 92 93void 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 99void 100paravirt_patch_reloc_br(unsigned long tag, const void *target); 101 102void 103paravirt_patch_reloc_brl(unsigned long tag, const void *target); 104 105 106#if defined(ASM_SUPPORTED) && defined(CONFIG_PARAVIRT) 107unsigned long 108ia64_native_patch_bundle(void *sbundle, void *ebundle, unsigned long type); 109 110unsigned 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 116void 117paravirt_patch_apply_bundle(const struct paravirt_patch_site_bundle *start, 118 const struct paravirt_patch_site_bundle *end); 119 120void 121paravirt_patch_apply_inst(const struct paravirt_patch_site_inst *start, 122 const struct paravirt_patch_site_inst *end); 123 124void 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