Re: [edk2] [PATCH v2] ArmPkg/TimerDxe: remove workaround for KVM timer handling

2018-04-23 Thread Julien Grall



On 19/04/18 15:34, Ard Biesheuvel wrote:

On 19 April 2018 at 16:23, Julien Grall  wrote:

Hi Ard,

Sorry for the late reply.

On 19/04/18 09:16, Ard Biesheuvel wrote:


On 17 April 2018 at 08:03, Ard Biesheuvel 
wrote:


When we first ported EDK2 to KVM/arm, we implemented a workaround for
the quirky timer handling on the KVM side. This has been fixed in
Linux commit f120cd6533d2 ("KVM: arm/arm64: timer: Allow the timer to
control the active state") dated 23 June 2014, which was incorporated
into Linux release 4.3.

So almost 4 years later, it should be safe to drop this workaround on
the EDK2 side.

This reverts commit b1a633434ddc.

Cc: cross-dis...@lists.linaro.org
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ard Biesheuvel 
Acked-by: Marc Zyngier 
Reviewed-by: Leif Lindholm 
Acked-by: Laszlo Ersek 



Pushed as 411a373ed6426fb1bff253905b6a59ada44e18ad



While this was added for KVM, I believe that code is also needed by Xen.
Indeed before injecting the interrupt the hypervisor will mask the
interrupt.

So would it be possible to revert that patch?



Given that this is now a Xen-only quirk, I'd rather work around it by
creating a separate ArmGenericTimerCounterLib implementation for Xen.


That would work for me.



I will try to put something together beginning of next week.


I am happy to test it.

Cheers,

--
Julien Grall
___
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel


Re: [edk2] [PATCH v2] ArmPkg/TimerDxe: remove workaround for KVM timer handling

2018-04-19 Thread Julien Grall

Hi Ard,

Sorry for the late reply.

On 19/04/18 09:16, Ard Biesheuvel wrote:

On 17 April 2018 at 08:03, Ard Biesheuvel  wrote:

When we first ported EDK2 to KVM/arm, we implemented a workaround for
the quirky timer handling on the KVM side. This has been fixed in
Linux commit f120cd6533d2 ("KVM: arm/arm64: timer: Allow the timer to
control the active state") dated 23 June 2014, which was incorporated
into Linux release 4.3.

So almost 4 years later, it should be safe to drop this workaround on
the EDK2 side.

This reverts commit b1a633434ddc.

Cc: cross-dis...@lists.linaro.org
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ard Biesheuvel 
Acked-by: Marc Zyngier 
Reviewed-by: Leif Lindholm 
Acked-by: Laszlo Ersek 


Pushed as 411a373ed6426fb1bff253905b6a59ada44e18ad


While this was added for KVM, I believe that code is also needed by Xen. 
Indeed before injecting the interrupt the hypervisor will mask the 
interrupt.


So would it be possible to revert that patch?

Cheers,



Thanks all


---
v2: add acks

Note to cross-distro readers: this means guest firmware built with this patch
will not work on KVM/ARM hosts using kernel v4.2 or earlier.

  ArmPkg/Drivers/TimerDxe/TimerDxe.c   
|  1 -
  ArmPkg/Library/ArmGenericTimerVirtCounterLib/ArmGenericTimerVirtCounterLib.c 
| 10 --
  2 files changed, 11 deletions(-)

diff --git a/ArmPkg/Drivers/TimerDxe/TimerDxe.c 
b/ArmPkg/Drivers/TimerDxe/TimerDxe.c
index a3202fa056f3..bd616d2efc73 100644
--- a/ArmPkg/Drivers/TimerDxe/TimerDxe.c
+++ b/ArmPkg/Drivers/TimerDxe/TimerDxe.c
@@ -337,7 +337,6 @@ TimerInterruptHandler (

  // Set next compare value
  ArmGenericTimerSetCompareVal (CompareValue);
-ArmGenericTimerEnableTimer ();
  ArmInstructionSynchronizationBarrier ();
}

diff --git 
a/ArmPkg/Library/ArmGenericTimerVirtCounterLib/ArmGenericTimerVirtCounterLib.c 
b/ArmPkg/Library/ArmGenericTimerVirtCounterLib/ArmGenericTimerVirtCounterLib.c
index 69a4ceb62db6..c941895a3574 100644
--- 
a/ArmPkg/Library/ArmGenericTimerVirtCounterLib/ArmGenericTimerVirtCounterLib.c
+++ 
b/ArmPkg/Library/ArmGenericTimerVirtCounterLib/ArmGenericTimerVirtCounterLib.c
@@ -26,16 +26,6 @@ ArmGenericTimerEnableTimer (

TimerCtrlReg = ArmReadCntvCtl ();
TimerCtrlReg |= ARM_ARCH_TIMER_ENABLE;
-
-  //
-  // When running under KVM, we need to unmask the interrupt on the timer side
-  // as KVM will mask it when servicing the interrupt at the hypervisor level
-  // and delivering the virtual timer interrupt to the guest. Otherwise, the
-  // interrupt will fire again, trapping into the hypervisor again, etc. etc.
-  // This is scheduled to be fixed on the KVM side, but there is no harm in
-  // leaving this in once KVM gets fixed.
-  //
-  TimerCtrlReg &= ~ARM_ARCH_TIMER_IMASK;
ArmWriteCntvCtl (TimerCtrlReg);
  }

--
2.17.0


___
cross-distro mailing list
cross-dis...@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/cross-distro



--
Julien Grall
___
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel


Re: [edk2] [PATCH v2] ArmPkg/TimerDxe: remove workaround for KVM timer handling

2018-04-19 Thread Ard Biesheuvel
On 17 April 2018 at 08:03, Ard Biesheuvel  wrote:
> When we first ported EDK2 to KVM/arm, we implemented a workaround for
> the quirky timer handling on the KVM side. This has been fixed in
> Linux commit f120cd6533d2 ("KVM: arm/arm64: timer: Allow the timer to
> control the active state") dated 23 June 2014, which was incorporated
> into Linux release 4.3.
>
> So almost 4 years later, it should be safe to drop this workaround on
> the EDK2 side.
>
> This reverts commit b1a633434ddc.
>
> Cc: cross-dis...@lists.linaro.org
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Ard Biesheuvel 
> Acked-by: Marc Zyngier 
> Reviewed-by: Leif Lindholm 
> Acked-by: Laszlo Ersek 

Pushed as 411a373ed6426fb1bff253905b6a59ada44e18ad

Thanks all

> ---
> v2: add acks
>
> Note to cross-distro readers: this means guest firmware built with this patch
> will not work on KVM/ARM hosts using kernel v4.2 or earlier.
>
>  ArmPkg/Drivers/TimerDxe/TimerDxe.c   
> |  1 -
>  ArmPkg/Library/ArmGenericTimerVirtCounterLib/ArmGenericTimerVirtCounterLib.c 
> | 10 --
>  2 files changed, 11 deletions(-)
>
> diff --git a/ArmPkg/Drivers/TimerDxe/TimerDxe.c 
> b/ArmPkg/Drivers/TimerDxe/TimerDxe.c
> index a3202fa056f3..bd616d2efc73 100644
> --- a/ArmPkg/Drivers/TimerDxe/TimerDxe.c
> +++ b/ArmPkg/Drivers/TimerDxe/TimerDxe.c
> @@ -337,7 +337,6 @@ TimerInterruptHandler (
>
>  // Set next compare value
>  ArmGenericTimerSetCompareVal (CompareValue);
> -ArmGenericTimerEnableTimer ();
>  ArmInstructionSynchronizationBarrier ();
>}
>
> diff --git 
> a/ArmPkg/Library/ArmGenericTimerVirtCounterLib/ArmGenericTimerVirtCounterLib.c
>  
> b/ArmPkg/Library/ArmGenericTimerVirtCounterLib/ArmGenericTimerVirtCounterLib.c
> index 69a4ceb62db6..c941895a3574 100644
> --- 
> a/ArmPkg/Library/ArmGenericTimerVirtCounterLib/ArmGenericTimerVirtCounterLib.c
> +++ 
> b/ArmPkg/Library/ArmGenericTimerVirtCounterLib/ArmGenericTimerVirtCounterLib.c
> @@ -26,16 +26,6 @@ ArmGenericTimerEnableTimer (
>
>TimerCtrlReg = ArmReadCntvCtl ();
>TimerCtrlReg |= ARM_ARCH_TIMER_ENABLE;
> -
> -  //
> -  // When running under KVM, we need to unmask the interrupt on the timer 
> side
> -  // as KVM will mask it when servicing the interrupt at the hypervisor level
> -  // and delivering the virtual timer interrupt to the guest. Otherwise, the
> -  // interrupt will fire again, trapping into the hypervisor again, etc. etc.
> -  // This is scheduled to be fixed on the KVM side, but there is no harm in
> -  // leaving this in once KVM gets fixed.
> -  //
> -  TimerCtrlReg &= ~ARM_ARCH_TIMER_IMASK;
>ArmWriteCntvCtl (TimerCtrlReg);
>  }
>
> --
> 2.17.0
>
___
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel