diff options
Diffstat (limited to 'emulators/kqemu-kmod-devel/files/extra-patch-jk-200905-05')
-rw-r--r-- | emulators/kqemu-kmod-devel/files/extra-patch-jk-200905-05 | 155 |
1 files changed, 0 insertions, 155 deletions
diff --git a/emulators/kqemu-kmod-devel/files/extra-patch-jk-200905-05 b/emulators/kqemu-kmod-devel/files/extra-patch-jk-200905-05 deleted file mode 100644 index f0d90518f074..000000000000 --- a/emulators/kqemu-kmod-devel/files/extra-patch-jk-200905-05 +++ /dev/null @@ -1,155 +0,0 @@ -From: jan.kiszka@siemens.com (Jan Kiszka) -Subject: [Qemu-devel] [PATCH 5/5] kqemu: Implement lar/lsl in the monitor - code interpreter -Date: Fri, 29 May 2009 19:18:31 +0200 -Message-ID: <20090529171831.14265.17606.stgit@mchn012c.ww002.siemens.net> -To: qemu-devel@nongnu.org - -This avoids user space for handling lar/lsl via TCG. - -Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> ---- - - common/interp.c | 111 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- - 1 files changed, 109 insertions(+), 2 deletions(-) - -diff --git common/interp.c b/common/interp.c -index 4f93bc3..577d666 100644 -Index: common/interp.c ---- common/interp.c -+++ common/interp.c -@@ -1720,6 +1720,93 @@ void helper_lldt(struct kqemu_state *s, int selector) - env->ldt.selector = selector; - } - -+static int helper_lar(struct kqemu_state *s, int selector) -+{ -+ uint32_t e1, e2; -+ int rpl, dpl, cpl, type; -+ -+ if ((selector & 0xfffc) == 0) -+ goto fail; -+ if (load_segment(s, &e1, &e2, selector) != 0) -+ goto fail; -+ rpl = selector & 3; -+ dpl = (e2 >> DESC_DPL_SHIFT) & 3; -+ cpl = s->cpu_state.cpl; -+ if (e2 & DESC_S_MASK) { -+ if ((e2 & DESC_CS_MASK) && (e2 & DESC_C_MASK)) { -+ /* conforming */ -+ } else { -+ if (dpl < cpl || dpl < rpl) -+ goto fail; -+ } -+ } else { -+ type = (e2 >> DESC_TYPE_SHIFT) & 0xf; -+ switch(type) { -+ case 1: -+ case 2: -+ case 3: -+ case 4: -+ case 5: -+ case 9: -+ case 11: -+ case 12: -+ break; -+ default: -+ goto fail; -+ } -+ if (dpl < cpl || dpl < rpl) { -+ fail: -+ set_reset_eflags(s, 0, CC_Z); -+ return 0; -+ } -+ } -+ set_reset_eflags(s, CC_Z, 0); -+ return e2 & 0x00f0ff00; -+} -+ -+static int helper_lsl(struct kqemu_state *s, int selector) -+{ -+ unsigned int limit; -+ uint32_t e1, e2; -+ int rpl, dpl, cpl, type; -+ -+ if ((selector & 0xfffc) == 0) -+ goto fail; -+ if (load_segment(s, &e1, &e2, selector) != 0) -+ goto fail; -+ rpl = selector & 3; -+ dpl = (e2 >> DESC_DPL_SHIFT) & 3; -+ cpl = s->cpu_state.cpl; -+ if (e2 & DESC_S_MASK) { -+ if ((e2 & DESC_CS_MASK) && (e2 & DESC_C_MASK)) { -+ /* conforming */ -+ } else { -+ if (dpl < cpl || dpl < rpl) -+ goto fail; -+ } -+ } else { -+ type = (e2 >> DESC_TYPE_SHIFT) & 0xf; -+ switch(type) { -+ case 1: -+ case 2: -+ case 3: -+ case 9: -+ case 11: -+ break; -+ default: -+ goto fail; -+ } -+ if (dpl < cpl || dpl < rpl) { -+ fail: -+ set_reset_eflags(s, 0, CC_Z); -+ return 0; -+ } -+ } -+ limit = get_seg_limit(e1, e2); -+ set_reset_eflags(s, CC_Z, 0); -+ return limit; -+} -+ - static void helper_verr(struct kqemu_state *s, int selector) - { - uint32_t e1, e2; -@@ -4616,6 +4703,28 @@ QO( case OT_LONG | 8:\ - goto illegal_op; - } - goto insn_next; -+ LABEL(102) /* lar */ -+ LABEL(103) /* lsl */ -+ if (!(s->cpu_state.cr0 & CR0_PE_MASK) || get_eflags_vm(s)) -+ goto illegal_op; -+ ot = s->dflag + OT_WORD; -+ modrm = ldub_code(s); -+ mod = (modrm >> 6); -+ if (mod == 3) { -+ rm = (modrm & 7) | REX_B(s); -+ val = get_regS(s, OT_WORD, rm) & 0xffff; -+ } else { -+ addr = get_modrm(s, modrm); -+ val = ldS(s, OT_WORD, addr); -+ } -+ rm = ((modrm >> 3) & 7) | REX_R(s); -+ if (b == 0x102) -+ val = helper_lar(s, val); -+ else -+ val = helper_lsl(s, val); -+ if (s->regs1.eflags & CC_Z) -+ set_regS(s, ot, rm, val); -+ goto insn_next; - LABEL(108) /* invd */ - LABEL(109) /* wbinvd */ - if (s->cpu_state.cpl != 0) -@@ -5214,8 +5323,6 @@ QO( case OT_LONG | 8:\ - LABEL(10b) - LABEL(10a) - LABEL(104) -- LABEL(103) -- LABEL(102) - LABEL(f1) - LABEL(e2) - LABEL(e1) - - - |