summaryrefslogtreecommitdiff
path: root/target-i386/seg_helper.c
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2014-03-28 11:43:45 +0100
committerPaolo Bonzini <pbonzini@redhat.com>2014-06-05 16:10:34 +0200
commit8a201bd47e4724c5783033aedbdd126a5df7a251 (patch)
tree1f4d90bf910f1eea3544286c076a0f5deddcaf86 /target-i386/seg_helper.c
parent81cf8d8adc64203567e03326c13ea4abec9fe5df (diff)
downloadqemu-8a201bd47e4724c5783033aedbdd126a5df7a251.tar.gz
qemu-8a201bd47e4724c5783033aedbdd126a5df7a251.tar.bz2
qemu-8a201bd47e4724c5783033aedbdd126a5df7a251.zip
target-i386: fix kernel accesses with SMAP and CPL = 3
With SMAP, implicit kernel accesses from user mode always behave as if AC=0. To do this, kernel mode is not anymore a separate MMU mode. Instead, KERNEL_IDX is renamed to KSMAP_IDX and the kernel mode accessors wrap KSMAP_IDX and KNOSMAP_IDX. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'target-i386/seg_helper.c')
-rw-r--r--target-i386/seg_helper.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/target-i386/seg_helper.c b/target-i386/seg_helper.c
index 31c5508e6c..934cc2b287 100644
--- a/target-i386/seg_helper.c
+++ b/target-i386/seg_helper.c
@@ -34,6 +34,24 @@
# define LOG_PCALL_STATE(cpu) do { } while (0)
#endif
+#ifndef CONFIG_USER_ONLY
+#define CPU_MMU_INDEX (cpu_mmu_index_kernel(env))
+#define MEMSUFFIX _kernel
+#define DATA_SIZE 1
+#include "exec/cpu_ldst_template.h"
+
+#define DATA_SIZE 2
+#include "exec/cpu_ldst_template.h"
+
+#define DATA_SIZE 4
+#include "exec/cpu_ldst_template.h"
+
+#define DATA_SIZE 8
+#include "exec/cpu_ldst_template.h"
+#undef CPU_MMU_INDEX
+#undef MEMSUFFIX
+#endif
+
/* return non zero if error */
static inline int load_segment(CPUX86State *env, uint32_t *e1_ptr,
uint32_t *e2_ptr, int selector)