Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 197646
b: refs/heads/master
c: 455716f
h: refs/heads/master
v: v3
  • Loading branch information
Joerg Roedel authored and Avi Kivity committed May 17, 2010
1 parent 0a734c0 commit 975e524
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 17 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: d24778265ac9b2602889a5e99c6e7ba777a236df
refs/heads/master: 455716fa941ec7a03c04bd54e1b906698171b15c
53 changes: 37 additions & 16 deletions trunk/arch/x86/kvm/svm.c
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,8 @@ struct vcpu_svm {
unsigned long int3_rip;
};

#define MSR_INVALID 0xffffffffU

/* enable NPT for AMD64 and X86 with PAE */
#if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE)
static bool npt_enabled = true;
Expand Down Expand Up @@ -200,6 +202,27 @@ static u32 msrpm_ranges[] = {0, 0xc0000000, 0xc0010000};
#define MSRS_RANGE_SIZE 2048
#define MSRS_IN_RANGE (MSRS_RANGE_SIZE * 8 / 2)

static u32 svm_msrpm_offset(u32 msr)
{
u32 offset;
int i;

for (i = 0; i < NUM_MSR_MAPS; i++) {
if (msr < msrpm_ranges[i] ||
msr >= msrpm_ranges[i] + MSRS_IN_RANGE)
continue;

offset = (msr - msrpm_ranges[i]) / 4; /* 4 msrs per u8 */
offset += (i * MSRS_RANGE_SIZE); /* add range offset */

/* Now we have the u8 offset - but need the u32 offset */
return offset / 4;
}

/* MSR not in any range */
return MSR_INVALID;
}

#define MAX_INST_SIZE 15

static inline u32 svm_has(u32 feat)
Expand Down Expand Up @@ -418,23 +441,21 @@ static int svm_cpu_init(int cpu)
static void set_msr_interception(u32 *msrpm, unsigned msr,
int read, int write)
{
int i;
u8 bit_read, bit_write;
unsigned long tmp;
u32 offset;

for (i = 0; i < NUM_MSR_MAPS; i++) {
if (msr >= msrpm_ranges[i] &&
msr < msrpm_ranges[i] + MSRS_IN_RANGE) {
u32 msr_offset = (i * MSRS_IN_RANGE + msr -
msrpm_ranges[i]) * 2;

u32 *base = msrpm + (msr_offset / 32);
u32 msr_shift = msr_offset % 32;
u32 mask = ((write) ? 0 : 2) | ((read) ? 0 : 1);
*base = (*base & ~(0x3 << msr_shift)) |
(mask << msr_shift);
return;
}
}
BUG();
offset = svm_msrpm_offset(msr);
bit_read = 2 * (msr & 0x0f);
bit_write = 2 * (msr & 0x0f) + 1;
tmp = msrpm[offset];

BUG_ON(offset == MSR_INVALID);

read ? clear_bit(bit_read, &tmp) : set_bit(bit_read, &tmp);
write ? clear_bit(bit_write, &tmp) : set_bit(bit_write, &tmp);

msrpm[offset] = tmp;
}

static void svm_vcpu_init_msrpm(u32 *msrpm)
Expand Down

0 comments on commit 975e524

Please sign in to comment.