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

Re: [Xen-devel] ATI/AMD VGA passthru report



> On Mon, May 07, 2012 at 01:45:23PM +0200, Pavel MatÄ?ja wrote:
>> Hi,
>> I'm trying to run AMD VGA passthru on latest XEN unstable with latest
>> kernel.
>> I already have working setup with ancient xen-devel 4.2 and 2.6.32.x
>> xenified
>> kernel. See attached log.
>>
>> So I tried just to update and patch xen and kernel, but I had no luck so
>> far.
>>
>> Xen has ati_vbios_patch_respin.txt sent to xen-devel by Wei Huang
>> recently.
>> http://lists.xen.org/archives/html/xen-devel/2012-04/msg00291.html
>>
>> I tried two kernels
>> testing-3.5-with-extra and xen/next-3.2 from
>> git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen.git
>> and
>> git://git.kernel.org/pub/scm/linux/kernel/git/jeremy/xen.git
>> Both with ioperm opcode patch which is required by the ATI patch. See
>> attachement.
>>
>> The xen/next-3.2 branch kernel was able to start booting windows.
>> With Catalyst driver installed I just saw bluescreen during Windows
>> boot.
>> Without Catalyst driver Windows were able to boot but Windows ended
>> frozen or
>> USB was not working. It was hard to tell because input devices had no
>> response
>> at all.
>>
>> The testing-3.5-with-extra (reported as 3.4.0-rc4) just crashed dom0
>> kernel
>> during Windows boot. I guess I have to rework the io_bitmap patch
>> somehow.
>
> When you say 'io_bitmap' patch are you referring to these ones:
>
> 70a357d xen: implement IO permission bitmap
> 0c596c5 x86/paravirt: paravirtualize IO permission bitmap
> 93b7a2a x86: demacro set_iopl_mask()
>
> ? I don't think those are in that tag. They are in the kitchensink -
> #testing
> - does it work with that branch?
>
> The next-3.2 is a bit old. I should actually delete it.

Hi,
I mean this patch below.
I think it was originally here:
http://old-list-archives.xen.org/archives/html/xen-devel/2009-05/msg01139.html
Then I was told by you to use devel/ioperm branch which I think doesn't
exist anymore:
http://old-list-archives.xen.org/archives/html/xen-devel/2011-11/msg01213.html

I'm too tired to test #testing branch now. I'll try it tomorrow after some
sleep.

>> diff --git a/arch/x86/include/asm/paravirt.h
>> b/arch/x86/include/asm/paravirt.h
>> index aa0f913..259ef7f 100644
>> --- a/arch/x86/include/asm/paravirt.h
>> +++ b/arch/x86/include/asm/paravirt.h
>> @@ -340,11 +340,18 @@ static inline void write_idt_entry(gate_desc *dt,
>> int entry, const gate_desc *g)
>>  {
>>      PVOP_VCALL3(pv_cpu_ops.write_idt_entry, dt, entry, g);
>>  }
>> +
>>  static inline void set_iopl_mask(unsigned mask)
>>  {
>>      PVOP_VCALL1(pv_cpu_ops.set_iopl_mask, mask);
>>  }
>>
>> +static inline void set_io_bitmap(struct thread_struct *thread,
>> +                                unsigned long bytes_updated)
>> +{
>> +       PVOP_VCALL2(pv_cpu_ops.set_io_bitmap, thread, bytes_updated);
>> +}
>> +
>>  /* The paravirtualized I/O functions */
>>  static inline void slow_down_io(void)
>>  {
>> diff --git a/arch/x86/include/asm/paravirt_types.h
>> b/arch/x86/include/asm/paravirt_types.h
>> index 8e8b9a4..96f267c 100644
>> --- a/arch/x86/include/asm/paravirt_types.h
>> +++ b/arch/x86/include/asm/paravirt_types.h
>> @@ -142,6 +142,8 @@ struct pv_cpu_ops {
>>      void (*load_sp0)(struct tss_struct *tss, struct thread_struct *t);
>>
>>      void (*set_iopl_mask)(unsigned mask);
>> +        void (*set_io_bitmap)(struct thread_struct *thread,
>> +                              unsigned long bytes_updated);
>>
>>      void (*wbinvd)(void);
>>      void (*io_delay)(void);
>> diff --git a/arch/x86/include/asm/processor.h
>> b/arch/x86/include/asm/processor.h
>> index 4fa7dcc..62becce 100644
>> --- a/arch/x86/include/asm/processor.h
>> +++ b/arch/x86/include/asm/processor.h
>> @@ -503,6 +503,9 @@ static inline void native_set_iopl_mask(unsigned
>> mask)
>>  #endif
>>  }
>>
>> +extern void native_set_io_bitmap(struct thread_struct *thread,
>> +                                unsigned long updated_bytes);
>> +
>>  static inline void
>>  native_load_sp0(struct tss_struct *tss, struct thread_struct *thread)
>>  {
>> @@ -536,6 +539,7 @@ static inline void load_sp0(struct tss_struct *tss,
>>  }
>>
>>  #define set_iopl_mask native_set_iopl_mask
>> +#define set_io_bitmap native_set_io_bitmap
>>  #endif /* CONFIG_PARAVIRT */
>>
>>  /*
>> diff --git a/arch/x86/kernel/ioport.c b/arch/x86/kernel/ioport.c
>> index 8c96897..c372ef0 100644
>> --- a/arch/x86/kernel/ioport.c
>> +++ b/arch/x86/kernel/ioport.c
>> @@ -17,13 +17,29 @@
>>  #include <linux/bitmap.h>
>>  #include <asm/syscalls.h>
>>
>> +void native_set_io_bitmap(struct thread_struct *t,
>> +                         unsigned long bytes_updated)
>> +{
>> +       struct tss_struct *tss;
>> +
>> +       if (!bytes_updated)
>> +               return;
>> +
>> +       tss = &__get_cpu_var(init_tss);
>> +
>> +       /* Update the TSS: */
>> +       if (t->io_bitmap_ptr)
>> +               memcpy(tss->io_bitmap, t->io_bitmap_ptr, bytes_updated);
>> +       else
>> +               memset(tss->io_bitmap, 0xff, bytes_updated);
>> +}
>> +
>>  /*
>>   * this changes the io permissions bitmap in the current task.
>>   */
>>  asmlinkage long sys_ioperm(unsigned long from, unsigned long num, int
>> turn_on)
>>  {
>>      struct thread_struct *t = &current->thread;
>> -    struct tss_struct *tss;
>>      unsigned int i, max_long, bytes, bytes_updated;
>>
>>      if ((from + num <= from) || (from + num > IO_BITMAP_BITS))
>> @@ -48,13 +64,13 @@ asmlinkage long sys_ioperm(unsigned long from,
>> unsigned long num, int turn_on)
>>      }
>>
>>      /*
>> -     * do it in the per-thread copy and in the TSS ...
>> +     * do it in the per-thread copy
>>       *
>> -     * Disable preemption via get_cpu() - we must not switch away
>> +     * Disable preemption - we must not switch away
>>       * because the ->io_bitmap_max value must match the bitmap
>>       * contents:
>>       */
>> -    tss = &per_cpu(init_tss, get_cpu());
>> +        preempt_disable();
>>
>>      if (turn_on)
>>              bitmap_clear(t->io_bitmap_ptr, from, num);
>> @@ -75,10 +91,9 @@ asmlinkage long sys_ioperm(unsigned long from,
>> unsigned long num, int turn_on)
>>
>>      t->io_bitmap_max = bytes;
>>
>> -    /* Update the TSS: */
>> -    memcpy(tss->io_bitmap, t->io_bitmap_ptr, bytes_updated);
>> +        set_io_bitmap(t, bytes_updated);
>>
>> -    put_cpu();
>> +        preempt_enable();
>>
>>      return 0;
>>  }
>> diff --git a/arch/x86/kernel/paravirt.c b/arch/x86/kernel/paravirt.c
>> index ab13760..aa420e7 100644
>> --- a/arch/x86/kernel/paravirt.c
>> +++ b/arch/x86/kernel/paravirt.c
>> @@ -391,6 +391,7 @@ struct pv_cpu_ops pv_cpu_ops = {
>>      .swapgs = native_swapgs,
>>
>>      .set_iopl_mask = native_set_iopl_mask,
>> +        .set_io_bitmap = native_set_io_bitmap,
>>      .io_delay = native_io_delay,
>>
>>      .start_context_switch = paravirt_nop,
>> diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c
>> index 1d92a5a..e8436cc 100644
>> --- a/arch/x86/kernel/process.c
>> +++ b/arch/x86/kernel/process.c
>> @@ -91,16 +91,12 @@ void exit_thread(void)
>>      unsigned long *bp = t->io_bitmap_ptr;
>>
>>      if (bp) {
>> -            struct tss_struct *tss = &per_cpu(init_tss, get_cpu());
>> -
>> +                preempt_disable();
>>              t->io_bitmap_ptr = NULL;
>>              clear_thread_flag(TIF_IO_BITMAP);
>> -            /*
>> -             * Careful, clear this in the TSS too:
>> -             */
>> -            memset(tss->io_bitmap, 0xff, t->io_bitmap_max);
>> +                set_io_bitmap(t, t->io_bitmap_max);
>>              t->io_bitmap_max = 0;
>> -            put_cpu();
>> +                preempt_enable();
>>              kfree(bp);
>>      }
>>  }
>> @@ -237,19 +233,11 @@ void __switch_to_xtra(struct task_struct *prev_p,
>> struct task_struct *next_p,
>>                      hard_enable_TSC();
>>      }
>>
>> -    if (test_tsk_thread_flag(next_p, TIF_IO_BITMAP)) {
>> -            /*
>> -             * Copy the relevant range of the IO bitmap.
>> -             * Normally this is 128 bytes or less:
>> -             */
>> -            memcpy(tss->io_bitmap, next->io_bitmap_ptr,
>> -                   max(prev->io_bitmap_max, next->io_bitmap_max));
>> -    } else if (test_tsk_thread_flag(prev_p, TIF_IO_BITMAP)) {
>> -            /*
>> -             * Clear any possible leftover bits:
>> -             */
>> -            memset(tss->io_bitmap, 0xff, prev->io_bitmap_max);
>> -    }
>> +        if (test_tsk_thread_flag(next_p, TIF_IO_BITMAP) ||
>> +            test_tsk_thread_flag(prev_p, TIF_IO_BITMAP))
>> +                set_io_bitmap(next,
>> +                              max(prev->io_bitmap_max,
>> next->io_bitmap_max));
>> +
>>      propagate_user_return_notify(prev_p, next_p);
>>  }
>>
>> diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
>> index 8853204..7a05509 100644
>> --- a/arch/x86/xen/enlighten.c
>> +++ b/arch/x86/xen/enlighten.c
>> @@ -808,6 +808,18 @@ static void xen_set_iopl_mask(unsigned mask)
>>      HYPERVISOR_physdev_op(PHYSDEVOP_set_iopl, &set_iopl);
>>  }
>>
>> +static void xen_set_io_bitmap(struct thread_struct *thread,
>> +    int changed, unsigned long bytes_updated)
>> +{
>> +    struct physdev_set_iobitmap set_iobitmap;
>> +
>> +    set_xen_guest_handle(set_iobitmap.bitmap,
>> +            (char *)thread->io_bitmap_ptr);
>> +    set_iobitmap.nr_ports = thread->io_bitmap_ptr ? IO_BITMAP_BITS : 0;
>> +    WARN_ON(HYPERVISOR_physdev_op(PHYSDEVOP_set_iobitmap,
>> +            &set_iobitmap));
>> +}
>> +
>>  static void xen_io_delay(void)
>>  {
>>  }
>> @@ -1117,6 +1129,7 @@ static const struct pv_cpu_ops xen_cpu_ops
>> __initconst = {
>>      .load_sp0 = xen_load_sp0,
>>
>>      .set_iopl_mask = xen_set_iopl_mask,
>> +    .set_io_bitmap = xen_set_io_bitmap,
>>      .io_delay = xen_io_delay,
>>
>>      /* Xen takes care of %gs when switching to usermode for us */

-- 
Pavel Mateja


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

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