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

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



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@xxxxxxxxxxxxxx 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@xxxxxxxxxxxxxx>
> 
> 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

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

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