[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v4 2/5] tests/x86: Introduce a userspace test harness for x86_decode_lite()


  • To: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
  • From: Jan Beulich <jbeulich@xxxxxxxx>
  • Date: Wed, 28 Oct 2026 11:21:25 +0100
  • Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=google header.d=suse.com header.i="@suse.com" header.h="Content-Transfer-Encoding:Content-Type:In-Reply-To:Autocrypt:From:Content-Language:References:Cc:To:Subject:User-Agent:MIME-Version:Date:Message-ID"
  • Autocrypt: addr=jbeulich@xxxxxxxx; keydata= xsDiBFk3nEQRBADAEaSw6zC/EJkiwGPXbWtPxl2xCdSoeepS07jW8UgcHNurfHvUzogEq5xk hu507c3BarVjyWCJOylMNR98Yd8VqD9UfmX0Hb8/BrA+Hl6/DB/eqGptrf4BSRwcZQM32aZK 7Pj2XbGWIUrZrd70x1eAP9QE3P79Y2oLrsCgbZJfEwCgvz9JjGmQqQkRiTVzlZVCJYcyGGsD /0tbFCzD2h20ahe8rC1gbb3K3qk+LpBtvjBu1RY9drYk0NymiGbJWZgab6t1jM7sk2vuf0Py O9Hf9XBmK0uE9IgMaiCpc32XV9oASz6UJebwkX+zF2jG5I1BfnO9g7KlotcA/v5ClMjgo6Gl MDY4HxoSRu3i1cqqSDtVlt+AOVBJBACrZcnHAUSuCXBPy0jOlBhxPqRWv6ND4c9PH1xjQ3NP nxJuMBS8rnNg22uyfAgmBKNLpLgAGVRMZGaGoJObGf72s6TeIqKJo/LtggAS9qAUiuKVnygo 3wjfkS9A3DRO+SpU7JqWdsveeIQyeyEJ/8PTowmSQLakF+3fote9ybzd880fSmFuIEJldWxp Y2ggPGpiZXVsaWNoQHN1c2UuY29tPsJgBBMRAgAgBQJZN5xEAhsDBgsJCAcDAgQVAggDBBYC AwECHgECF4AACgkQoDSui/t3IH4J+wCfQ5jHdEjCRHj23O/5ttg9r9OIruwAn3103WUITZee e7Sbg12UgcQ5lv7SzsFNBFk3nEQQCACCuTjCjFOUdi5Nm244F+78kLghRcin/awv+IrTcIWF hUpSs1Y91iQQ7KItirz5uwCPlwejSJDQJLIS+QtJHaXDXeV6NI0Uef1hP20+y8qydDiVkv6l IreXjTb7DvksRgJNvCkWtYnlS3mYvQ9NzS9PhyALWbXnH6sIJd2O9lKS1Mrfq+y0IXCP10eS FFGg+Av3IQeFatkJAyju0PPthyTqxSI4lZYuJVPknzgaeuJv/2NccrPvmeDg6Coe7ZIeQ8Yj t0ARxu2xytAkkLCel1Lz1WLmwLstV30g80nkgZf/wr+/BXJW/oIvRlonUkxv+IbBM3dX2OV8 AmRv1ySWPTP7AAMFB/9PQK/VtlNUJvg8GXj9ootzrteGfVZVVT4XBJkfwBcpC/XcPzldjv+3 HYudvpdNK3lLujXeA5fLOH+Z/G9WBc5pFVSMocI71I8bT8lIAzreg0WvkWg5V2WZsUMlnDL9 mpwIGFhlbM3gfDMs7MPMu8YQRFVdUvtSpaAs8OFfGQ0ia3LGZcjA6Ik2+xcqscEJzNH+qh8V m5jjp28yZgaqTaRbg3M/+MTbMpicpZuqF4rnB0AQD12/3BNWDR6bmh+EkYSMcEIpQmBM51qM EKYTQGybRCjpnKHGOxG0rfFY1085mBDZCH5Kx0cl0HVJuQKC+dV2ZY5AqjcKwAxpE75MLFkr wkkEGBECAAkFAlk3nEQCGwwACgkQoDSui/t3IH7nnwCfcJWUDUFKdCsBH/E5d+0ZnMQi+G0A nAuWpQkjM1ASeQwSHEeAWPgskBQL
  • Cc: Roger Pau Monné <roger@xxxxxxxxxxxxxx>, Teddy Astie <teddy.astie@xxxxxxxxxx>, Xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • Delivery-date: Wed, 28 Oct 2026 10:21:35 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

On 15.10.2026 23:05, Andrew Cooper wrote:
> All the interesting behaviour is in insns.S.
> 
> There are 4 interesting cases; "not an instruction we tolerate", and one we do
> tolerate, split by no relation, disp8 or disp32.  The DECL()/END() macros

DYM "relocation" here?

> --- /dev/null
> +++ b/tools/tests/x86-decode-lite/Makefile
> @@ -0,0 +1,56 @@
> +XEN_ROOT = $(CURDIR)/../../..
> +include $(XEN_ROOT)/tools/Rules.mk
> +
> +TARGET :=
> +
> +# Clang IAS doesn't like the convenience macros we use
> +$(call cc-option-add,CFLAGS,CC,-no-integrated-as)
> +
> +# Binutils around 2.30 have mutually exclusive expectations of instruction
> +# suffix validities compared to later versions.  Among the distro we test,
> +# this only excludes Ubuntu 18.04.

This is liable to go stale; 18.04's lifetime can't be all that much anymore.
I'd suggest to keep just the first sentence.

> --- /dev/null
> +++ b/tools/tests/x86-decode-lite/insns.S
> @@ -0,0 +1,711 @@
> [...]
> +sib:
> +        /* Mod=0, Reg=0, RM=4, SIB S=3, I=0, B {0..f} */
> +        _ add %al, (%rax, %rax, 8)
> +        _ add %al, (%rcx, %rax, 8)
> +        _ add %al, (%rdx, %rax, 8)
> +        _ add %al, (%rbx, %rax, 8)
> +        _ add %al, (%rsp, %rax, 8)
> +        _ add %al, (    , %rax, 8) /* "none", %rbp encoded with mod=1/2 */
> +        _ add %al, (%rsi, %rax, 8)
> +        _ add %al, (%rdi, %rax, 8)
> +        _ add %al, (%r8,  %rax, 8)
> +        _ add %al, (%r9,  %rax, 8)
> +        _ add %al, (%r10, %rax, 8)
> +        _ add %al, (%r11, %rax, 8)
> +        _ add %al, (%r12, %rax, 8)
> +        _ rex.b add %al,(,%rax, 8) /* "none", %r13 encoded with mod=1/2 */
> +        _ add %al, (%r14, %rax, 8)
> +        _ add %al, (%r15, %rax, 8)
> +
> +        /* Mod=1, Reg=0, RM=4, SIB S=3, I=0, B {0..f} */
> +        _ add %al, 0x01(%rax, %rax, 8)
> +        _ add %al, 0x01(%rcx, %rax, 8)
> +        _ add %al, 0x01(%rdx, %rax, 8)
> +        _ add %al, 0x01(%rbx, %rax, 8)
> +        _ add %al, 0x01(%rsp, %rax, 8)
> +        _ add %al, 0x01(%rbp, %rax, 8)
> +        _ add %al, 0x01(%rsi, %rax, 8)
> +        _ add %al, 0x01(%rdi, %rax, 8)
> +        _ add %al, 0x01(%r8,  %rax, 8)
> +        _ add %al, 0x01(%r9,  %rax, 8)
> +        _ add %al, 0x01(%r10, %rax, 8)
> +        _ add %al, 0x01(%r11, %rax, 8)
> +        _ add %al, 0x01(%r12, %rax, 8)
> +        _ add %al, 0x01(%r13, %rax, 8)
> +        _ add %al, 0x01(%r14, %rax, 8)
> +        _ add %al, 0x01(%r15, %rax, 8)
> +
> +        /* Mod=2, Reg=0, RM=4, SIB S=3, I=0, B {0..f} */
> +        _ add %al, 0x7f000001(%rax, %rax, 8)
> +        _ add %al, 0x7f000001(%rcx, %rax, 8)
> +        _ add %al, 0x7f000001(%rdx, %rax, 8)
> +        _ add %al, 0x7f000001(%rbx, %rax, 8)
> +        _ add %al, 0x7f000001(%rsp, %rax, 8)
> +        _ add %al, 0x7f000001(%rbp, %rax, 8)
> +        _ add %al, 0x7f000001(%rsi, %rax, 8)
> +        _ add %al, 0x7f000001(%rdi, %rax, 8)
> +        _ add %al, 0x7f000001(%r8,  %rax, 8)
> +        _ add %al, 0x7f000001(%r9,  %rax, 8)
> +        _ add %al, 0x7f000001(%r10, %rax, 8)
> +        _ add %al, 0x7f000001(%r11, %rax, 8)
> +        _ add %al, 0x7f000001(%r12, %rax, 8)
> +        _ add %al, 0x7f000001(%r13, %rax, 8)
> +        _ add %al, 0x7f000001(%r14, %rax, 8)
> +        _ add %al, 0x7f000001(%r15, %rax, 8)
> +
> +        /* Mod=0, Reg=0, RM=4, SIB S=3, I=4, B {0..f} */
> +        _ add %al, (%rax, %riz, 8)
> +        _ add %al, (%rcx, %riz, 8)
> +        _ add %al, (%rdx, %riz, 8)
> +        _ add %al, (%rbx, %riz, 8)
> +        _ add %al, (%rsp, %riz, 8)
> +        _ add %al, (    , %riz, 8) /* %rbp encoded with mod=1/2 */
> +        _ add %al, (%rsi, %riz, 8)
> +        _ add %al, (%rdi, %riz, 8)
> +        _ add %al, (%r8,  %riz, 8)
> +        _ add %al, (%r9,  %riz, 8)
> +        _ add %al, (%r10, %riz, 8)
> +        _ add %al, (%r11, %riz, 8)
> +        _ add %al, (%r12, %riz, 8)
> +        _ rex.b add %al,(,%riz, 8) /* %r13 encoded with mod=1/2 */
> +        _ add %al, (%r14, %riz, 8)
> +        _ add %al, (%r15, %riz, 8)
> +
> +        /* Mod=1, Reg=0, RM=4, SIB S=3, I=4, B {0..f} */
> +        _ add %al, 0x01(%rax, %riz, 8)
> +        _ add %al, 0x01(%rcx, %riz, 8)
> +        _ add %al, 0x01(%rdx, %riz, 8)
> +        _ add %al, 0x01(%rbx, %riz, 8)
> +        _ add %al, 0x01(%rsp, %riz, 8)
> +        _ add %al, 0x01(%rbp, %riz, 8)
> +        _ add %al, 0x01(%rsi, %riz, 8)
> +        _ add %al, 0x01(%rdi, %riz, 8)
> +        _ add %al, 0x01(%r8,  %riz, 8)
> +        _ add %al, 0x01(%r9,  %riz, 8)
> +        _ add %al, 0x01(%r10, %riz, 8)
> +        _ add %al, 0x01(%r11, %riz, 8)
> +        _ add %al, 0x01(%r12, %riz, 8)
> +        _ add %al, 0x01(%r13, %riz, 8)
> +        _ add %al, 0x01(%r14, %riz, 8)
> +        _ add %al, 0x01(%r15, %riz, 8)
> +
> +        /* Mod=2, Reg=0, RM=4, SIB S=3, I=4, B {0..f} */
> +        _ add %al, 0x7f000001(%rax, %riz, 8)
> +        _ add %al, 0x7f000001(%rcx, %riz, 8)
> +        _ add %al, 0x7f000001(%rdx, %riz, 8)
> +        _ add %al, 0x7f000001(%rbx, %riz, 8)
> +        _ add %al, 0x7f000001(%rsp, %riz, 8)
> +        _ add %al, 0x7f000001(%rbp, %riz, 8)
> +        _ add %al, 0x7f000001(%rsi, %riz, 8)
> +        _ add %al, 0x7f000001(%rdi, %riz, 8)
> +        _ add %al, 0x7f000001(%r8,  %riz, 8)
> +        _ add %al, 0x7f000001(%r9,  %riz, 8)
> +        _ add %al, 0x7f000001(%r10, %riz, 8)
> +        _ add %al, 0x7f000001(%r11, %riz, 8)
> +        _ add %al, 0x7f000001(%r12, %riz, 8)
> +        _ add %al, 0x7f000001(%r13, %riz, 8)
> +        _ add %al, 0x7f000001(%r14, %riz, 8)
> +        _ add %al, 0x7f000001(%r15, %riz, 8)
> +
> +
> +.macro alu_ops op

Nit: Can we avoid double blank lines, please?

> +onebyte_row_6x:
> +        /*pusha,popa,bound --> not supported */
> +        _ movsxd (%rax), %eax
> +        _ movslq (%rax), %rax

What about the (odd) 16-bit form? Decoding wise it's identical between AMD
and Intel.

> +        _ fs nop
> +        _ gs nop
> +        _ data16 nop
> +        /* addr32 --> not supported */
> +        _ pushq $0x7f000001
> +        _ pushw $0x7f01
> +        _ rex.w pushq $0x7f000001

Maybe also

        _ data16 rex.w pushq $0x7f000001

?

> +        _ imul $0x7f01, %ax, %ax
> +        _ imul $0x7f000001, %eax, %eax
> +        _ imul $0x7f000001, %rax, %rax
> +        _ pushq $0
> +        _ pushw $0
> +        _ rex.w pushq $0

Same here then.

> +onebyte_row_Fx:
> +        _ lock addb $0, (%rax)
> +        n "icebp" .byte 0xf1
> +        _ repne nop
> +        _ repe nop
> +        _ hlt
> +        _ cmc
> +        _ test $0, %cl /* Grp3, /0 has extra Imm{8,} */
> +        _ not %cl
> +        _ test $0x7f01, %cx
> +        _ not %cx
> +        _ test $0x7f000001, %ecx
> +        _ not %ecx
> +        _ test $0x7f000001, %rcx
> +        _ not %rcx
> +        _ clc
> +        _ stc
> +        _ cli
> +        _ sti
> +        _ cld
> +        _ std
> +        _ inc %cl /* Grp4 */
> +        _ dec %cl
> +        _ inc %ecx /* Grp5 */
> +        _ dec %ecx

Any reason you use register operands up to here, but then ...

> +        _ call *(%rax)

... a memory one here and ...

> +        _ lcall *(%rax)
> +        _ jmp *(%rax)

... here?

> +        _ ljmp *(%rax)
> +        _ push (%rax)

(I realize the assembler can't easily be told to encode this with a ModR/M
byte when used with a register operand.)

Again preferably with the above addressed (but explicitly also with some / all
left as is, except perhaps the double blank line one):
Acked-by: Jan Beulich <jbeulich@xxxxxxxx>

> +twobyte_row_2x:
> +        _ mov %cr0, %rax
> +        _ mov %dr0, %rax
> +        _ mov %rax, %cr0
> +        _ mov %rax, %dr0

I guess as we don't mean to use odd encodings of these (ModR/M.mod != 3),
there's no value in trying to test (and support) such.

> +twobyte_row_4x:
> +        _ cmovo (%rax), %eax
> +        _ cmovg (%rax), %eax
> +
> +/* twobyte_row_8x: --> Jcc disp32 */

Hmm, noticing only here: You do not foresee a need to support VMREAD/VMWRITE?

Jan


F

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.