summaryrefslogtreecommitdiffstats
path: root/sys/amd64/include
diff options
context:
space:
mode:
authorneel <neel@FreeBSD.org>2014-05-19 03:50:07 +0000
committerneel <neel@FreeBSD.org>2014-05-19 03:50:07 +0000
commitb0752c36834e163965f74132ceccdcbebcdc8aba (patch)
tree6d7e5eac5fc4aae597aecc8918b3b080134ec6e3 /sys/amd64/include
parent3be9640f2c07a93d623ccf08630df8b05f676278 (diff)
downloadFreeBSD-src-b0752c36834e163965f74132ceccdcbebcdc8aba.zip
FreeBSD-src-b0752c36834e163965f74132ceccdcbebcdc8aba.tar.gz
Add PG_U (user/supervisor) checks when translating a guest linear address
to a guest physical address. PG_PS (page size) field is valid only in a PDE or a PDPTE so it is now checked only in non-terminal paging entries. Ignore the upper 32-bits of the CR3 for PAE paging.
Diffstat (limited to 'sys/amd64/include')
-rw-r--r--sys/amd64/include/vmm.h1
-rw-r--r--sys/amd64/include/vmm_instruction_emul.h3
2 files changed, 3 insertions, 1 deletions
diff --git a/sys/amd64/include/vmm.h b/sys/amd64/include/vmm.h
index 50d879b..94bdcf4 100644
--- a/sys/amd64/include/vmm.h
+++ b/sys/amd64/include/vmm.h
@@ -361,6 +361,7 @@ struct vm_exit {
uint64_t cr3;
enum vie_cpu_mode cpu_mode;
enum vie_paging_mode paging_mode;
+ int cpl;
struct vie vie;
} inst_emul;
/*
diff --git a/sys/amd64/include/vmm_instruction_emul.h b/sys/amd64/include/vmm_instruction_emul.h
index 0901aa2..0af9b4a 100644
--- a/sys/amd64/include/vmm_instruction_emul.h
+++ b/sys/amd64/include/vmm_instruction_emul.h
@@ -119,7 +119,8 @@ int vmm_emulate_instruction(void *vm, int cpuid, uint64_t gpa, struct vie *vie,
*/
int vmm_fetch_instruction(struct vm *vm, int cpuid,
uint64_t rip, int inst_length, uint64_t cr3,
- enum vie_paging_mode paging_mode, struct vie *vie);
+ enum vie_paging_mode paging_mode, int cpl,
+ struct vie *vie);
void vie_init(struct vie *vie);
OpenPOWER on IntegriCloud