linux/arch/ia64/kernel/paravirtentry.S
<<
>>
Prefs
   1/******************************************************************************
   2 * linux/arch/ia64/xen/paravirtentry.S
   3 *
   4 * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp>
   5 *                    VA Linux Systems Japan K.K.
   6 *
   7 * This program is free software; you can redistribute it and/or modify
   8 * it under the terms of the GNU General Public License as published by
   9 * the Free Software Foundation; either version 2 of the License, or
  10 * (at your option) any later version.
  11 *
  12 * This program is distributed in the hope that it will be useful,
  13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15 * GNU General Public License for more details.
  16 *
  17 * You should have received a copy of the GNU General Public License
  18 * along with this program; if not, write to the Free Software
  19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  20 *
  21 */
  22
  23#include <linux/init.h>
  24#include <asm/asmmacro.h>
  25#include <asm/asm-offsets.h>
  26#include <asm/paravirt_privop.h>
  27#include <asm/paravirt_patch.h>
  28#include "entry.h"
  29
  30#define DATA8(sym, init_value)                  \
  31        .pushsection .data..read_mostly ;       \
  32        .align 8 ;                              \
  33        .global sym ;                           \
  34        sym: ;                                  \
  35        data8 init_value ;                      \
  36        .popsection
  37
  38#define BRANCH(targ, reg, breg, type)                                   \
  39        PARAVIRT_PATCH_SITE_BR(PARAVIRT_PATCH_TYPE_BR_ ## type) ;       \
  40        ;;                                                              \
  41        movl reg=targ ;                                                 \
  42        ;;                                                              \
  43        ld8 reg=[reg] ;                                                 \
  44        ;;                                                              \
  45        mov breg=reg ;                                                  \
  46        br.cond.sptk.many breg
  47
  48#define BRANCH_PROC(sym, reg, breg, type)                               \
  49        DATA8(paravirt_ ## sym ## _targ, ia64_native_ ## sym) ;         \
  50        GLOBAL_ENTRY(paravirt_ ## sym) ;                                \
  51                BRANCH(paravirt_ ## sym ## _targ, reg, breg, type) ;    \
  52        END(paravirt_ ## sym)
  53
  54#define BRANCH_PROC_UNWINFO(sym, reg, breg, type)                       \
  55        DATA8(paravirt_ ## sym ## _targ, ia64_native_ ## sym) ;         \
  56        GLOBAL_ENTRY(paravirt_ ## sym) ;                                \
  57                PT_REGS_UNWIND_INFO(0) ;                                \
  58                BRANCH(paravirt_ ## sym ## _targ, reg, breg, type) ;    \
  59        END(paravirt_ ## sym)
  60
  61
  62BRANCH_PROC(switch_to, r22, b7, SWITCH_TO)
  63BRANCH_PROC_UNWINFO(leave_syscall, r22, b7, LEAVE_SYSCALL)
  64BRANCH_PROC(work_processed_syscall, r2, b7, WORK_PROCESSED_SYSCALL)
  65BRANCH_PROC_UNWINFO(leave_kernel, r22, b7, LEAVE_KERNEL)
  66
  67
  68#ifdef CONFIG_MODULES
  69#define __INIT_OR_MODULE        .text
  70#define __INITDATA_OR_MODULE    .data
  71#else
  72#define __INIT_OR_MODULE        __INIT
  73#define __INITDATA_OR_MODULE    __INITDATA
  74#endif /* CONFIG_MODULES */
  75
  76        __INIT_OR_MODULE
  77        GLOBAL_ENTRY(paravirt_fc_i)
  78        fc.i r32
  79        br.ret.sptk.many rp
  80        END(paravirt_fc_i)
  81        __FINIT
  82
  83        __INIT_OR_MODULE
  84        .align 32
  85        GLOBAL_ENTRY(paravirt_nop_b_inst_bundle)
  86        {
  87                nop.b 0
  88                nop.b 0
  89                nop.b 0
  90        }
  91        END(paravirt_nop_b_inst_bundle)
  92        __FINIT
  93
  94        /* NOTE: nop.[mfi] has same format */
  95        __INIT_OR_MODULE
  96        GLOBAL_ENTRY(paravirt_nop_mfi_inst_bundle)
  97        {
  98                nop.m 0
  99                nop.f 0
 100                nop.i 0
 101        }
 102        END(paravirt_nop_mfi_inst_bundle)
 103        __FINIT
 104
 105        __INIT_OR_MODULE
 106        GLOBAL_ENTRY(paravirt_nop_bundle)
 107paravirt_nop_bundle_start:
 108        {
 109                nop 0
 110                nop 0
 111                nop 0
 112        }
 113paravirt_nop_bundle_end:
 114        END(paravirt_nop_bundle)
 115        __FINIT
 116
 117        __INITDATA_OR_MODULE
 118        .align 8
 119        .global paravirt_nop_bundle_size
 120paravirt_nop_bundle_size:
 121        data8   paravirt_nop_bundle_end - paravirt_nop_bundle_start
 122