mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge tag 'for-upstream' of https://gitlab.com/bonzini/qemu into staging
* target/i386/tcg: conversion of one byte opcodes to table-based decoder # -----BEGIN PGP SIGNATURE----- # # iQFIBAABCAAyFiEE8TM4V0tmI4mGbHaCv/vSX3jHroMFAmY5z/QUHHBib256aW5p # QHJlZGhhdC5jb20ACgkQv/vSX3jHroP1YQf/WMAoB/lR31fzu/Uh36hF1Ke/NHNU # gefqKRAol6xJXxavKH8ym9QMlCTzrCLVt0e8RalZH76gLqYOjRhSLSSL+gUo5HEo # lsGSfkDAH2pHO0ZjQUkXcjJQQKkH+4+Et8xtyPc0qmq4uT1pqQZRgOeI/X/DIFNb # sMoKaRKfj+dB7TSp3qCSOp77RqL13f4QTP8mUQ4XIfzDDXdTX5n8WNLnyEIKjoar # ge4U6/KHjM35hAjCG9Av/zYQx0E084r2N2OEy0ESYNwswFZ8XYzTuL4SatN/Otf3 # F6eQZ7Q7n6lQbTA+k3J/jR9dxiSqVzFQnL1ePGoe9483UnxVavoWd0PSgw== # =jCyB # -----END PGP SIGNATURE----- # gpg: Signature made Mon 06 May 2024 11:53:40 PM PDT # gpg: using RSA key F13338574B662389866C7682BFFBD25F78C7AE83 # gpg: issuer "pbonzini@redhat.com" # gpg: Good signature from "Paolo Bonzini <bonzini@gnu.org>" [full] # gpg: aka "Paolo Bonzini <pbonzini@redhat.com>" [full] * tag 'for-upstream' of https://gitlab.com/bonzini/qemu: (26 commits) target/i386: remove duplicate prefix decoding target/i386: split legacy decoder into a separate function target/i386: decode x87 instructions in a separate function target/i386: remove now-converted opcodes from old decoder target/i386: port extensions of one-byte opcodes to new decoder target/i386: move BSWAP to new decoder target/i386: move remaining conditional operations to new decoder target/i386: merge and enlarge a few ranges for call to disas_insn_new target/i386: move C0-FF opcodes to new decoder (except for x87) target/i386: generalize gen_movl_seg_T0 target/i386: move 60-BF opcodes to new decoder target/i386: allow instructions with more than one immediate target/i386: extract gen_far_call/jmp, reordering temporaries target/i386: move 00-5F opcodes to new decoder target/i386: reintroduce debugging mechanism target/i386: cleanup *gen_eob* target/i386: clarify the "reg" argument of functions returning CCPrepare target/i386: do not use s->T0 and s->T1 as scratch registers for CCPrepare target/i386: extend cc_* when using them to compute flags target/i386: pull cc_op update to callers of gen_jmp_rel{,_csize} ... Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
@@ -81,6 +81,7 @@
|
||||
GlobalProperty pc_compat_9_0[] = {
|
||||
{ TYPE_X86_CPU, "guest-phys-bits", "0" },
|
||||
{ "sev-guest", "legacy-vm-type", "true" },
|
||||
{ TYPE_X86_CPU, "legacy-multi-node", "on" },
|
||||
};
|
||||
const size_t pc_compat_9_0_len = G_N_ELEMENTS(pc_compat_9_0);
|
||||
|
||||
|
||||
+10
-8
@@ -398,12 +398,9 @@ static void encode_topo_cpuid8000001e(X86CPU *cpu, X86CPUTopoInfo *topo_info,
|
||||
* 31:11 Reserved.
|
||||
* 10:8 NodesPerProcessor: Node per processor. Read-only. Reset: XXXb.
|
||||
* ValidValues:
|
||||
* Value Description
|
||||
* 000b 1 node per processor.
|
||||
* 001b 2 nodes per processor.
|
||||
* 010b Reserved.
|
||||
* 011b 4 nodes per processor.
|
||||
* 111b-100b Reserved.
|
||||
* Value Description
|
||||
* 0h 1 node per processor.
|
||||
* 7h-1h Reserved.
|
||||
* 7:0 NodeId: Node ID. Read-only. Reset: XXh.
|
||||
*
|
||||
* NOTE: Hardware reserves 3 bits for number of nodes per processor.
|
||||
@@ -412,8 +409,12 @@ static void encode_topo_cpuid8000001e(X86CPU *cpu, X86CPUTopoInfo *topo_info,
|
||||
* NodeId is combination of node and socket_id which is already decoded
|
||||
* in apic_id. Just use it by shifting.
|
||||
*/
|
||||
*ecx = ((topo_info->dies_per_pkg - 1) << 8) |
|
||||
((cpu->apic_id >> apicid_die_offset(topo_info)) & 0xFF);
|
||||
if (cpu->legacy_multi_node) {
|
||||
*ecx = ((topo_info->dies_per_pkg - 1) << 8) |
|
||||
((cpu->apic_id >> apicid_die_offset(topo_info)) & 0xFF);
|
||||
} else {
|
||||
*ecx = (cpu->apic_id >> apicid_pkg_offset(topo_info)) & 0xFF;
|
||||
}
|
||||
|
||||
*edx = 0;
|
||||
}
|
||||
@@ -8084,6 +8085,7 @@ static Property x86_cpu_properties[] = {
|
||||
* own cache information (see x86_cpu_load_def()).
|
||||
*/
|
||||
DEFINE_PROP_BOOL("legacy-cache", X86CPU, legacy_cache, true),
|
||||
DEFINE_PROP_BOOL("legacy-multi-node", X86CPU, legacy_multi_node, false),
|
||||
DEFINE_PROP_BOOL("xen-vapic", X86CPU, xen_vapic, false),
|
||||
|
||||
/*
|
||||
|
||||
@@ -1994,6 +1994,12 @@ struct ArchCPU {
|
||||
*/
|
||||
bool legacy_cache;
|
||||
|
||||
/* Compatibility bits for old machine types.
|
||||
* If true decode the CPUID Function 0x8000001E_ECX to support multiple
|
||||
* nodes per processor
|
||||
*/
|
||||
bool legacy_multi_node;
|
||||
|
||||
/* Compatibility bits for old machine types: */
|
||||
bool enable_cpuid_0xb;
|
||||
|
||||
|
||||
@@ -207,15 +207,4 @@ DEF_HELPER_1(emms, void, env)
|
||||
#define SHIFT 2
|
||||
#include "tcg/ops_sse_header.h.inc"
|
||||
|
||||
DEF_HELPER_3(rclb, tl, env, tl, tl)
|
||||
DEF_HELPER_3(rclw, tl, env, tl, tl)
|
||||
DEF_HELPER_3(rcll, tl, env, tl, tl)
|
||||
DEF_HELPER_3(rcrb, tl, env, tl, tl)
|
||||
DEF_HELPER_3(rcrw, tl, env, tl, tl)
|
||||
DEF_HELPER_3(rcrl, tl, env, tl, tl)
|
||||
#ifdef TARGET_X86_64
|
||||
DEF_HELPER_3(rclq, tl, env, tl, tl)
|
||||
DEF_HELPER_3(rcrq, tl, env, tl, tl)
|
||||
#endif
|
||||
|
||||
DEF_HELPER_1(rdrand, tl, env)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -47,7 +47,9 @@ typedef enum X86OpType {
|
||||
X86_TYPE_Y, /* string destination */
|
||||
|
||||
/* Custom */
|
||||
X86_TYPE_EM, /* modrm byte selects an ALU memory operand */
|
||||
X86_TYPE_WM, /* modrm byte selects an XMM/YMM memory operand */
|
||||
X86_TYPE_I_unsigned, /* Immediate, zero-extended */
|
||||
X86_TYPE_2op, /* 2-operand RMW instruction */
|
||||
X86_TYPE_LoBits, /* encoded in bits 0-2 of the operand + REX.B */
|
||||
X86_TYPE_0, /* Hard-coded GPRs (RAX..RDI) */
|
||||
@@ -88,6 +90,7 @@ typedef enum X86OpSize {
|
||||
X86_SIZE_x, /* 128/256-bit, based on operand size */
|
||||
X86_SIZE_y, /* 32/64-bit, based on operand size */
|
||||
X86_SIZE_z, /* 16-bit for 16-bit operand size, else 32-bit */
|
||||
X86_SIZE_z_f64, /* 32-bit for 32-bit operand size or 64-bit mode, else 16-bit */
|
||||
|
||||
/* Custom */
|
||||
X86_SIZE_d64,
|
||||
@@ -104,6 +107,7 @@ typedef enum X86CPUIDFeature {
|
||||
X86_FEAT_AVX2,
|
||||
X86_FEAT_BMI1,
|
||||
X86_FEAT_BMI2,
|
||||
X86_FEAT_CMOV,
|
||||
X86_FEAT_CMPCCXADD,
|
||||
X86_FEAT_F16C,
|
||||
X86_FEAT_FMA,
|
||||
@@ -165,6 +169,8 @@ typedef enum X86InsnSpecial {
|
||||
/* Always locked if it has a memory operand (XCHG) */
|
||||
X86_SPECIAL_Locked,
|
||||
|
||||
/* Do not apply segment base to effective address */
|
||||
X86_SPECIAL_NoSeg,
|
||||
/*
|
||||
* Rd/Mb or Rd/Mw in the manual: register operand 0 is treated as 32 bits
|
||||
* (and writeback zero-extends it to 64 bits if applicable). PREFIX_DATA
|
||||
@@ -271,16 +277,23 @@ typedef struct X86DecodedOp {
|
||||
bool has_ea;
|
||||
int offset; /* For MMX and SSE */
|
||||
|
||||
/*
|
||||
* This field is used internally by macros OP0_PTR/OP1_PTR/OP2_PTR,
|
||||
* do not access directly!
|
||||
*/
|
||||
TCGv_ptr v_ptr;
|
||||
union {
|
||||
target_ulong imm;
|
||||
/*
|
||||
* This field is used internally by macros OP0_PTR/OP1_PTR/OP2_PTR,
|
||||
* do not access directly!
|
||||
*/
|
||||
TCGv_ptr v_ptr;
|
||||
};
|
||||
} X86DecodedOp;
|
||||
|
||||
struct X86DecodedInsn {
|
||||
X86OpEntry e;
|
||||
X86DecodedOp op[3];
|
||||
/*
|
||||
* Rightmost immediate, for convenience since most instructions have
|
||||
* one (and also for 4-operand instructions).
|
||||
*/
|
||||
target_ulong immediate;
|
||||
AddressParts mem;
|
||||
|
||||
|
||||
+1583
-12
File diff suppressed because it is too large
Load Diff
@@ -29,22 +29,6 @@
|
||||
|
||||
//#define DEBUG_MULDIV
|
||||
|
||||
/* modulo 9 table */
|
||||
static const uint8_t rclb_table[32] = {
|
||||
0, 1, 2, 3, 4, 5, 6, 7,
|
||||
8, 0, 1, 2, 3, 4, 5, 6,
|
||||
7, 8, 0, 1, 2, 3, 4, 5,
|
||||
6, 7, 8, 0, 1, 2, 3, 4,
|
||||
};
|
||||
|
||||
/* modulo 17 table */
|
||||
static const uint8_t rclw_table[32] = {
|
||||
0, 1, 2, 3, 4, 5, 6, 7,
|
||||
8, 9, 10, 11, 12, 13, 14, 15,
|
||||
16, 0, 1, 2, 3, 4, 5, 6,
|
||||
7, 8, 9, 10, 11, 12, 13, 14,
|
||||
};
|
||||
|
||||
/* division, flags are undefined */
|
||||
|
||||
void helper_divb_AL(CPUX86State *env, target_ulong t0)
|
||||
@@ -447,24 +431,6 @@ target_ulong helper_pext(target_ulong src, target_ulong mask)
|
||||
return dest;
|
||||
}
|
||||
|
||||
#define SHIFT 0
|
||||
#include "shift_helper_template.h.inc"
|
||||
#undef SHIFT
|
||||
|
||||
#define SHIFT 1
|
||||
#include "shift_helper_template.h.inc"
|
||||
#undef SHIFT
|
||||
|
||||
#define SHIFT 2
|
||||
#include "shift_helper_template.h.inc"
|
||||
#undef SHIFT
|
||||
|
||||
#ifdef TARGET_X86_64
|
||||
#define SHIFT 3
|
||||
#include "shift_helper_template.h.inc"
|
||||
#undef SHIFT
|
||||
#endif
|
||||
|
||||
/* Test that BIT is enabled in CR4. If not, raise an illegal opcode
|
||||
exception. This reduces the requirements for rare CR4 bits being
|
||||
mapped into HFLAGS. */
|
||||
|
||||
@@ -1,108 +0,0 @@
|
||||
/*
|
||||
* x86 shift helpers
|
||||
*
|
||||
* Copyright (c) 2008 Fabrice Bellard
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#define DATA_BITS (1 << (3 + SHIFT))
|
||||
#define SHIFT_MASK (DATA_BITS - 1)
|
||||
#if DATA_BITS <= 32
|
||||
#define SHIFT1_MASK 0x1f
|
||||
#else
|
||||
#define SHIFT1_MASK 0x3f
|
||||
#endif
|
||||
|
||||
#if DATA_BITS == 8
|
||||
#define SUFFIX b
|
||||
#define DATA_MASK 0xff
|
||||
#elif DATA_BITS == 16
|
||||
#define SUFFIX w
|
||||
#define DATA_MASK 0xffff
|
||||
#elif DATA_BITS == 32
|
||||
#define SUFFIX l
|
||||
#define DATA_MASK 0xffffffff
|
||||
#elif DATA_BITS == 64
|
||||
#define SUFFIX q
|
||||
#define DATA_MASK 0xffffffffffffffffULL
|
||||
#else
|
||||
#error unhandled operand size
|
||||
#endif
|
||||
|
||||
target_ulong glue(helper_rcl, SUFFIX)(CPUX86State *env, target_ulong t0,
|
||||
target_ulong t1)
|
||||
{
|
||||
int count, eflags;
|
||||
target_ulong src;
|
||||
target_long res;
|
||||
|
||||
count = t1 & SHIFT1_MASK;
|
||||
#if DATA_BITS == 16
|
||||
count = rclw_table[count];
|
||||
#elif DATA_BITS == 8
|
||||
count = rclb_table[count];
|
||||
#endif
|
||||
if (count) {
|
||||
eflags = env->cc_src;
|
||||
t0 &= DATA_MASK;
|
||||
src = t0;
|
||||
res = (t0 << count) | ((target_ulong)(eflags & CC_C) << (count - 1));
|
||||
if (count > 1) {
|
||||
res |= t0 >> (DATA_BITS + 1 - count);
|
||||
}
|
||||
t0 = res;
|
||||
env->cc_src = (eflags & ~(CC_C | CC_O)) |
|
||||
(lshift(src ^ t0, 11 - (DATA_BITS - 1)) & CC_O) |
|
||||
((src >> (DATA_BITS - count)) & CC_C);
|
||||
}
|
||||
return t0;
|
||||
}
|
||||
|
||||
target_ulong glue(helper_rcr, SUFFIX)(CPUX86State *env, target_ulong t0,
|
||||
target_ulong t1)
|
||||
{
|
||||
int count, eflags;
|
||||
target_ulong src;
|
||||
target_long res;
|
||||
|
||||
count = t1 & SHIFT1_MASK;
|
||||
#if DATA_BITS == 16
|
||||
count = rclw_table[count];
|
||||
#elif DATA_BITS == 8
|
||||
count = rclb_table[count];
|
||||
#endif
|
||||
if (count) {
|
||||
eflags = env->cc_src;
|
||||
t0 &= DATA_MASK;
|
||||
src = t0;
|
||||
res = (t0 >> count) |
|
||||
((target_ulong)(eflags & CC_C) << (DATA_BITS - count));
|
||||
if (count > 1) {
|
||||
res |= t0 << (DATA_BITS + 1 - count);
|
||||
}
|
||||
t0 = res;
|
||||
env->cc_src = (eflags & ~(CC_C | CC_O)) |
|
||||
(lshift(src ^ t0, 11 - (DATA_BITS - 1)) & CC_O) |
|
||||
((src >> (count - 1)) & CC_C);
|
||||
}
|
||||
return t0;
|
||||
}
|
||||
|
||||
#undef DATA_BITS
|
||||
#undef SHIFT_MASK
|
||||
#undef SHIFT1_MASK
|
||||
#undef DATA_TYPE
|
||||
#undef DATA_MASK
|
||||
#undef SUFFIX
|
||||
+776
-3005
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user