[Xen-devel] RE: [PATCH] vmx-x86_64-byte.patch

Li, Chengyuan
Sun, 11 Sep 2005 11:30:20 -0000

Leendert,

The byte size is handled in set_reg_value(), but not in __set_reg_value(), and
it''s true that there is a bug in set_reg_value().
I''ve send a patch for this bug:

diff -r c8e840ac3019 xen/arch/x86/vmx_io.c
--- a/xen/arch/x86/vmx_io.c     Tue Sep  6 10:11:20 2005
+++ b/xen/arch/x86/vmx_io.c     Fri Sep  9 22:28:25 2005
@@ -261,7 +261,7 @@
                 domain_crash_synchronous();
                 break;
         }
-
+        return ;
     }

     switch (index) {


leendert@watson.ibm.com scribbled on 2005年9月10日 21:36:

> An FC4/i386 install inside VMX on an x86_64 system fails because byte
> size is not handled by __set_reg_value. This patch adds that support.
>
> This patch also reindents Chengyuan Li cmpb patch so that is aligns
> with the rest of the code in that block.
>
> Signed-Off-By: Leendert van Doorn <leendert@watson.ibm.com>
>
> diff -r 3f2751c6e721 xen/arch/x86/vmx_io.c
> --- a/xen/arch/x86/vmx_io.c	Sat Sep 10 14:44:31 2005
> +++ b/xen/arch/x86/vmx_io.c	Sat Sep 10 14:23:12 2005
> @@ -99,7 +99,6 @@
>              printk("Error: size:%x, index:%x are invalid!\n",
size,
>              index); domain_crash_synchronous();
>              break;
> -
>          }
>          break;
>      case WORD:
> @@ -199,6 +198,7 @@
>  static inline void __set_reg_value(unsigned long *reg, int size,
>  long value) {
>      switch (size) {
> +        case BYTE:
>          case BYTE_64:
>              *reg &= ~0xFF;
>              *reg |= (value & 0xFF);
> @@ -215,7 +215,7 @@
>              *reg = value;
>              break;
>          default:
> -            printk("Error: <__set_reg_value> : Unknown size for
> register\n"); +	    printk("Error: <__set_reg_value>:
size:%x is
>              invalid\n", size); domain_crash_synchronous();
>      }
>  }
> diff -r 3f2751c6e721 xen/arch/x86/vmx_platform.c
> --- a/xen/arch/x86/vmx_platform.c	Sat Sep 10 14:44:31 2005
> +++ b/xen/arch/x86/vmx_platform.c	Sat Sep 10 14:23:12 2005
> @@ -55,6 +55,7 @@
>  static inline long __get_reg_value(unsigned long reg, int size)
>  {
>      switch(size) {
> +        case BYTE:
>          case BYTE_64:
>              return (char)(reg & 0xFF);
>          case WORD:
> @@ -430,10 +431,10 @@
>  	if (((opcode[1] >> 3) & 7) == 7) { /* cmp $imm, m32/16 */
>  	    instr->instr = INSTR_CMP;
>
> -        if (opcode[0] == 0x80)
> -            GET_OP_SIZE_FOR_BYTE(instr->op_size);
> -        else
> -            GET_OP_SIZE_FOR_NONEBYTE(instr->op_size);
> +	    if (opcode[0] == 0x80)
> +		GET_OP_SIZE_FOR_BYTE(instr->op_size);
> +            else
> +		GET_OP_SIZE_FOR_NONEBYTE(instr->op_size);
>
>  	    instr->operand[0] = mk_operand(instr->op_size, 0, 0,
IMMEDIATE);
>  	    instr->immediate = get_immediate(vm86, opcode+1, BYTE);

Thanks,
Chengyuan