mirror of
https://github.com/armbian/linux.git
synced 2026-01-06 10:13:00 -08:00
Pull pv_ops-xen into release branch
This commit is contained in:
183
Documentation/ia64/xen.txt
Normal file
183
Documentation/ia64/xen.txt
Normal file
@@ -0,0 +1,183 @@
|
||||
Recipe for getting/building/running Xen/ia64 with pv_ops
|
||||
--------------------------------------------------------
|
||||
|
||||
This recipe describes how to get xen-ia64 source and build it,
|
||||
and run domU with pv_ops.
|
||||
|
||||
============
|
||||
Requirements
|
||||
============
|
||||
|
||||
- python
|
||||
- mercurial
|
||||
it (aka "hg") is an open-source source code
|
||||
management software. See the below.
|
||||
http://www.selenic.com/mercurial/wiki/
|
||||
- git
|
||||
- bridge-utils
|
||||
|
||||
=================================
|
||||
Getting and Building Xen and Dom0
|
||||
=================================
|
||||
|
||||
My environment is;
|
||||
Machine : Tiger4
|
||||
Domain0 OS : RHEL5
|
||||
DomainU OS : RHEL5
|
||||
|
||||
1. Download source
|
||||
# hg clone http://xenbits.xensource.com/ext/ia64/xen-unstable.hg
|
||||
# cd xen-unstable.hg
|
||||
# hg clone http://xenbits.xensource.com/ext/ia64/linux-2.6.18-xen.hg
|
||||
|
||||
2. # make world
|
||||
|
||||
3. # make install-tools
|
||||
|
||||
4. copy kernels and xen
|
||||
# cp xen/xen.gz /boot/efi/efi/redhat/
|
||||
# cp build-linux-2.6.18-xen_ia64/vmlinux.gz \
|
||||
/boot/efi/efi/redhat/vmlinuz-2.6.18.8-xen
|
||||
|
||||
5. make initrd for Dom0/DomU
|
||||
# make -C linux-2.6.18-xen.hg ARCH=ia64 modules_install \
|
||||
O=$(/bin/pwd)/build-linux-2.6.18-xen_ia64
|
||||
# mkinitrd -f /boot/efi/efi/redhat/initrd-2.6.18.8-xen.img \
|
||||
2.6.18.8-xen --builtin mptspi --builtin mptbase \
|
||||
--builtin mptscsih --builtin uhci-hcd --builtin ohci-hcd \
|
||||
--builtin ehci-hcd
|
||||
|
||||
================================
|
||||
Making a disk image for guest OS
|
||||
================================
|
||||
|
||||
1. make file
|
||||
# dd if=/dev/zero of=/root/rhel5.img bs=1M seek=4096 count=0
|
||||
# mke2fs -F -j /root/rhel5.img
|
||||
# mount -o loop /root/rhel5.img /mnt
|
||||
# cp -ax /{dev,var,etc,usr,bin,sbin,lib} /mnt
|
||||
# mkdir /mnt/{root,proc,sys,home,tmp}
|
||||
|
||||
Note: You may miss some device files. If so, please create them
|
||||
with mknod. Or you can use tar instead of cp.
|
||||
|
||||
2. modify DomU's fstab
|
||||
# vi /mnt/etc/fstab
|
||||
/dev/xvda1 / ext3 defaults 1 1
|
||||
none /dev/pts devpts gid=5,mode=620 0 0
|
||||
none /dev/shm tmpfs defaults 0 0
|
||||
none /proc proc defaults 0 0
|
||||
none /sys sysfs defaults 0 0
|
||||
|
||||
3. modify inittab
|
||||
set runlevel to 3 to avoid X trying to start
|
||||
# vi /mnt/etc/inittab
|
||||
id:3:initdefault:
|
||||
Start a getty on the hvc0 console
|
||||
X0:2345:respawn:/sbin/mingetty hvc0
|
||||
tty1-6 mingetty can be commented out
|
||||
|
||||
4. add hvc0 into /etc/securetty
|
||||
# vi /mnt/etc/securetty (add hvc0)
|
||||
|
||||
5. umount
|
||||
# umount /mnt
|
||||
|
||||
FYI, virt-manager can also make a disk image for guest OS.
|
||||
It's GUI tools and easy to make it.
|
||||
|
||||
==================
|
||||
Boot Xen & Domain0
|
||||
==================
|
||||
|
||||
1. replace elilo
|
||||
elilo of RHEL5 can boot Xen and Dom0.
|
||||
If you use old elilo (e.g RHEL4), please download from the below
|
||||
http://elilo.sourceforge.net/cgi-bin/blosxom
|
||||
and copy into /boot/efi/efi/redhat/
|
||||
# cp elilo-3.6-ia64.efi /boot/efi/efi/redhat/elilo.efi
|
||||
|
||||
2. modify elilo.conf (like the below)
|
||||
# vi /boot/efi/efi/redhat/elilo.conf
|
||||
prompt
|
||||
timeout=20
|
||||
default=xen
|
||||
relocatable
|
||||
|
||||
image=vmlinuz-2.6.18.8-xen
|
||||
label=xen
|
||||
vmm=xen.gz
|
||||
initrd=initrd-2.6.18.8-xen.img
|
||||
read-only
|
||||
append=" -- rhgb root=/dev/sda2"
|
||||
|
||||
The append options before "--" are for xen hypervisor,
|
||||
the options after "--" are for dom0.
|
||||
|
||||
FYI, your machine may need console options like
|
||||
"com1=19200,8n1 console=vga,com1". For example,
|
||||
append="com1=19200,8n1 console=vga,com1 -- rhgb console=tty0 \
|
||||
console=ttyS0 root=/dev/sda2"
|
||||
|
||||
=====================================
|
||||
Getting and Building domU with pv_ops
|
||||
=====================================
|
||||
|
||||
1. get pv_ops tree
|
||||
# git clone http://people.valinux.co.jp/~yamahata/xen-ia64/linux-2.6-xen-ia64.git/
|
||||
|
||||
2. git branch (if necessary)
|
||||
# cd linux-2.6-xen-ia64/
|
||||
# git checkout -b your_branch origin/xen-ia64-domu-minimal-2008may19
|
||||
(Note: The current branch is xen-ia64-domu-minimal-2008may19.
|
||||
But you would find the new branch. You can see with
|
||||
"git branch -r" to get the branch lists.
|
||||
http://people.valinux.co.jp/~yamahata/xen-ia64/for_eagl/linux-2.6-ia64-pv-ops.git/
|
||||
is also available. The tree is based on
|
||||
git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6 test)
|
||||
|
||||
|
||||
3. copy .config for pv_ops of domU
|
||||
# cp arch/ia64/configs/xen_domu_wip_defconfig .config
|
||||
|
||||
4. make kernel with pv_ops
|
||||
# make oldconfig
|
||||
# make
|
||||
|
||||
5. install the kernel and initrd
|
||||
# cp vmlinux.gz /boot/efi/efi/redhat/vmlinuz-2.6-pv_ops-xenU
|
||||
# make modules_install
|
||||
# mkinitrd -f /boot/efi/efi/redhat/initrd-2.6-pv_ops-xenU.img \
|
||||
2.6.26-rc3xen-ia64-08941-g1b12161 --builtin mptspi \
|
||||
--builtin mptbase --builtin mptscsih --builtin uhci-hcd \
|
||||
--builtin ohci-hcd --builtin ehci-hcd
|
||||
|
||||
========================
|
||||
Boot DomainU with pv_ops
|
||||
========================
|
||||
|
||||
1. make config of DomU
|
||||
# vi /etc/xen/rhel5
|
||||
kernel = "/boot/efi/efi/redhat/vmlinuz-2.6-pv_ops-xenU"
|
||||
ramdisk = "/boot/efi/efi/redhat/initrd-2.6-pv_ops-xenU.img"
|
||||
vcpus = 1
|
||||
memory = 512
|
||||
name = "rhel5"
|
||||
disk = [ 'file:/root/rhel5.img,xvda1,w' ]
|
||||
root = "/dev/xvda1 ro"
|
||||
extra= "rhgb console=hvc0"
|
||||
|
||||
2. After boot xen and dom0, start xend
|
||||
# /etc/init.d/xend start
|
||||
( In the debugging case, # XEND_DEBUG=1 xend trace_start )
|
||||
|
||||
3. start domU
|
||||
# xm create -c rhel5
|
||||
|
||||
=========
|
||||
Reference
|
||||
=========
|
||||
- Wiki of Xen/IA64 upstream merge
|
||||
http://wiki.xensource.com/xenwiki/XenIA64/UpstreamMerge
|
||||
|
||||
Written by Akio Takebe <takebe_akio@jp.fujitsu.com> on 28 May 2008
|
||||
@@ -109,6 +109,33 @@ config AUDIT_ARCH
|
||||
bool
|
||||
default y
|
||||
|
||||
menuconfig PARAVIRT_GUEST
|
||||
bool "Paravirtualized guest support"
|
||||
help
|
||||
Say Y here to get to see options related to running Linux under
|
||||
various hypervisors. This option alone does not add any kernel code.
|
||||
|
||||
If you say N, all options in this submenu will be skipped and disabled.
|
||||
|
||||
if PARAVIRT_GUEST
|
||||
|
||||
config PARAVIRT
|
||||
bool "Enable paravirtualization code"
|
||||
depends on PARAVIRT_GUEST
|
||||
default y
|
||||
bool
|
||||
default y
|
||||
help
|
||||
This changes the kernel so it can modify itself when it is run
|
||||
under a hypervisor, potentially improving performance significantly
|
||||
over full virtualization. However, when run without a hypervisor
|
||||
the kernel is theoretically slower and slightly larger.
|
||||
|
||||
|
||||
source "arch/ia64/xen/Kconfig"
|
||||
|
||||
endif
|
||||
|
||||
choice
|
||||
prompt "System type"
|
||||
default IA64_GENERIC
|
||||
@@ -130,6 +157,7 @@ config IA64_GENERIC
|
||||
SGI-SN2 For SGI Altix systems
|
||||
SGI-UV For SGI UV systems
|
||||
Ski-simulator For the HP simulator <http://www.hpl.hp.com/research/linux/ski/>
|
||||
Xen-domU For xen domU system
|
||||
|
||||
If you don't know what to do, choose "generic".
|
||||
|
||||
@@ -180,6 +208,10 @@ config IA64_HP_SIM
|
||||
bool "Ski-simulator"
|
||||
select SWIOTLB
|
||||
|
||||
config IA64_XEN_GUEST
|
||||
bool "Xen guest"
|
||||
depends on XEN
|
||||
|
||||
endchoice
|
||||
|
||||
choice
|
||||
|
||||
@@ -56,9 +56,11 @@ core-$(CONFIG_IA64_DIG) += arch/ia64/dig/
|
||||
core-$(CONFIG_IA64_GENERIC) += arch/ia64/dig/
|
||||
core-$(CONFIG_IA64_HP_ZX1) += arch/ia64/dig/
|
||||
core-$(CONFIG_IA64_HP_ZX1_SWIOTLB) += arch/ia64/dig/
|
||||
core-$(CONFIG_IA64_XEN_GUEST) += arch/ia64/dig/
|
||||
core-$(CONFIG_IA64_SGI_SN2) += arch/ia64/sn/
|
||||
core-$(CONFIG_IA64_SGI_UV) += arch/ia64/uv/
|
||||
core-$(CONFIG_KVM) += arch/ia64/kvm/
|
||||
core-$(CONFIG_XEN) += arch/ia64/xen/
|
||||
|
||||
drivers-$(CONFIG_PCI) += arch/ia64/pci/
|
||||
drivers-$(CONFIG_IA64_HP_SIM) += arch/ia64/hp/sim/
|
||||
|
||||
@@ -20,4 +20,13 @@
|
||||
*/
|
||||
#define __IA64_BREAK_SYSCALL 0x100000
|
||||
|
||||
/*
|
||||
* Xen specific break numbers:
|
||||
*/
|
||||
#define __IA64_XEN_HYPERCALL 0x1000
|
||||
/* [__IA64_XEN_HYPERPRIVOP_START, __IA64_XEN_HYPERPRIVOP_MAX] is used
|
||||
for xen hyperprivops */
|
||||
#define __IA64_XEN_HYPERPRIVOP_START 0x1
|
||||
#define __IA64_XEN_HYPERPRIVOP_MAX 0x1a
|
||||
|
||||
#endif /* _ASM_IA64_BREAK_H */
|
||||
|
||||
@@ -128,6 +128,8 @@ extern void machvec_tlb_migrate_finish (struct mm_struct *);
|
||||
# include <asm/machvec_sn2.h>
|
||||
# elif defined (CONFIG_IA64_SGI_UV)
|
||||
# include <asm/machvec_uv.h>
|
||||
# elif defined (CONFIG_IA64_XEN_GUEST)
|
||||
# include <asm/machvec_xen.h>
|
||||
# elif defined (CONFIG_IA64_GENERIC)
|
||||
|
||||
# ifdef MACHVEC_PLATFORM_HEADER
|
||||
|
||||
22
arch/ia64/include/asm/machvec_xen.h
Normal file
22
arch/ia64/include/asm/machvec_xen.h
Normal file
@@ -0,0 +1,22 @@
|
||||
#ifndef _ASM_IA64_MACHVEC_XEN_h
|
||||
#define _ASM_IA64_MACHVEC_XEN_h
|
||||
|
||||
extern ia64_mv_setup_t dig_setup;
|
||||
extern ia64_mv_cpu_init_t xen_cpu_init;
|
||||
extern ia64_mv_irq_init_t xen_irq_init;
|
||||
extern ia64_mv_send_ipi_t xen_platform_send_ipi;
|
||||
|
||||
/*
|
||||
* This stuff has dual use!
|
||||
*
|
||||
* For a generic kernel, the macros are used to initialize the
|
||||
* platform's machvec structure. When compiling a non-generic kernel,
|
||||
* the macros are used directly.
|
||||
*/
|
||||
#define platform_name "xen"
|
||||
#define platform_setup dig_setup
|
||||
#define platform_cpu_init xen_cpu_init
|
||||
#define platform_irq_init xen_irq_init
|
||||
#define platform_send_ipi xen_platform_send_ipi
|
||||
|
||||
#endif /* _ASM_IA64_MACHVEC_XEN_h */
|
||||
@@ -18,10 +18,11 @@
|
||||
* - crash dumping code reserved region
|
||||
* - Kernel memory map built from EFI memory map
|
||||
* - ELF core header
|
||||
* - xen start info if CONFIG_XEN
|
||||
*
|
||||
* More could be added if necessary
|
||||
*/
|
||||
#define IA64_MAX_RSVD_REGIONS 8
|
||||
#define IA64_MAX_RSVD_REGIONS 9
|
||||
|
||||
struct rsvd_region {
|
||||
unsigned long start; /* virtual address of beginning of element */
|
||||
|
||||
@@ -36,8 +36,13 @@
|
||||
;; \
|
||||
movl clob = PARAVIRT_POISON; \
|
||||
;;
|
||||
# define CLOBBER_PRED(pred_clob) \
|
||||
;; \
|
||||
cmp.eq pred_clob, p0 = r0, r0 \
|
||||
;;
|
||||
#else
|
||||
# define CLOBBER(clob) /* nothing */
|
||||
# define CLOBBER(clob) /* nothing */
|
||||
# define CLOBBER_PRED(pred_clob) /* nothing */
|
||||
#endif
|
||||
|
||||
#define MOV_FROM_IFA(reg) \
|
||||
@@ -136,7 +141,8 @@
|
||||
|
||||
#define SSM_PSR_I(pred, pred_clob, clob) \
|
||||
(pred) ssm psr.i \
|
||||
CLOBBER(clob)
|
||||
CLOBBER(clob) \
|
||||
CLOBBER_PRED(pred_clob)
|
||||
|
||||
#define RSM_PSR_I(pred, clob0, clob1) \
|
||||
(pred) rsm psr.i \
|
||||
|
||||
263
arch/ia64/include/asm/native/pvchk_inst.h
Normal file
263
arch/ia64/include/asm/native/pvchk_inst.h
Normal file
@@ -0,0 +1,263 @@
|
||||
#ifndef _ASM_NATIVE_PVCHK_INST_H
|
||||
#define _ASM_NATIVE_PVCHK_INST_H
|
||||
|
||||
/******************************************************************************
|
||||
* arch/ia64/include/asm/native/pvchk_inst.h
|
||||
* Checker for paravirtualizations of privileged operations.
|
||||
*
|
||||
* Copyright (C) 2005 Hewlett-Packard Co
|
||||
* Dan Magenheimer <dan.magenheimer@hp.com>
|
||||
*
|
||||
* Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp>
|
||||
* VA Linux Systems Japan K.K.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
/**********************************************
|
||||
* Instructions paravirtualized for correctness
|
||||
**********************************************/
|
||||
|
||||
/* "fc" and "thash" are privilege-sensitive instructions, meaning they
|
||||
* may have different semantics depending on whether they are executed
|
||||
* at PL0 vs PL!=0. When paravirtualized, these instructions mustn't
|
||||
* be allowed to execute directly, lest incorrect semantics result.
|
||||
*/
|
||||
|
||||
#define fc .error "fc should not be used directly."
|
||||
#define thash .error "thash should not be used directly."
|
||||
|
||||
/* Note that "ttag" and "cover" are also privilege-sensitive; "ttag"
|
||||
* is not currently used (though it may be in a long-format VHPT system!)
|
||||
* and the semantics of cover only change if psr.ic is off which is very
|
||||
* rare (and currently non-existent outside of assembly code
|
||||
*/
|
||||
#define ttag .error "ttag should not be used directly."
|
||||
#define cover .error "cover should not be used directly."
|
||||
|
||||
/* There are also privilege-sensitive registers. These registers are
|
||||
* readable at any privilege level but only writable at PL0.
|
||||
*/
|
||||
#define cpuid .error "cpuid should not be used directly."
|
||||
#define pmd .error "pmd should not be used directly."
|
||||
|
||||
/*
|
||||
* mov ar.eflag =
|
||||
* mov = ar.eflag
|
||||
*/
|
||||
|
||||
/**********************************************
|
||||
* Instructions paravirtualized for performance
|
||||
**********************************************/
|
||||
/*
|
||||
* Those instructions include '.' which can't be handled by cpp.
|
||||
* or can't be handled by cpp easily.
|
||||
* They are handled by sed instead of cpp.
|
||||
*/
|
||||
|
||||
/* for .S
|
||||
* itc.i
|
||||
* itc.d
|
||||
*
|
||||
* bsw.0
|
||||
* bsw.1
|
||||
*
|
||||
* ssm psr.ic | PSR_DEFAULT_BITS
|
||||
* ssm psr.ic
|
||||
* rsm psr.ic
|
||||
* ssm psr.i
|
||||
* rsm psr.i
|
||||
* rsm psr.i | psr.ic
|
||||
* rsm psr.dt
|
||||
* ssm psr.dt
|
||||
*
|
||||
* mov = cr.ifa
|
||||
* mov = cr.itir
|
||||
* mov = cr.isr
|
||||
* mov = cr.iha
|
||||
* mov = cr.ipsr
|
||||
* mov = cr.iim
|
||||
* mov = cr.iip
|
||||
* mov = cr.ivr
|
||||
* mov = psr
|
||||
*
|
||||
* mov cr.ifa =
|
||||
* mov cr.itir =
|
||||
* mov cr.iha =
|
||||
* mov cr.ipsr =
|
||||
* mov cr.ifs =
|
||||
* mov cr.iip =
|
||||
* mov cr.kr =
|
||||
*/
|
||||
|
||||
/* for intrinsics
|
||||
* ssm psr.i
|
||||
* rsm psr.i
|
||||
* mov = psr
|
||||
* mov = ivr
|
||||
* mov = tpr
|
||||
* mov cr.itm =
|
||||
* mov eoi =
|
||||
* mov rr[] =
|
||||
* mov = rr[]
|
||||
* mov = kr
|
||||
* mov kr =
|
||||
* ptc.ga
|
||||
*/
|
||||
|
||||
/*************************************************************
|
||||
* define paravirtualized instrcution macros as nop to ingore.
|
||||
* and check whether arguments are appropriate.
|
||||
*************************************************************/
|
||||
|
||||
/* check whether reg is a regular register */
|
||||
.macro is_rreg_in reg
|
||||
.ifc "\reg", "r0"
|
||||
nop 0
|
||||
.exitm
|
||||
.endif
|
||||
;;
|
||||
mov \reg = r0
|
||||
;;
|
||||
.endm
|
||||
#define IS_RREG_IN(reg) is_rreg_in reg ;
|
||||
|
||||
#define IS_RREG_OUT(reg) \
|
||||
;; \
|
||||
mov reg = r0 \
|
||||
;;
|
||||
|
||||
#define IS_RREG_CLOB(reg) IS_RREG_OUT(reg)
|
||||
|
||||
/* check whether pred is a predicate register */
|
||||
#define IS_PRED_IN(pred) \
|
||||
;; \
|
||||
(pred) nop 0 \
|
||||
;;
|
||||
|
||||
#define IS_PRED_OUT(pred) \
|
||||
;; \
|
||||
cmp.eq pred, p0 = r0, r0 \
|
||||
;;
|
||||
|
||||
#define IS_PRED_CLOB(pred) IS_PRED_OUT(pred)
|
||||
|
||||
|
||||
#define DO_SAVE_MIN(__COVER, SAVE_IFS, EXTRA, WORKAROUND) \
|
||||
nop 0
|
||||
#define MOV_FROM_IFA(reg) \
|
||||
IS_RREG_OUT(reg)
|
||||
#define MOV_FROM_ITIR(reg) \
|
||||
IS_RREG_OUT(reg)
|
||||
#define MOV_FROM_ISR(reg) \
|
||||
IS_RREG_OUT(reg)
|
||||
#define MOV_FROM_IHA(reg) \
|
||||
IS_RREG_OUT(reg)
|
||||
#define MOV_FROM_IPSR(pred, reg) \
|
||||
IS_PRED_IN(pred) \
|
||||
IS_RREG_OUT(reg)
|
||||
#define MOV_FROM_IIM(reg) \
|
||||
IS_RREG_OUT(reg)
|
||||
#define MOV_FROM_IIP(reg) \
|
||||
IS_RREG_OUT(reg)
|
||||
#define MOV_FROM_IVR(reg, clob) \
|
||||
IS_RREG_OUT(reg) \
|
||||
IS_RREG_CLOB(clob)
|
||||
#define MOV_FROM_PSR(pred, reg, clob) \
|
||||
IS_PRED_IN(pred) \
|
||||
IS_RREG_OUT(reg) \
|
||||
IS_RREG_CLOB(clob)
|
||||
#define MOV_TO_IFA(reg, clob) \
|
||||
IS_RREG_IN(reg) \
|
||||
IS_RREG_CLOB(clob)
|
||||
#define MOV_TO_ITIR(pred, reg, clob) \
|
||||
IS_PRED_IN(pred) \
|
||||
IS_RREG_IN(reg) \
|
||||
IS_RREG_CLOB(clob)
|
||||
#define MOV_TO_IHA(pred, reg, clob) \
|
||||
IS_PRED_IN(pred) \
|
||||
IS_RREG_IN(reg) \
|
||||
IS_RREG_CLOB(clob)
|
||||
#define MOV_TO_IPSR(pred, reg, clob) \
|
||||
IS_PRED_IN(pred) \
|
||||
IS_RREG_IN(reg) \
|
||||
IS_RREG_CLOB(clob)
|
||||
#define MOV_TO_IFS(pred, reg, clob) \
|
||||
IS_PRED_IN(pred) \
|
||||
IS_RREG_IN(reg) \
|
||||
IS_RREG_CLOB(clob)
|
||||
#define MOV_TO_IIP(reg, clob) \
|
||||
IS_RREG_IN(reg) \
|
||||
IS_RREG_CLOB(clob)
|
||||
#define MOV_TO_KR(kr, reg, clob0, clob1) \
|
||||
IS_RREG_IN(reg) \
|
||||
IS_RREG_CLOB(clob0) \
|
||||
IS_RREG_CLOB(clob1)
|
||||
#define ITC_I(pred, reg, clob) \
|
||||
IS_PRED_IN(pred) \
|
||||
IS_RREG_IN(reg) \
|
||||
IS_RREG_CLOB(clob)
|
||||
#define ITC_D(pred, reg, clob) \
|
||||
IS_PRED_IN(pred) \
|
||||
IS_RREG_IN(reg) \
|
||||
IS_RREG_CLOB(clob)
|
||||
#define ITC_I_AND_D(pred_i, pred_d, reg, clob) \
|
||||
IS_PRED_IN(pred_i) \
|
||||
IS_PRED_IN(pred_d) \
|
||||
IS_RREG_IN(reg) \
|
||||
IS_RREG_CLOB(clob)
|
||||
#define THASH(pred, reg0, reg1, clob) \
|
||||
IS_PRED_IN(pred) \
|
||||
IS_RREG_OUT(reg0) \
|
||||
IS_RREG_IN(reg1) \
|
||||
IS_RREG_CLOB(clob)
|
||||
#define SSM_PSR_IC_AND_DEFAULT_BITS_AND_SRLZ_I(clob0, clob1) \
|
||||
IS_RREG_CLOB(clob0) \
|
||||
IS_RREG_CLOB(clob1)
|
||||
#define SSM_PSR_IC_AND_SRLZ_D(clob0, clob1) \
|
||||
IS_RREG_CLOB(clob0) \
|
||||
IS_RREG_CLOB(clob1)
|
||||
#define RSM_PSR_IC(clob) \
|
||||
IS_RREG_CLOB(clob)
|
||||
#define SSM_PSR_I(pred, pred_clob, clob) \
|
||||
IS_PRED_IN(pred) \
|
||||
IS_PRED_CLOB(pred_clob) \
|
||||
IS_RREG_CLOB(clob)
|
||||
#define RSM_PSR_I(pred, clob0, clob1) \
|
||||
IS_PRED_IN(pred) \
|
||||
IS_RREG_CLOB(clob0) \
|
||||
IS_RREG_CLOB(clob1)
|
||||
#define RSM_PSR_I_IC(clob0, clob1, clob2) \
|
||||
IS_RREG_CLOB(clob0) \
|
||||
IS_RREG_CLOB(clob1) \
|
||||
IS_RREG_CLOB(clob2)
|
||||
#define RSM_PSR_DT \
|
||||
nop 0
|
||||
#define SSM_PSR_DT_AND_SRLZ_I \
|
||||
nop 0
|
||||
#define BSW_0(clob0, clob1, clob2) \
|
||||
IS_RREG_CLOB(clob0) \
|
||||
IS_RREG_CLOB(clob1) \
|
||||
IS_RREG_CLOB(clob2)
|
||||
#define BSW_1(clob0, clob1) \
|
||||
IS_RREG_CLOB(clob0) \
|
||||
IS_RREG_CLOB(clob1)
|
||||
#define COVER \
|
||||
nop 0
|
||||
#define RFI \
|
||||
br.ret.sptk.many rp /* defining nop causes dependency error */
|
||||
|
||||
#endif /* _ASM_NATIVE_PVCHK_INST_H */
|
||||
@@ -117,7 +117,7 @@ static inline void paravirt_post_smp_prepare_boot_cpu(void)
|
||||
struct pv_iosapic_ops {
|
||||
void (*pcat_compat_init)(void);
|
||||
|
||||
struct irq_chip *(*get_irq_chip)(unsigned long trigger);
|
||||
struct irq_chip *(*__get_irq_chip)(unsigned long trigger);
|
||||
|
||||
unsigned int (*__read)(char __iomem *iosapic, unsigned int reg);
|
||||
void (*__write)(char __iomem *iosapic, unsigned int reg, u32 val);
|
||||
@@ -135,7 +135,7 @@ iosapic_pcat_compat_init(void)
|
||||
static inline struct irq_chip*
|
||||
iosapic_get_irq_chip(unsigned long trigger)
|
||||
{
|
||||
return pv_iosapic_ops.get_irq_chip(trigger);
|
||||
return pv_iosapic_ops.__get_irq_chip(trigger);
|
||||
}
|
||||
|
||||
static inline unsigned int
|
||||
|
||||
48
arch/ia64/include/asm/pvclock-abi.h
Normal file
48
arch/ia64/include/asm/pvclock-abi.h
Normal file
@@ -0,0 +1,48 @@
|
||||
/*
|
||||
* same structure to x86's
|
||||
* Hopefully asm-x86/pvclock-abi.h would be moved to somewhere more generic.
|
||||
* For now, define same duplicated definitions.
|
||||
*/
|
||||
|
||||
#ifndef _ASM_IA64__PVCLOCK_ABI_H
|
||||
#define _ASM_IA64__PVCLOCK_ABI_H
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
/*
|
||||
* These structs MUST NOT be changed.
|
||||
* They are the ABI between hypervisor and guest OS.
|
||||
* Both Xen and KVM are using this.
|
||||
*
|
||||
* pvclock_vcpu_time_info holds the system time and the tsc timestamp
|
||||
* of the last update. So the guest can use the tsc delta to get a
|
||||
* more precise system time. There is one per virtual cpu.
|
||||
*
|
||||
* pvclock_wall_clock references the point in time when the system
|
||||
* time was zero (usually boot time), thus the guest calculates the
|
||||
* current wall clock by adding the system time.
|
||||
*
|
||||
* Protocol for the "version" fields is: hypervisor raises it (making
|
||||
* it uneven) before it starts updating the fields and raises it again
|
||||
* (making it even) when it is done. Thus the guest can make sure the
|
||||
* time values it got are consistent by checking the version before
|
||||
* and after reading them.
|
||||
*/
|
||||
|
||||
struct pvclock_vcpu_time_info {
|
||||
u32 version;
|
||||
u32 pad0;
|
||||
u64 tsc_timestamp;
|
||||
u64 system_time;
|
||||
u32 tsc_to_system_mul;
|
||||
s8 tsc_shift;
|
||||
u8 pad[3];
|
||||
} __attribute__((__packed__)); /* 32 bytes */
|
||||
|
||||
struct pvclock_wall_clock {
|
||||
u32 version;
|
||||
u32 sec;
|
||||
u32 nsec;
|
||||
} __attribute__((__packed__));
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* _ASM_IA64__PVCLOCK_ABI_H */
|
||||
51
arch/ia64/include/asm/sync_bitops.h
Normal file
51
arch/ia64/include/asm/sync_bitops.h
Normal file
@@ -0,0 +1,51 @@
|
||||
#ifndef _ASM_IA64_SYNC_BITOPS_H
|
||||
#define _ASM_IA64_SYNC_BITOPS_H
|
||||
|
||||
/*
|
||||
* Copyright (C) 2008 Isaku Yamahata <yamahata at valinux co jp>
|
||||
*
|
||||
* Based on synch_bitops.h which Dan Magenhaimer wrote.
|
||||
*
|
||||
* bit operations which provide guaranteed strong synchronisation
|
||||
* when communicating with Xen or other guest OSes running on other CPUs.
|
||||
*/
|
||||
|
||||
static inline void sync_set_bit(int nr, volatile void *addr)
|
||||
{
|
||||
set_bit(nr, addr);
|
||||
}
|
||||
|
||||
static inline void sync_clear_bit(int nr, volatile void *addr)
|
||||
{
|
||||
clear_bit(nr, addr);
|
||||
}
|
||||
|
||||
static inline void sync_change_bit(int nr, volatile void *addr)
|
||||
{
|
||||
change_bit(nr, addr);
|
||||
}
|
||||
|
||||
static inline int sync_test_and_set_bit(int nr, volatile void *addr)
|
||||
{
|
||||
return test_and_set_bit(nr, addr);
|
||||
}
|
||||
|
||||
static inline int sync_test_and_clear_bit(int nr, volatile void *addr)
|
||||
{
|
||||
return test_and_clear_bit(nr, addr);
|
||||
}
|
||||
|
||||
static inline int sync_test_and_change_bit(int nr, volatile void *addr)
|
||||
{
|
||||
return test_and_change_bit(nr, addr);
|
||||
}
|
||||
|
||||
static inline int sync_test_bit(int nr, const volatile void *addr)
|
||||
{
|
||||
return test_bit(nr, addr);
|
||||
}
|
||||
|
||||
#define sync_cmpxchg(ptr, old, new) \
|
||||
((__typeof__(*(ptr)))cmpxchg_acq((ptr), (old), (new)))
|
||||
|
||||
#endif /* _ASM_IA64_SYNC_BITOPS_H */
|
||||
@@ -39,4 +39,6 @@ get_cycles (void)
|
||||
return ret;
|
||||
}
|
||||
|
||||
extern void ia64_cpu_local_tick (void);
|
||||
|
||||
#endif /* _ASM_IA64_TIMEX_H */
|
||||
|
||||
50
arch/ia64/include/asm/xen/events.h
Normal file
50
arch/ia64/include/asm/xen/events.h
Normal file
@@ -0,0 +1,50 @@
|
||||
/******************************************************************************
|
||||
* arch/ia64/include/asm/xen/events.h
|
||||
*
|
||||
* Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp>
|
||||
* VA Linux Systems Japan K.K.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
#ifndef _ASM_IA64_XEN_EVENTS_H
|
||||
#define _ASM_IA64_XEN_EVENTS_H
|
||||
|
||||
enum ipi_vector {
|
||||
XEN_RESCHEDULE_VECTOR,
|
||||
XEN_IPI_VECTOR,
|
||||
XEN_CMCP_VECTOR,
|
||||
XEN_CPEP_VECTOR,
|
||||
|
||||
XEN_NR_IPIS,
|
||||
};
|
||||
|
||||
static inline int xen_irqs_disabled(struct pt_regs *regs)
|
||||
{
|
||||
return !(ia64_psr(regs)->i);
|
||||
}
|
||||
|
||||
static inline void xen_do_IRQ(int irq, struct pt_regs *regs)
|
||||
{
|
||||
struct pt_regs *old_regs;
|
||||
old_regs = set_irq_regs(regs);
|
||||
irq_enter();
|
||||
__do_IRQ(irq);
|
||||
irq_exit();
|
||||
set_irq_regs(old_regs);
|
||||
}
|
||||
#define irq_ctx_init(cpu) do { } while (0)
|
||||
|
||||
#endif /* _ASM_IA64_XEN_EVENTS_H */
|
||||
29
arch/ia64/include/asm/xen/grant_table.h
Normal file
29
arch/ia64/include/asm/xen/grant_table.h
Normal file
@@ -0,0 +1,29 @@
|
||||
/******************************************************************************
|
||||
* arch/ia64/include/asm/xen/grant_table.h
|
||||
*
|
||||
* Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp>
|
||||
* VA Linux Systems Japan K.K.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _ASM_IA64_XEN_GRANT_TABLE_H
|
||||
#define _ASM_IA64_XEN_GRANT_TABLE_H
|
||||
|
||||
struct vm_struct *xen_alloc_vm_area(unsigned long size);
|
||||
void xen_free_vm_area(struct vm_struct *area);
|
||||
|
||||
#endif /* _ASM_IA64_XEN_GRANT_TABLE_H */
|
||||
265
arch/ia64/include/asm/xen/hypercall.h
Normal file
265
arch/ia64/include/asm/xen/hypercall.h
Normal file
@@ -0,0 +1,265 @@
|
||||
/******************************************************************************
|
||||
* hypercall.h
|
||||
*
|
||||
* Linux-specific hypervisor handling.
|
||||
*
|
||||
* Copyright (c) 2002-2004, K A Fraser
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* as published by the Free Software Foundation; or, when distributed
|
||||
* separately from the Linux kernel or incorporated into other
|
||||
* software packages, subject to the following license:
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this source file (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy, modify,
|
||||
* merge, publish, distribute, sublicense, and/or sell copies of the Software,
|
||||
* and to permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef _ASM_IA64_XEN_HYPERCALL_H
|
||||
#define _ASM_IA64_XEN_HYPERCALL_H
|
||||
|
||||
#include <xen/interface/xen.h>
|
||||
#include <xen/interface/physdev.h>
|
||||
#include <xen/interface/sched.h>
|
||||
#include <asm/xen/xcom_hcall.h>
|
||||
struct xencomm_handle;
|
||||
extern unsigned long __hypercall(unsigned long a1, unsigned long a2,
|
||||
unsigned long a3, unsigned long a4,
|
||||
unsigned long a5, unsigned long cmd);
|
||||
|
||||
/*
|
||||
* Assembler stubs for hyper-calls.
|
||||
*/
|
||||
|
||||
#define _hypercall0(type, name) \
|
||||
({ \
|
||||
long __res; \
|
||||
__res = __hypercall(0, 0, 0, 0, 0, __HYPERVISOR_##name);\
|
||||
(type)__res; \
|
||||
})
|
||||
|
||||
#define _hypercall1(type, name, a1) \
|
||||
({ \
|
||||
long __res; \
|
||||
__res = __hypercall((unsigned long)a1, \
|
||||
0, 0, 0, 0, __HYPERVISOR_##name); \
|
||||
(type)__res; \
|
||||
})
|
||||
|
||||
#define _hypercall2(type, name, a1, a2) \
|
||||
({ \
|
||||
long __res; \
|
||||
__res = __hypercall((unsigned long)a1, \
|
||||
(unsigned long)a2, \
|
||||
0, 0, 0, __HYPERVISOR_##name); \
|
||||
(type)__res; \
|
||||
})
|
||||
|
||||
#define _hypercall3(type, name, a1, a2, a3) \
|
||||
({ \
|
||||
long __res; \
|
||||
__res = __hypercall((unsigned long)a1, \
|
||||
(unsigned long)a2, \
|
||||
(unsigned long)a3, \
|
||||
0, 0, __HYPERVISOR_##name); \
|
||||
(type)__res; \
|
||||
})
|
||||
|
||||
#define _hypercall4(type, name, a1, a2, a3, a4) \
|
||||
({ \
|
||||
long __res; \
|
||||
__res = __hypercall((unsigned long)a1, \
|
||||
(unsigned long)a2, \
|
||||
(unsigned long)a3, \
|
||||
(unsigned long)a4, \
|
||||
0, __HYPERVISOR_##name); \
|
||||
(type)__res; \
|
||||
})
|
||||
|
||||
#define _hypercall5(type, name, a1, a2, a3, a4, a5) \
|
||||
({ \
|
||||
long __res; \
|
||||
__res = __hypercall((unsigned long)a1, \
|
||||
(unsigned long)a2, \
|
||||
(unsigned long)a3, \
|
||||
(unsigned long)a4, \
|
||||
(unsigned long)a5, \
|
||||
__HYPERVISOR_##name); \
|
||||
(type)__res; \
|
||||
})
|
||||
|
||||
|
||||
static inline int
|
||||
xencomm_arch_hypercall_sched_op(int cmd, struct xencomm_handle *arg)
|
||||
{
|
||||
return _hypercall2(int, sched_op_new, cmd, arg);
|
||||
}
|
||||
|
||||
static inline long
|
||||
HYPERVISOR_set_timer_op(u64 timeout)
|
||||
{
|
||||
unsigned long timeout_hi = (unsigned long)(timeout >> 32);
|
||||
unsigned long timeout_lo = (unsigned long)timeout;
|
||||
return _hypercall2(long, set_timer_op, timeout_lo, timeout_hi);
|
||||
}
|
||||
|
||||
static inline int
|
||||
xencomm_arch_hypercall_multicall(struct xencomm_handle *call_list,
|
||||
int nr_calls)
|
||||
{
|
||||
return _hypercall2(int, multicall, call_list, nr_calls);
|
||||
}
|
||||
|
||||
static inline int
|
||||
xencomm_arch_hypercall_memory_op(unsigned int cmd, struct xencomm_handle *arg)
|
||||
{
|
||||
return _hypercall2(int, memory_op, cmd, arg);
|
||||
}
|
||||
|
||||
static inline int
|
||||
xencomm_arch_hypercall_event_channel_op(int cmd, struct xencomm_handle *arg)
|
||||
{
|
||||
return _hypercall2(int, event_channel_op, cmd, arg);
|
||||
}
|
||||
|
||||
static inline int
|
||||
xencomm_arch_hypercall_xen_version(int cmd, struct xencomm_handle *arg)
|
||||
{
|
||||
return _hypercall2(int, xen_version, cmd, arg);
|
||||
}
|
||||
|
||||
static inline int
|
||||
xencomm_arch_hypercall_console_io(int cmd, int count,
|
||||
struct xencomm_handle *str)
|
||||
{
|
||||
return _hypercall3(int, console_io, cmd, count, str);
|
||||
}
|
||||
|
||||
static inline int
|
||||
xencomm_arch_hypercall_physdev_op(int cmd, struct xencomm_handle *arg)
|
||||
{
|
||||
return _hypercall2(int, physdev_op, cmd, arg);
|
||||
}
|
||||
|
||||
static inline int
|
||||
xencomm_arch_hypercall_grant_table_op(unsigned int cmd,
|
||||
struct xencomm_handle *uop,
|
||||
unsigned int count)
|
||||
{
|
||||
return _hypercall3(int, grant_table_op, cmd, uop, count);
|
||||
}
|
||||
|
||||
int HYPERVISOR_grant_table_op(unsigned int cmd, void *uop, unsigned int count);
|
||||
|
||||
extern int xencomm_arch_hypercall_suspend(struct xencomm_handle *arg);
|
||||
|
||||
static inline int
|
||||
xencomm_arch_hypercall_callback_op(int cmd, struct xencomm_handle *arg)
|
||||
{
|
||||
return _hypercall2(int, callback_op, cmd, arg);
|
||||
}
|
||||
|
||||
static inline long
|
||||
xencomm_arch_hypercall_vcpu_op(int cmd, int cpu, void *arg)
|
||||
{
|
||||
return _hypercall3(long, vcpu_op, cmd, cpu, arg);
|
||||
}
|
||||
|
||||
static inline int
|
||||
HYPERVISOR_physdev_op(int cmd, void *arg)
|
||||
{
|
||||
switch (cmd) {
|
||||
case PHYSDEVOP_eoi:
|
||||
return _hypercall1(int, ia64_fast_eoi,
|
||||
((struct physdev_eoi *)arg)->irq);
|
||||
default:
|
||||
return xencomm_hypercall_physdev_op(cmd, arg);
|
||||
}
|
||||
}
|
||||
|
||||
static inline long
|
||||
xencomm_arch_hypercall_opt_feature(struct xencomm_handle *arg)
|
||||
{
|
||||
return _hypercall1(long, opt_feature, arg);
|
||||
}
|
||||
|
||||
/* for balloon driver */
|
||||
#define HYPERVISOR_update_va_mapping(va, new_val, flags) (0)
|
||||
|
||||
/* Use xencomm to do hypercalls. */
|
||||
#define HYPERVISOR_sched_op xencomm_hypercall_sched_op
|
||||
#define HYPERVISOR_event_channel_op xencomm_hypercall_event_channel_op
|
||||
#define HYPERVISOR_callback_op xencomm_hypercall_callback_op
|
||||
#define HYPERVISOR_multicall xencomm_hypercall_multicall
|
||||
#define HYPERVISOR_xen_version xencomm_hypercall_xen_version
|
||||
#define HYPERVISOR_console_io xencomm_hypercall_console_io
|
||||
#define HYPERVISOR_memory_op xencomm_hypercall_memory_op
|
||||
#define HYPERVISOR_suspend xencomm_hypercall_suspend
|
||||
#define HYPERVISOR_vcpu_op xencomm_hypercall_vcpu_op
|
||||
#define HYPERVISOR_opt_feature xencomm_hypercall_opt_feature
|
||||
|
||||
/* to compile gnttab_copy_grant_page() in drivers/xen/core/gnttab.c */
|
||||
#define HYPERVISOR_mmu_update(req, count, success_count, domid) ({ BUG(); 0; })
|
||||
|
||||
static inline int
|
||||
HYPERVISOR_shutdown(
|
||||
unsigned int reason)
|
||||
{
|
||||
struct sched_shutdown sched_shutdown = {
|
||||
.reason = reason
|
||||
};
|
||||
|
||||
int rc = HYPERVISOR_sched_op(SCHEDOP_shutdown, &sched_shutdown);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* for netfront.c, netback.c */
|
||||
#define MULTI_UVMFLAGS_INDEX 0 /* XXX any value */
|
||||
|
||||
static inline void
|
||||
MULTI_update_va_mapping(
|
||||
struct multicall_entry *mcl, unsigned long va,
|
||||
pte_t new_val, unsigned long flags)
|
||||
{
|
||||
mcl->op = __HYPERVISOR_update_va_mapping;
|
||||
mcl->result = 0;
|
||||
}
|
||||
|
||||
static inline void
|
||||
MULTI_grant_table_op(struct multicall_entry *mcl, unsigned int cmd,
|
||||
void *uop, unsigned int count)
|
||||
{
|
||||
mcl->op = __HYPERVISOR_grant_table_op;
|
||||
mcl->args[0] = cmd;
|
||||
mcl->args[1] = (unsigned long)uop;
|
||||
mcl->args[2] = count;
|
||||
}
|
||||
|
||||
static inline void
|
||||
MULTI_mmu_update(struct multicall_entry *mcl, struct mmu_update *req,
|
||||
int count, int *success_count, domid_t domid)
|
||||
{
|
||||
mcl->op = __HYPERVISOR_mmu_update;
|
||||
mcl->args[0] = (unsigned long)req;
|
||||
mcl->args[1] = count;
|
||||
mcl->args[2] = (unsigned long)success_count;
|
||||
mcl->args[3] = domid;
|
||||
}
|
||||
|
||||
#endif /* _ASM_IA64_XEN_HYPERCALL_H */
|
||||
89
arch/ia64/include/asm/xen/hypervisor.h
Normal file
89
arch/ia64/include/asm/xen/hypervisor.h
Normal file
@@ -0,0 +1,89 @@
|
||||
/******************************************************************************
|
||||
* hypervisor.h
|
||||
*
|
||||
* Linux-specific hypervisor handling.
|
||||
*
|
||||
* Copyright (c) 2002-2004, K A Fraser
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* as published by the Free Software Foundation; or, when distributed
|
||||
* separately from the Linux kernel or incorporated into other
|
||||
* software packages, subject to the following license:
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this source file (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy, modify,
|
||||
* merge, publish, distribute, sublicense, and/or sell copies of the Software,
|
||||
* and to permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef _ASM_IA64_XEN_HYPERVISOR_H
|
||||
#define _ASM_IA64_XEN_HYPERVISOR_H
|
||||
|
||||
#ifdef CONFIG_XEN
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <xen/interface/xen.h>
|
||||
#include <xen/interface/version.h> /* to compile feature.c */
|
||||
#include <xen/features.h> /* to comiple xen-netfront.c */
|
||||
#include <asm/xen/hypercall.h>
|
||||
|
||||
/* xen_domain_type is set before executing any C code by early_xen_setup */
|
||||
enum xen_domain_type {
|
||||
XEN_NATIVE,
|
||||
XEN_PV_DOMAIN,
|
||||
XEN_HVM_DOMAIN,
|
||||
};
|
||||
|
||||
extern enum xen_domain_type xen_domain_type;
|
||||
|
||||
#define xen_domain() (xen_domain_type != XEN_NATIVE)
|
||||
#define xen_pv_domain() (xen_domain_type == XEN_PV_DOMAIN)
|
||||
#define xen_initial_domain() (xen_pv_domain() && \
|
||||
(xen_start_info->flags & SIF_INITDOMAIN))
|
||||
#define xen_hvm_domain() (xen_domain_type == XEN_HVM_DOMAIN)
|
||||
|
||||
/* deprecated. remove this */
|
||||
#define is_running_on_xen() (xen_domain_type == XEN_PV_DOMAIN)
|
||||
|
||||
extern struct shared_info *HYPERVISOR_shared_info;
|
||||
extern struct start_info *xen_start_info;
|
||||
|
||||
void __init xen_setup_vcpu_info_placement(void);
|
||||
void force_evtchn_callback(void);
|
||||
|
||||
/* for drivers/xen/balloon/balloon.c */
|
||||
#ifdef CONFIG_XEN_SCRUB_PAGES
|
||||
#define scrub_pages(_p, _n) memset((void *)(_p), 0, (_n) << PAGE_SHIFT)
|
||||
#else
|
||||
#define scrub_pages(_p, _n) ((void)0)
|
||||
#endif
|
||||
|
||||
/* For setup_arch() in arch/ia64/kernel/setup.c */
|
||||
void xen_ia64_enable_opt_feature(void);
|
||||
|
||||
#else /* CONFIG_XEN */
|
||||
|
||||
#define xen_domain() (0)
|
||||
#define xen_pv_domain() (0)
|
||||
#define xen_initial_domain() (0)
|
||||
#define xen_hvm_domain() (0)
|
||||
#define is_running_on_xen() (0) /* deprecated. remove this */
|
||||
#endif
|
||||
|
||||
#define is_initial_xendomain() (0) /* deprecated. remove this */
|
||||
|
||||
#endif /* _ASM_IA64_XEN_HYPERVISOR_H */
|
||||
458
arch/ia64/include/asm/xen/inst.h
Normal file
458
arch/ia64/include/asm/xen/inst.h
Normal file
@@ -0,0 +1,458 @@
|
||||
/******************************************************************************
|
||||
* arch/ia64/include/asm/xen/inst.h
|
||||
*
|
||||
* Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp>
|
||||
* VA Linux Systems Japan K.K.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include <asm/xen/privop.h>
|
||||
|
||||
#define ia64_ivt xen_ivt
|
||||
#define DO_SAVE_MIN XEN_DO_SAVE_MIN
|
||||
|
||||
#define __paravirt_switch_to xen_switch_to
|
||||
#define __paravirt_leave_syscall xen_leave_syscall
|
||||
#define __paravirt_work_processed_syscall xen_work_processed_syscall
|
||||
#define __paravirt_leave_kernel xen_leave_kernel
|
||||
#define __paravirt_pending_syscall_end xen_work_pending_syscall_end
|
||||
#define __paravirt_work_processed_syscall_target \
|
||||
xen_work_processed_syscall
|
||||
|
||||
#define MOV_FROM_IFA(reg) \
|
||||
movl reg = XSI_IFA; \
|
||||
;; \
|
||||
ld8 reg = [reg]
|
||||
|
||||
#define MOV_FROM_ITIR(reg) \
|
||||
movl reg = XSI_ITIR; \
|
||||
;; \
|
||||
ld8 reg = [reg]
|
||||
|
||||
#define MOV_FROM_ISR(reg) \
|
||||
movl reg = XSI_ISR; \
|
||||
;; \
|
||||
ld8 reg = [reg]
|
||||
|
||||
#define MOV_FROM_IHA(reg) \
|
||||
movl reg = XSI_IHA; \
|
||||
;; \
|
||||
ld8 reg = [reg]
|
||||
|
||||
#define MOV_FROM_IPSR(pred, reg) \
|
||||
(pred) movl reg = XSI_IPSR; \
|
||||
;; \
|
||||
(pred) ld8 reg = [reg]
|
||||
|
||||
#define MOV_FROM_IIM(reg) \
|
||||
movl reg = XSI_IIM; \
|
||||
;; \
|
||||
ld8 reg = [reg]
|
||||
|
||||
#define MOV_FROM_IIP(reg) \
|
||||
movl reg = XSI_IIP; \
|
||||
;; \
|
||||
ld8 reg = [reg]
|
||||
|
||||
.macro __MOV_FROM_IVR reg, clob
|
||||
.ifc "\reg", "r8"
|
||||
XEN_HYPER_GET_IVR
|
||||
.exitm
|
||||
.endif
|
||||
.ifc "\clob", "r8"
|
||||
XEN_HYPER_GET_IVR
|
||||
;;
|
||||
mov \reg = r8
|
||||
.exitm
|
||||
.endif
|
||||
|
||||
mov \clob = r8
|
||||
;;
|
||||
XEN_HYPER_GET_IVR
|
||||
;;
|
||||
mov \reg = r8
|
||||
;;
|
||||
mov r8 = \clob
|
||||
.endm
|
||||
#define MOV_FROM_IVR(reg, clob) __MOV_FROM_IVR reg, clob
|
||||
|
||||
.macro __MOV_FROM_PSR pred, reg, clob
|
||||
.ifc "\reg", "r8"
|
||||
(\pred) XEN_HYPER_GET_PSR;
|
||||
.exitm
|
||||
.endif
|
||||
.ifc "\clob", "r8"
|
||||
(\pred) XEN_HYPER_GET_PSR
|
||||
;;
|
||||
(\pred) mov \reg = r8
|
||||
.exitm
|
||||
.endif
|
||||
|
||||
(\pred) mov \clob = r8
|
||||
(\pred) XEN_HYPER_GET_PSR
|
||||
;;
|
||||
(\pred) mov \reg = r8
|
||||
(\pred) mov r8 = \clob
|
||||
.endm
|
||||
#define MOV_FROM_PSR(pred, reg, clob) __MOV_FROM_PSR pred, reg, clob
|
||||
|
||||
|
||||
#define MOV_TO_IFA(reg, clob) \
|
||||
movl clob = XSI_IFA; \
|
||||
;; \
|
||||
st8 [clob] = reg \
|
||||
|
||||
#define MOV_TO_ITIR(pred, reg, clob) \
|
||||
(pred) movl clob = XSI_ITIR; \
|
||||
;; \
|
||||
(pred) st8 [clob] = reg
|
||||
|
||||
#define MOV_TO_IHA(pred, reg, clob) \
|
||||
(pred) movl clob = XSI_IHA; \
|
||||
;; \
|
||||
(pred) st8 [clob] = reg
|
||||
|
||||
#define MOV_TO_IPSR(pred, reg, clob) \
|
||||
(pred) movl clob = XSI_IPSR; \
|
||||
;; \
|
||||
(pred) st8 [clob] = reg; \
|
||||
;;
|
||||
|
||||
#define MOV_TO_IFS(pred, reg, clob) \
|
||||
(pred) movl clob = XSI_IFS; \
|
||||
;; \
|
||||
(pred) st8 [clob] = reg; \
|
||||
;;
|
||||
|
||||
#define MOV_TO_IIP(reg, clob) \
|
||||
movl clob = XSI_IIP; \
|
||||
;; \
|
||||
st8 [clob] = reg
|
||||
|
||||
.macro ____MOV_TO_KR kr, reg, clob0, clob1
|
||||
.ifc "\clob0", "r9"
|
||||
.error "clob0 \clob0 must not be r9"
|
||||
.endif
|
||||
.ifc "\clob1", "r8"
|
||||
.error "clob1 \clob1 must not be r8"
|
||||
.endif
|
||||
|
||||
.ifnc "\reg", "r9"
|
||||
.ifnc "\clob1", "r9"
|
||||
mov \clob1 = r9
|
||||
.endif
|
||||
mov r9 = \reg
|
||||
.endif
|
||||
.ifnc "\clob0", "r8"
|
||||
mov \clob0 = r8
|
||||
.endif
|
||||
mov r8 = \kr
|
||||
;;
|
||||
XEN_HYPER_SET_KR
|
||||
|
||||
.ifnc "\reg", "r9"
|
||||
.ifnc "\clob1", "r9"
|
||||
mov r9 = \clob1
|
||||
.endif
|
||||
.endif
|
||||
.ifnc "\clob0", "r8"
|
||||
mov r8 = \clob0
|
||||
.endif
|
||||
.endm
|
||||
|
||||
.macro __MOV_TO_KR kr, reg, clob0, clob1
|
||||
.ifc "\clob0", "r9"
|
||||
____MOV_TO_KR \kr, \reg, \clob1, \clob0
|
||||
.exitm
|
||||
.endif
|
||||
.ifc "\clob1", "r8"
|
||||
____MOV_TO_KR \kr, \reg, \clob1, \clob0
|
||||
.exitm
|
||||
.endif
|
||||
|
||||
____MOV_TO_KR \kr, \reg, \clob0, \clob1
|
||||
.endm
|
||||
|
||||
#define MOV_TO_KR(kr, reg, clob0, clob1) \
|
||||
__MOV_TO_KR IA64_KR_ ## kr, reg, clob0, clob1
|
||||
|
||||
|
||||
.macro __ITC_I pred, reg, clob
|
||||
.ifc "\reg", "r8"
|
||||
(\pred) XEN_HYPER_ITC_I
|
||||
.exitm
|
||||
.endif
|
||||
.ifc "\clob", "r8"
|
||||
(\pred) mov r8 = \reg
|
||||
;;
|
||||
(\pred) XEN_HYPER_ITC_I
|
||||
.exitm
|
||||
.endif
|
||||
|
||||
(\pred) mov \clob = r8
|
||||
(\pred) mov r8 = \reg
|
||||
;;
|
||||
(\pred) XEN_HYPER_ITC_I
|
||||
;;
|
||||
(\pred) mov r8 = \clob
|
||||
;;
|
||||
.endm
|
||||
#define ITC_I(pred, reg, clob) __ITC_I pred, reg, clob
|
||||
|
||||
.macro __ITC_D pred, reg, clob
|
||||
.ifc "\reg", "r8"
|
||||
(\pred) XEN_HYPER_ITC_D
|
||||
;;
|
||||
.exitm
|
||||
.endif
|
||||
.ifc "\clob", "r8"
|
||||
(\pred) mov r8 = \reg
|
||||
;;
|
||||
(\pred) XEN_HYPER_ITC_D
|
||||
;;
|
||||
.exitm
|
||||
.endif
|
||||
|
||||
(\pred) mov \clob = r8
|
||||
(\pred) mov r8 = \reg
|
||||
;;
|
||||
(\pred) XEN_HYPER_ITC_D
|
||||
;;
|
||||
(\pred) mov r8 = \clob
|
||||
;;
|
||||
.endm
|
||||
#define ITC_D(pred, reg, clob) __ITC_D pred, reg, clob
|
||||
|
||||
.macro __ITC_I_AND_D pred_i, pred_d, reg, clob
|
||||
.ifc "\reg", "r8"
|
||||
(\pred_i)XEN_HYPER_ITC_I
|
||||
;;
|
||||
(\pred_d)XEN_HYPER_ITC_D
|
||||
;;
|
||||
.exitm
|
||||
.endif
|
||||
.ifc "\clob", "r8"
|
||||
mov r8 = \reg
|
||||
;;
|
||||
(\pred_i)XEN_HYPER_ITC_I
|
||||
;;
|
||||
(\pred_d)XEN_HYPER_ITC_D
|
||||
;;
|
||||
.exitm
|
||||
.endif
|
||||
|
||||
mov \clob = r8
|
||||
mov r8 = \reg
|
||||
;;
|
||||
(\pred_i)XEN_HYPER_ITC_I
|
||||
;;
|
||||
(\pred_d)XEN_HYPER_ITC_D
|
||||
;;
|
||||
mov r8 = \clob
|
||||
;;
|
||||
.endm
|
||||
#define ITC_I_AND_D(pred_i, pred_d, reg, clob) \
|
||||
__ITC_I_AND_D pred_i, pred_d, reg, clob
|
||||
|
||||
.macro __THASH pred, reg0, reg1, clob
|
||||
.ifc "\reg0", "r8"
|
||||
(\pred) mov r8 = \reg1
|
||||
(\pred) XEN_HYPER_THASH
|
||||
.exitm
|
||||
.endc
|
||||
.ifc "\reg1", "r8"
|
||||
(\pred) XEN_HYPER_THASH
|
||||
;;
|
||||
(\pred) mov \reg0 = r8
|
||||
;;
|
||||
.exitm
|
||||
.endif
|
||||
.ifc "\clob", "r8"
|
||||
(\pred) mov r8 = \reg1
|
||||
(\pred) XEN_HYPER_THASH
|
||||
;;
|
||||
(\pred) mov \reg0 = r8
|
||||
;;
|
||||
.exitm
|
||||
.endif
|
||||
|
||||
(\pred) mov \clob = r8
|
||||
(\pred) mov r8 = \reg1
|
||||
(\pred) XEN_HYPER_THASH
|
||||
;;
|
||||
(\pred) mov \reg0 = r8
|
||||
(\pred) mov r8 = \clob
|
||||
;;
|
||||
.endm
|
||||
#define THASH(pred, reg0, reg1, clob) __THASH pred, reg0, reg1, clob
|
||||
|
||||
#define SSM_PSR_IC_AND_DEFAULT_BITS_AND_SRLZ_I(clob0, clob1) \
|
||||
mov clob0 = 1; \
|
||||
movl clob1 = XSI_PSR_IC; \
|
||||
;; \
|
||||
st4 [clob1] = clob0 \
|
||||
;;
|
||||
|
||||
#define SSM_PSR_IC_AND_SRLZ_D(clob0, clob1) \
|
||||
;; \
|
||||
srlz.d; \
|
||||
mov clob1 = 1; \
|
||||
movl clob0 = XSI_PSR_IC; \
|
||||
;; \
|
||||
st4 [clob0] = clob1
|
||||
|
||||
#define RSM_PSR_IC(clob) \
|
||||
movl clob = XSI_PSR_IC; \
|
||||
;; \
|
||||
st4 [clob] = r0; \
|
||||
;;
|
||||
|
||||
/* pred will be clobbered */
|
||||
#define MASK_TO_PEND_OFS (-1)
|
||||
#define SSM_PSR_I(pred, pred_clob, clob) \
|
||||
(pred) movl clob = XSI_PSR_I_ADDR \
|
||||
;; \
|
||||
(pred) ld8 clob = [clob] \
|
||||
;; \
|
||||
/* if (pred) vpsr.i = 1 */ \
|
||||
/* if (pred) (vcpu->vcpu_info->evtchn_upcall_mask)=0 */ \
|
||||
(pred) st1 [clob] = r0, MASK_TO_PEND_OFS \
|
||||
;; \
|
||||
/* if (vcpu->vcpu_info->evtchn_upcall_pending) */ \
|
||||
(pred) ld1 clob = [clob] \
|
||||
;; \
|
||||
(pred) cmp.ne.unc pred_clob, p0 = clob, r0 \
|
||||
;; \
|
||||
(pred_clob)XEN_HYPER_SSM_I /* do areal ssm psr.i */
|
||||
|
||||
#define RSM_PSR_I(pred, clob0, clob1) \
|
||||
movl clob0 = XSI_PSR_I_ADDR; \
|
||||
mov clob1 = 1; \
|
||||
;; \
|
||||
ld8 clob0 = [clob0]; \
|
||||
;; \
|
||||
(pred) st1 [clob0] = clob1
|
||||
|
||||
#define RSM_PSR_I_IC(clob0, clob1, clob2) \
|
||||
movl clob0 = XSI_PSR_I_ADDR; \
|
||||
movl clob1 = XSI_PSR_IC; \
|
||||
;; \
|
||||
ld8 clob0 = [clob0]; \
|
||||
mov clob2 = 1; \
|
||||
;; \
|
||||
/* note: clears both vpsr.i and vpsr.ic! */ \
|
||||
st1 [clob0] = clob2; \
|
||||
st4 [clob1] = r0; \
|
||||
;;
|
||||
|
||||
#define RSM_PSR_DT \
|
||||
XEN_HYPER_RSM_PSR_DT
|
||||
|
||||
#define SSM_PSR_DT_AND_SRLZ_I \
|
||||
XEN_HYPER_SSM_PSR_DT
|
||||
|
||||
#define BSW_0(clob0, clob1, clob2) \
|
||||
;; \
|
||||
/* r16-r31 all now hold bank1 values */ \
|
||||
mov clob2 = ar.unat; \
|
||||
movl clob0 = XSI_BANK1_R16; \
|
||||
movl clob1 = XSI_BANK1_R16 + 8; \
|
||||
;; \
|
||||
.mem.offset 0, 0; st8.spill [clob0] = r16, 16; \
|
||||
.mem.offset 8, 0; st8.spill [clob1] = r17, 16; \
|
||||
;; \
|
||||
.mem.offset 0, 0; st8.spill [clob0] = r18, 16; \
|
||||
.mem.offset 8, 0; st8.spill [clob1] = r19, 16; \
|
||||
;; \
|
||||
.mem.offset 0, 0; st8.spill [clob0] = r20, 16; \
|
||||
.mem.offset 8, 0; st8.spill [clob1] = r21, 16; \
|
||||
;; \
|
||||
.mem.offset 0, 0; st8.spill [clob0] = r22, 16; \
|
||||
.mem.offset 8, 0; st8.spill [clob1] = r23, 16; \
|
||||
;; \
|
||||
.mem.offset 0, 0; st8.spill [clob0] = r24, 16; \
|
||||
.mem.offset 8, 0; st8.spill [clob1] = r25, 16; \
|
||||
;; \
|
||||
.mem.offset 0, 0; st8.spill [clob0] = r26, 16; \
|
||||
.mem.offset 8, 0; st8.spill [clob1] = r27, 16; \
|
||||
;; \
|
||||
.mem.offset 0, 0; st8.spill [clob0] = r28, 16; \
|
||||
.mem.offset 8, 0; st8.spill [clob1] = r29, 16; \
|
||||
;; \
|
||||
.mem.offset 0, 0; st8.spill [clob0] = r30, 16; \
|
||||
.mem.offset 8, 0; st8.spill [clob1] = r31, 16; \
|
||||
;; \
|
||||
mov clob1 = ar.unat; \
|
||||
movl clob0 = XSI_B1NAT; \
|
||||
;; \
|
||||
st8 [clob0] = clob1; \
|
||||
mov ar.unat = clob2; \
|
||||
movl clob0 = XSI_BANKNUM; \
|
||||
;; \
|
||||
st4 [clob0] = r0
|
||||
|
||||
|
||||
/* FIXME: THIS CODE IS NOT NaT SAFE! */
|
||||
#define XEN_BSW_1(clob) \
|
||||
mov clob = ar.unat; \
|
||||
movl r30 = XSI_B1NAT; \
|
||||
;; \
|
||||
ld8 r30 = [r30]; \
|
||||
mov r31 = 1; \
|
||||
;; \
|
||||
mov ar.unat = r30; \
|
||||
movl r30 = XSI_BANKNUM; \
|
||||
;; \
|
||||
st4 [r30] = r31; \
|
||||
movl r30 = XSI_BANK1_R16; \
|
||||
movl r31 = XSI_BANK1_R16+8; \
|
||||
;; \
|
||||
ld8.fill r16 = [r30], 16; \
|
||||
ld8.fill r17 = [r31], 16; \
|
||||
;; \
|
||||
ld8.fill r18 = [r30], 16; \
|
||||
ld8.fill r19 = [r31], 16; \
|
||||
;; \
|
||||
ld8.fill r20 = [r30], 16; \
|
||||
ld8.fill r21 = [r31], 16; \
|
||||
;; \
|
||||
ld8.fill r22 = [r30], 16; \
|
||||
ld8.fill r23 = [r31], 16; \
|
||||
;; \
|
||||
ld8.fill r24 = [r30], 16; \
|
||||
ld8.fill r25 = [r31], 16; \
|
||||
;; \
|
||||
ld8.fill r26 = [r30], 16; \
|
||||
ld8.fill r27 = [r31], 16; \
|
||||
;; \
|
||||
ld8.fill r28 = [r30], 16; \
|
||||
ld8.fill r29 = [r31], 16; \
|
||||
;; \
|
||||
ld8.fill r30 = [r30]; \
|
||||
ld8.fill r31 = [r31]; \
|
||||
;; \
|
||||
mov ar.unat = clob
|
||||
|
||||
#define BSW_1(clob0, clob1) XEN_BSW_1(clob1)
|
||||
|
||||
|
||||
#define COVER \
|
||||
XEN_HYPER_COVER
|
||||
|
||||
#define RFI \
|
||||
XEN_HYPER_RFI; \
|
||||
dv_serialize_data
|
||||
346
arch/ia64/include/asm/xen/interface.h
Normal file
346
arch/ia64/include/asm/xen/interface.h
Normal file
@@ -0,0 +1,346 @@
|
||||
/******************************************************************************
|
||||
* arch-ia64/hypervisor-if.h
|
||||
*
|
||||
* Guest OS interface to IA64 Xen.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Copyright by those who contributed. (in alphabetical order)
|
||||
*
|
||||
* Anthony Xu <anthony.xu@intel.com>
|
||||
* Eddie Dong <eddie.dong@intel.com>
|
||||
* Fred Yang <fred.yang@intel.com>
|
||||
* Kevin Tian <kevin.tian@intel.com>
|
||||
* Alex Williamson <alex.williamson@hp.com>
|
||||
* Chris Wright <chrisw@sous-sol.org>
|
||||
* Christian Limpach <Christian.Limpach@cl.cam.ac.uk>
|
||||
* Dietmar Hahn <dietmar.hahn@fujitsu-siemens.com>
|
||||
* Hollis Blanchard <hollisb@us.ibm.com>
|
||||
* Isaku Yamahata <yamahata@valinux.co.jp>
|
||||
* Jan Beulich <jbeulich@novell.com>
|
||||
* John Levon <john.levon@sun.com>
|
||||
* Kazuhiro Suzuki <kaz@jp.fujitsu.com>
|
||||
* Keir Fraser <keir.fraser@citrix.com>
|
||||
* Kouya Shimura <kouya@jp.fujitsu.com>
|
||||
* Masaki Kanno <kanno.masaki@jp.fujitsu.com>
|
||||
* Matt Chapman <matthewc@hp.com>
|
||||
* Matthew Chapman <matthewc@hp.com>
|
||||
* Samuel Thibault <samuel.thibault@eu.citrix.com>
|
||||
* Tomonari Horikoshi <t.horikoshi@jp.fujitsu.com>
|
||||
* Tristan Gingold <tgingold@free.fr>
|
||||
* Tsunehisa Doi <Doi.Tsunehisa@jp.fujitsu.com>
|
||||
* Yutaka Ezaki <yutaka.ezaki@jp.fujitsu.com>
|
||||
* Zhang Xin <xing.z.zhang@intel.com>
|
||||
* Zhang xiantao <xiantao.zhang@intel.com>
|
||||
* dan.magenheimer@hp.com
|
||||
* ian.pratt@cl.cam.ac.uk
|
||||
* michael.fetterman@cl.cam.ac.uk
|
||||
*/
|
||||
|
||||
#ifndef _ASM_IA64_XEN_INTERFACE_H
|
||||
#define _ASM_IA64_XEN_INTERFACE_H
|
||||
|
||||
#define __DEFINE_GUEST_HANDLE(name, type) \
|
||||
typedef struct { type *p; } __guest_handle_ ## name
|
||||
|
||||
#define DEFINE_GUEST_HANDLE_STRUCT(name) \
|
||||
__DEFINE_GUEST_HANDLE(name, struct name)
|
||||
#define DEFINE_GUEST_HANDLE(name) __DEFINE_GUEST_HANDLE(name, name)
|
||||
#define GUEST_HANDLE(name) __guest_handle_ ## name
|
||||
#define GUEST_HANDLE_64(name) GUEST_HANDLE(name)
|
||||
#define set_xen_guest_handle(hnd, val) do { (hnd).p = val; } while (0)
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
/* Guest handles for primitive C types. */
|
||||
__DEFINE_GUEST_HANDLE(uchar, unsigned char);
|
||||
__DEFINE_GUEST_HANDLE(uint, unsigned int);
|
||||
__DEFINE_GUEST_HANDLE(ulong, unsigned long);
|
||||
__DEFINE_GUEST_HANDLE(u64, unsigned long);
|
||||
DEFINE_GUEST_HANDLE(char);
|
||||
DEFINE_GUEST_HANDLE(int);
|
||||
DEFINE_GUEST_HANDLE(long);
|
||||
DEFINE_GUEST_HANDLE(void);
|
||||
|
||||
typedef unsigned long xen_pfn_t;
|
||||
DEFINE_GUEST_HANDLE(xen_pfn_t);
|
||||
#define PRI_xen_pfn "lx"
|
||||
#endif
|
||||
|
||||
/* Arch specific VIRQs definition */
|
||||
#define VIRQ_ITC VIRQ_ARCH_0 /* V. Virtual itc timer */
|
||||
#define VIRQ_MCA_CMC VIRQ_ARCH_1 /* MCA cmc interrupt */
|
||||
#define VIRQ_MCA_CPE VIRQ_ARCH_2 /* MCA cpe interrupt */
|
||||
|
||||
/* Maximum number of virtual CPUs in multi-processor guests. */
|
||||
/* keep sizeof(struct shared_page) <= PAGE_SIZE.
|
||||
* this is checked in arch/ia64/xen/hypervisor.c. */
|
||||
#define MAX_VIRT_CPUS 64
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#define INVALID_MFN (~0UL)
|
||||
|
||||
union vac {
|
||||
unsigned long value;
|
||||
struct {
|
||||
int a_int:1;
|
||||
int a_from_int_cr:1;
|
||||
int a_to_int_cr:1;
|
||||
int a_from_psr:1;
|
||||
int a_from_cpuid:1;
|
||||
int a_cover:1;
|
||||
int a_bsw:1;
|
||||
long reserved:57;
|
||||
};
|
||||
};
|
||||
|
||||
union vdc {
|
||||
unsigned long value;
|
||||
struct {
|
||||
int d_vmsw:1;
|
||||
int d_extint:1;
|
||||
int d_ibr_dbr:1;
|
||||
int d_pmc:1;
|
||||
int d_to_pmd:1;
|
||||
int d_itm:1;
|
||||
long reserved:58;
|
||||
};
|
||||
};
|
||||
|
||||
struct mapped_regs {
|
||||
union vac vac;
|
||||
union vdc vdc;
|
||||
unsigned long virt_env_vaddr;
|
||||
unsigned long reserved1[29];
|
||||
unsigned long vhpi;
|
||||
unsigned long reserved2[95];
|
||||
union {
|
||||
unsigned long vgr[16];
|
||||
unsigned long bank1_regs[16]; /* bank1 regs (r16-r31)
|
||||
when bank0 active */
|
||||
};
|
||||
union {
|
||||
unsigned long vbgr[16];
|
||||
unsigned long bank0_regs[16]; /* bank0 regs (r16-r31)
|
||||
when bank1 active */
|
||||
};
|
||||
unsigned long vnat;
|
||||
unsigned long vbnat;
|
||||
unsigned long vcpuid[5];
|
||||
unsigned long reserved3[11];
|
||||
unsigned long vpsr;
|
||||
unsigned long vpr;
|
||||
unsigned long reserved4[76];
|
||||
union {
|
||||
unsigned long vcr[128];
|
||||
struct {
|
||||
unsigned long dcr; /* CR0 */
|
||||
unsigned long itm;
|
||||
unsigned long iva;
|
||||
unsigned long rsv1[5];
|
||||
unsigned long pta; /* CR8 */
|
||||
unsigned long rsv2[7];
|
||||
unsigned long ipsr; /* CR16 */
|
||||
unsigned long isr;
|
||||
unsigned long rsv3;
|
||||
unsigned long iip;
|
||||
unsigned long ifa;
|
||||
unsigned long itir;
|
||||
unsigned long iipa;
|
||||
unsigned long ifs;
|
||||
unsigned long iim; /* CR24 */
|
||||
unsigned long iha;
|
||||
unsigned long rsv4[38];
|
||||
unsigned long lid; /* CR64 */
|
||||
unsigned long ivr;
|
||||
unsigned long tpr;
|
||||
unsigned long eoi;
|
||||
unsigned long irr[4];
|
||||
unsigned long itv; /* CR72 */
|
||||
unsigned long pmv;
|
||||
unsigned long cmcv;
|
||||
unsigned long rsv5[5];
|
||||
unsigned long lrr0; /* CR80 */
|
||||
unsigned long lrr1;
|
||||
unsigned long rsv6[46];
|
||||
};
|
||||
};
|
||||
union {
|
||||
unsigned long reserved5[128];
|
||||
struct {
|
||||
unsigned long precover_ifs;
|
||||
unsigned long unat; /* not sure if this is needed
|
||||
until NaT arch is done */
|
||||
int interrupt_collection_enabled; /* virtual psr.ic */
|
||||
|
||||
/* virtual interrupt deliverable flag is
|
||||
* evtchn_upcall_mask in shared info area now.
|
||||
* interrupt_mask_addr is the address
|
||||
* of evtchn_upcall_mask for current vcpu
|
||||
*/
|
||||
unsigned char *interrupt_mask_addr;
|
||||
int pending_interruption;
|
||||
unsigned char vpsr_pp;
|
||||
unsigned char vpsr_dfh;
|
||||
unsigned char hpsr_dfh;
|
||||
unsigned char hpsr_mfh;
|
||||
unsigned long reserved5_1[4];
|
||||
int metaphysical_mode; /* 1 = use metaphys mapping
|
||||
0 = use virtual */
|
||||
int banknum; /* 0 or 1, which virtual
|
||||
register bank is active */
|
||||
unsigned long rrs[8]; /* region registers */
|
||||
unsigned long krs[8]; /* kernel registers */
|
||||
unsigned long tmp[16]; /* temp registers
|
||||
(e.g. for hyperprivops) */
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
struct arch_vcpu_info {
|
||||
/* nothing */
|
||||
};
|
||||
|
||||
/*
|
||||
* This structure is used for magic page in domain pseudo physical address
|
||||
* space and the result of XENMEM_machine_memory_map.
|
||||
* As the XENMEM_machine_memory_map result,
|
||||
* xen_memory_map::nr_entries indicates the size in bytes
|
||||
* including struct xen_ia64_memmap_info. Not the number of entries.
|
||||
*/
|
||||
struct xen_ia64_memmap_info {
|
||||
uint64_t efi_memmap_size; /* size of EFI memory map */
|
||||
uint64_t efi_memdesc_size; /* size of an EFI memory map
|
||||
* descriptor */
|
||||
uint32_t efi_memdesc_version; /* memory descriptor version */
|
||||
void *memdesc[0]; /* array of efi_memory_desc_t */
|
||||
};
|
||||
|
||||
struct arch_shared_info {
|
||||
/* PFN of the start_info page. */
|
||||
unsigned long start_info_pfn;
|
||||
|
||||
/* Interrupt vector for event channel. */
|
||||
int evtchn_vector;
|
||||
|
||||
/* PFN of memmap_info page */
|
||||
unsigned int memmap_info_num_pages; /* currently only = 1 case is
|
||||
supported. */
|
||||
unsigned long memmap_info_pfn;
|
||||
|
||||
uint64_t pad[31];
|
||||
};
|
||||
|
||||
struct xen_callback {
|
||||
unsigned long ip;
|
||||
};
|
||||
typedef struct xen_callback xen_callback_t;
|
||||
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
|
||||
/* Size of the shared_info area (this is not related to page size). */
|
||||
#define XSI_SHIFT 14
|
||||
#define XSI_SIZE (1 << XSI_SHIFT)
|
||||
/* Log size of mapped_regs area (64 KB - only 4KB is used). */
|
||||
#define XMAPPEDREGS_SHIFT 12
|
||||
#define XMAPPEDREGS_SIZE (1 << XMAPPEDREGS_SHIFT)
|
||||
/* Offset of XASI (Xen arch shared info) wrt XSI_BASE. */
|
||||
#define XMAPPEDREGS_OFS XSI_SIZE
|
||||
|
||||
/* Hyperprivops. */
|
||||
#define HYPERPRIVOP_START 0x1
|
||||
#define HYPERPRIVOP_RFI (HYPERPRIVOP_START + 0x0)
|
||||
#define HYPERPRIVOP_RSM_DT (HYPERPRIVOP_START + 0x1)
|
||||
#define HYPERPRIVOP_SSM_DT (HYPERPRIVOP_START + 0x2)
|
||||
#define HYPERPRIVOP_COVER (HYPERPRIVOP_START + 0x3)
|
||||
#define HYPERPRIVOP_ITC_D (HYPERPRIVOP_START + 0x4)
|
||||
#define HYPERPRIVOP_ITC_I (HYPERPRIVOP_START + 0x5)
|
||||
#define HYPERPRIVOP_SSM_I (HYPERPRIVOP_START + 0x6)
|
||||
#define HYPERPRIVOP_GET_IVR (HYPERPRIVOP_START + 0x7)
|
||||
#define HYPERPRIVOP_GET_TPR (HYPERPRIVOP_START + 0x8)
|
||||
#define HYPERPRIVOP_SET_TPR (HYPERPRIVOP_START + 0x9)
|
||||
#define HYPERPRIVOP_EOI (HYPERPRIVOP_START + 0xa)
|
||||
#define HYPERPRIVOP_SET_ITM (HYPERPRIVOP_START + 0xb)
|
||||
#define HYPERPRIVOP_THASH (HYPERPRIVOP_START + 0xc)
|
||||
#define HYPERPRIVOP_PTC_GA (HYPERPRIVOP_START + 0xd)
|
||||
#define HYPERPRIVOP_ITR_D (HYPERPRIVOP_START + 0xe)
|
||||
#define HYPERPRIVOP_GET_RR (HYPERPRIVOP_START + 0xf)
|
||||
#define HYPERPRIVOP_SET_RR (HYPERPRIVOP_START + 0x10)
|
||||
#define HYPERPRIVOP_SET_KR (HYPERPRIVOP_START + 0x11)
|
||||
#define HYPERPRIVOP_FC (HYPERPRIVOP_START + 0x12)
|
||||
#define HYPERPRIVOP_GET_CPUID (HYPERPRIVOP_START + 0x13)
|
||||
#define HYPERPRIVOP_GET_PMD (HYPERPRIVOP_START + 0x14)
|
||||
#define HYPERPRIVOP_GET_EFLAG (HYPERPRIVOP_START + 0x15)
|
||||
#define HYPERPRIVOP_SET_EFLAG (HYPERPRIVOP_START + 0x16)
|
||||
#define HYPERPRIVOP_RSM_BE (HYPERPRIVOP_START + 0x17)
|
||||
#define HYPERPRIVOP_GET_PSR (HYPERPRIVOP_START + 0x18)
|
||||
#define HYPERPRIVOP_SET_RR0_TO_RR4 (HYPERPRIVOP_START + 0x19)
|
||||
#define HYPERPRIVOP_MAX (0x1a)
|
||||
|
||||
/* Fast and light hypercalls. */
|
||||
#define __HYPERVISOR_ia64_fast_eoi __HYPERVISOR_arch_1
|
||||
|
||||
/* Xencomm macros. */
|
||||
#define XENCOMM_INLINE_MASK 0xf800000000000000UL
|
||||
#define XENCOMM_INLINE_FLAG 0x8000000000000000UL
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
/*
|
||||
* Optimization features.
|
||||
* The hypervisor may do some special optimizations for guests. This hypercall
|
||||
* can be used to switch on/of these special optimizations.
|
||||
*/
|
||||
#define __HYPERVISOR_opt_feature 0x700UL
|
||||
|
||||
#define XEN_IA64_OPTF_OFF 0x0
|
||||
#define XEN_IA64_OPTF_ON 0x1
|
||||
|
||||
/*
|
||||
* If this feature is switched on, the hypervisor inserts the
|
||||
* tlb entries without calling the guests traphandler.
|
||||
* This is useful in guests using region 7 for identity mapping
|
||||
* like the linux kernel does.
|
||||
*/
|
||||
#define XEN_IA64_OPTF_IDENT_MAP_REG7 1
|
||||
|
||||
/* Identity mapping of region 4 addresses in HVM. */
|
||||
#define XEN_IA64_OPTF_IDENT_MAP_REG4 2
|
||||
|
||||
/* Identity mapping of region 5 addresses in HVM. */
|
||||
#define XEN_IA64_OPTF_IDENT_MAP_REG5 3
|
||||
|
||||
#define XEN_IA64_OPTF_IDENT_MAP_NOT_SET (0)
|
||||
|
||||
struct xen_ia64_opt_feature {
|
||||
unsigned long cmd; /* Which feature */
|
||||
unsigned char on; /* Switch feature on/off */
|
||||
union {
|
||||
struct {
|
||||
/* The page protection bit mask of the pte.
|
||||
* This will be or'ed with the pte. */
|
||||
unsigned long pgprot;
|
||||
unsigned long key; /* A protection key for itir.*/
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#endif /* _ASM_IA64_XEN_INTERFACE_H */
|
||||
44
arch/ia64/include/asm/xen/irq.h
Normal file
44
arch/ia64/include/asm/xen/irq.h
Normal file
@@ -0,0 +1,44 @@
|
||||
/******************************************************************************
|
||||
* arch/ia64/include/asm/xen/irq.h
|
||||
*
|
||||
* Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp>
|
||||
* VA Linux Systems Japan K.K.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _ASM_IA64_XEN_IRQ_H
|
||||
#define _ASM_IA64_XEN_IRQ_H
|
||||
|
||||
/*
|
||||
* The flat IRQ space is divided into two regions:
|
||||
* 1. A one-to-one mapping of real physical IRQs. This space is only used
|
||||
* if we have physical device-access privilege. This region is at the
|
||||
* start of the IRQ space so that existing device drivers do not need
|
||||
* to be modified to translate physical IRQ numbers into our IRQ space.
|
||||
* 3. A dynamic mapping of inter-domain and Xen-sourced virtual IRQs. These
|
||||
* are bound using the provided bind/unbind functions.
|
||||
*/
|
||||
|
||||
#define XEN_PIRQ_BASE 0
|
||||
#define XEN_NR_PIRQS 256
|
||||
|
||||
#define XEN_DYNIRQ_BASE (XEN_PIRQ_BASE + XEN_NR_PIRQS)
|
||||
#define XEN_NR_DYNIRQS (NR_CPUS * 8)
|
||||
|
||||
#define XEN_NR_IRQS (XEN_NR_PIRQS + XEN_NR_DYNIRQS)
|
||||
|
||||
#endif /* _ASM_IA64_XEN_IRQ_H */
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user