# HG changeset patch
# User Alex Williamson <alex.williamson@xxxxxx>
# Date 1199044936 25200
# Node ID 7515dc56c124c01229c98ab4157eb165bfd181f3
# Parent ecdc7b5f650bc02373a720187a14374044b1a191
[IA64] Sort out the XEN_IA64_OPTF_IDENT_MAP_REG[457] constants confusion
Currently the constants are used for two different purpose.
one is for the OPTF hypercall sub command.
another is bit flag for struct opt_feature::mask.
They are different spaces, split them out.
Signed-off-by: Isaku Yamahata <yamahata@xxxxxxxxxxxxx>
---
xen/arch/ia64/vmx/mmio.c | 6 +++---
xen/arch/ia64/vmx/vmx_fault.c | 8 ++++----
xen/arch/ia64/xen/domain.c | 24 ++++++++++++++++++++++--
xen/arch/ia64/xen/vcpu.c | 2 +-
xen/include/asm-ia64/domain.h | 23 +++++++++++++++++++++++
xen/include/public/arch-ia64.h | 14 +++-----------
6 files changed, 56 insertions(+), 21 deletions(-)
diff -r ecdc7b5f650b -r 7515dc56c124 xen/arch/ia64/vmx/mmio.c
--- a/xen/arch/ia64/vmx/mmio.c Sun Dec 30 12:56:16 2007 -0700
+++ b/xen/arch/ia64/vmx/mmio.c Sun Dec 30 13:02:16 2007 -0700
@@ -253,11 +253,11 @@ static int vmx_identity_mappings_save(st
const struct opt_feature *optf = &d->arch.opt_feature;
struct hvm_hw_ia64_identity_mappings im_save;
- __vmx_identity_mapping_save(optf->mask & XEN_IA64_OPTF_IDENT_MAP_REG4,
+ __vmx_identity_mapping_save(optf->mask & XEN_IA64_OPTF_IDENT_MAP_REG4_FLG,
&optf->im_reg4, &im_save.im_reg4);
- __vmx_identity_mapping_save(optf->mask & XEN_IA64_OPTF_IDENT_MAP_REG5,
+ __vmx_identity_mapping_save(optf->mask & XEN_IA64_OPTF_IDENT_MAP_REG5_FLG,
&optf->im_reg5, &im_save.im_reg5);
- __vmx_identity_mapping_save(optf->mask & XEN_IA64_OPTF_IDENT_MAP_REG7,
+ __vmx_identity_mapping_save(optf->mask & XEN_IA64_OPTF_IDENT_MAP_REG7_FLG,
&optf->im_reg7, &im_save.im_reg7);
return hvm_save_entry(OPT_FEATURE_IDENTITY_MAPPINGS, 0, h, &im_save);
diff -r ecdc7b5f650b -r 7515dc56c124 xen/arch/ia64/vmx/vmx_fault.c
--- a/xen/arch/ia64/vmx/vmx_fault.c Sun Dec 30 12:56:16 2007 -0700
+++ b/xen/arch/ia64/vmx/vmx_fault.c Sun Dec 30 13:02:16 2007 -0700
@@ -392,7 +392,7 @@ try_again:
if (!vhpt_enabled(v, vadr, misr.rs ? RSE_REF : DATA_REF)) {
/* windows use region 4 and 5 for identity mapping */
- if ((optf->mask & XEN_IA64_OPTF_IDENT_MAP_REG4) &&
+ if ((optf->mask & XEN_IA64_OPTF_IDENT_MAP_REG4_FLG) &&
REGION_NUMBER(vadr) == 4 && !(regs->cr_ipsr & IA64_PSR_CPL) &&
REGION_OFFSET(vadr) <= _PAGE_PPN_MASK) {
@@ -402,7 +402,7 @@ try_again:
goto try_again;
return IA64_NO_FAULT;
}
- if ((optf->mask & XEN_IA64_OPTF_IDENT_MAP_REG5) &&
+ if ((optf->mask & XEN_IA64_OPTF_IDENT_MAP_REG5_FLG) &&
REGION_NUMBER(vadr) == 5 && !(regs->cr_ipsr & IA64_PSR_CPL) &&
REGION_OFFSET(vadr) <= _PAGE_PPN_MASK) {
@@ -428,8 +428,8 @@ try_again:
}
/* avoid recursively walking (short format) VHPT */
- if (!(optf->mask & XEN_IA64_OPTF_IDENT_MAP_REG4) &&
- !(optf->mask & XEN_IA64_OPTF_IDENT_MAP_REG5) &&
+ if (!(optf->mask & XEN_IA64_OPTF_IDENT_MAP_REG4_FLG) &&
+ !(optf->mask & XEN_IA64_OPTF_IDENT_MAP_REG5_FLG) &&
(((vadr ^ vpta.val) << 3) >> (vpta.size + 3)) == 0) {
goto inject_dtlb_fault;
}
diff -r ecdc7b5f650b -r 7515dc56c124 xen/arch/ia64/xen/domain.c
--- a/xen/arch/ia64/xen/domain.c Sun Dec 30 12:56:16 2007 -0700
+++ b/xen/arch/ia64/xen/domain.c Sun Dec 30 13:02:16 2007 -0700
@@ -2277,16 +2277,36 @@ custom_param("dom0_mem", parse_dom0_mem)
* Helper function for the optimization stuff handling the identity mapping
* feature.
*/
+static inline unsigned long
+optf_identity_mapping_cmd_to_flg(unsigned long cmd)
+{
+ switch(cmd) {
+ case XEN_IA64_OPTF_IDENT_MAP_REG7:
+ return XEN_IA64_OPTF_IDENT_MAP_REG7_FLG;
+ case XEN_IA64_OPTF_IDENT_MAP_REG4:
+ return XEN_IA64_OPTF_IDENT_MAP_REG4_FLG;
+ case XEN_IA64_OPTF_IDENT_MAP_REG5:
+ return XEN_IA64_OPTF_IDENT_MAP_REG5_FLG;
+ default:
+ BUG();
+ return 0;
+ }
+
+ /* NOTREACHED */
+}
+
static inline void
optf_set_identity_mapping(unsigned long* mask, struct identity_mapping* im,
struct xen_ia64_opt_feature* f)
{
+ unsigned long flag = optf_identity_mapping_cmd_to_flg(f->cmd);
+
if (f->on) {
- *mask |= f->cmd;
+ *mask |= flag;
im->pgprot = f->pgprot;
im->key = f->key;
} else {
- *mask &= ~(f->cmd);
+ *mask &= ~flag;
im->pgprot = 0;
im->key = 0;
}
diff -r ecdc7b5f650b -r 7515dc56c124 xen/arch/ia64/xen/vcpu.c
--- a/xen/arch/ia64/xen/vcpu.c Sun Dec 30 12:56:16 2007 -0700
+++ b/xen/arch/ia64/xen/vcpu.c Sun Dec 30 13:02:16 2007 -0700
@@ -1779,7 +1779,7 @@ IA64FAULT vcpu_translate(VCPU * vcpu, u6
struct opt_feature* optf = &(vcpu->domain->arch.opt_feature);
/* Optimization for identity mapped region 7 OS (linux) */
- if (optf->mask & XEN_IA64_OPTF_IDENT_MAP_REG7 &&
+ if (optf->mask & XEN_IA64_OPTF_IDENT_MAP_REG7_FLG &&
region == 7 && ia64_psr(regs)->cpl == CONFIG_CPL0_EMUL) {
pte.val = address & _PAGE_PPN_MASK;
pte.val = pte.val | optf->im_reg7.pgprot;
diff -r ecdc7b5f650b -r 7515dc56c124 xen/include/asm-ia64/domain.h
--- a/xen/include/asm-ia64/domain.h Sun Dec 30 12:56:16 2007 -0700
+++ b/xen/include/asm-ia64/domain.h Sun Dec 30 13:02:16 2007 -0700
@@ -92,6 +92,29 @@ struct identity_mapping {
unsigned long pgprot; /* The page protection bit mask of the pte.*/
unsigned long key; /* A protection key. */
};
+
+/* opt_feature mask */
+/*
+ * 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_FLG_BIT 0
+#define XEN_IA64_OPTF_IDENT_MAP_REG7_FLG \
+ (1UL << XEN_IA64_OPTF_IDENT_MAP_REG7_FLG_BIT)
+
+/* Identity mapping of region 4 addresses in HVM. */
+#define XEN_IA64_OPTF_IDENT_MAP_REG4_FLG_BIT \
+ (XEN_IA64_OPTF_IDENT_MAP_REG7_FLG_BIT + 1)
+#define XEN_IA64_OPTF_IDENT_MAP_REG4_FLG \
+ (1UL << XEN_IA64_OPTF_IDENT_MAP_REG4_FLG_BIT)
+
+/* Identity mapping of region 5 addresses in HVM. */
+#define XEN_IA64_OPTF_IDENT_MAP_REG5_FLG_BIT \
+ (XEN_IA64_OPTF_IDENT_MAP_REG7_FLG_BIT + 2)
+#define XEN_IA64_OPTF_IDENT_MAP_REG5_FLG \
+ (1UL << XEN_IA64_OPTF_IDENT_MAP_REG5_FLG_BIT)
/* Central structure for optimzation features used by the hypervisor. */
struct opt_feature {
diff -r ecdc7b5f650b -r 7515dc56c124 xen/include/public/arch-ia64.h
--- a/xen/include/public/arch-ia64.h Sun Dec 30 12:56:16 2007 -0700
+++ b/xen/include/public/arch-ia64.h Sun Dec 30 13:02:16 2007 -0700
@@ -604,21 +604,13 @@ struct xen_ia64_boot_param {
* This is useful in guests using region 7 for identity mapping
* like the linux kernel does.
*/
-#define XEN_IA64_OPTF_IDENT_MAP_REG7_BIT 0
-#define XEN_IA64_OPTF_IDENT_MAP_REG7 \
- (1UL << XEN_IA64_OPTF_IDENT_MAP_REG7_BIT)
+#define XEN_IA64_OPTF_IDENT_MAP_REG7 1
/* Identity mapping of region 4 addresses in HVM. */
-#define XEN_IA64_OPTF_IDENT_MAP_REG4_BIT \
- (XEN_IA64_OPTF_IDENT_MAP_REG7_BIT + 1)
-#define XEN_IA64_OPTF_IDENT_MAP_REG4 \
- (1UL << XEN_IA64_OPTF_IDENT_MAP_REG4_BIT)
+#define XEN_IA64_OPTF_IDENT_MAP_REG4 2
/* Identity mapping of region 5 addresses in HVM. */
-#define XEN_IA64_OPTF_IDENT_MAP_REG5_BIT \
- (XEN_IA64_OPTF_IDENT_MAP_REG7_BIT + 2)
-#define XEN_IA64_OPTF_IDENT_MAP_REG5 \
- (1UL << XEN_IA64_OPTF_IDENT_MAP_REG5_BIT)
+#define XEN_IA64_OPTF_IDENT_MAP_REG5 3
#define XEN_IA64_OPTF_IDENT_MAP_NOT_SET (0)
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|