mirror of
https://github.com/kata-containers/kata-containers.git
synced 2025-09-15 22:08:47 +00:00
kernel: PTP_KVM support for arm/arm64 in Kata
This work patched the 4.19, 5.4 and 5.10 kernels, and now ptp_kvm can work correctly when the host and guest use different kernel versions.. Fixes: #2123 Signed-off-by: Damon Kwok <damon-kwok@outlook.com>
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -1,81 +0,0 @@
|
||||
From 3d1d7f8922ed2f080f6d8e08df0d51e22f9590ec Mon Sep 17 00:00:00 2001
|
||||
From: Jianyong Wu <jianyong.wu@arm.com>
|
||||
Date: Wed, 1 Apr 2020 15:19:29 +0800
|
||||
Subject: [PATCH 1/9] arm/arm64: Provide a wrapper for SMCCC 1.1 calls
|
||||
|
||||
From: Steven Price <steven.price@arm.com>
|
||||
|
||||
SMCCC 1.1 calls may use either HVC or SMC depending on the PSCI
|
||||
conduit. Rather than coding this in every call site, provide a macro
|
||||
which uses the correct instruction. The macro also handles the case
|
||||
where no conduit is configured/available returning a not supported error
|
||||
in res, along with returning the conduit used for the call.
|
||||
|
||||
This allow us to remove some duplicated code and will be useful later
|
||||
when adding paravirtualized time hypervisor calls.
|
||||
|
||||
Signed-off-by: Steven Price <steven.price@arm.com>
|
||||
Acked-by: Will Deacon <will@kernel.org>
|
||||
Signed-off-by: Marc Zyngier <maz@kernel.org>
|
||||
---
|
||||
include/linux/arm-smccc.h | 45 +++++++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 45 insertions(+)
|
||||
|
||||
diff --git a/include/linux/arm-smccc.h b/include/linux/arm-smccc.h
|
||||
index 080012a6f025..131edde5d37e 100644
|
||||
--- a/include/linux/arm-smccc.h
|
||||
+++ b/include/linux/arm-smccc.h
|
||||
@@ -302,5 +302,50 @@ asmlinkage void __arm_smccc_hvc(unsigned long a0, unsigned long a1,
|
||||
#define SMCCC_RET_NOT_SUPPORTED -1
|
||||
#define SMCCC_RET_NOT_REQUIRED -2
|
||||
|
||||
+/*
|
||||
+ * Like arm_smccc_1_1* but always returns SMCCC_RET_NOT_SUPPORTED.
|
||||
+ * Used when the SMCCC conduit is not defined. The empty asm statement
|
||||
+ * avoids compiler warnings about unused variables.
|
||||
+ */
|
||||
+#define __fail_smccc_1_1(...) \
|
||||
+ do { \
|
||||
+ __declare_args(__count_args(__VA_ARGS__), __VA_ARGS__); \
|
||||
+ asm ("" __constraints(__count_args(__VA_ARGS__))); \
|
||||
+ if (___res) \
|
||||
+ ___res->a0 = SMCCC_RET_NOT_SUPPORTED; \
|
||||
+ } while (0)
|
||||
+
|
||||
+/*
|
||||
+ * arm_smccc_1_1_invoke() - make an SMCCC v1.1 compliant call
|
||||
+ *
|
||||
+ * This is a variadic macro taking one to eight source arguments, and
|
||||
+ * an optional return structure.
|
||||
+ *
|
||||
+ * @a0-a7: arguments passed in registers 0 to 7
|
||||
+ * @res: result values from registers 0 to 3
|
||||
+ *
|
||||
+ * This macro will make either an HVC call or an SMC call depending on the
|
||||
+ * current SMCCC conduit. If no valid conduit is available then -1
|
||||
+ * (SMCCC_RET_NOT_SUPPORTED) is returned in @res.a0 (if supplied).
|
||||
+ *
|
||||
+ * The return value also provides the conduit that was used.
|
||||
+ */
|
||||
+#define arm_smccc_1_1_invoke(...) ({ \
|
||||
+ int method = arm_smccc_1_1_get_conduit(); \
|
||||
+ switch (method) { \
|
||||
+ case SMCCC_CONDUIT_HVC: \
|
||||
+ arm_smccc_1_1_hvc(__VA_ARGS__); \
|
||||
+ break; \
|
||||
+ case SMCCC_CONDUIT_SMC: \
|
||||
+ arm_smccc_1_1_smc(__VA_ARGS__); \
|
||||
+ break; \
|
||||
+ default: \
|
||||
+ __fail_smccc_1_1(__VA_ARGS__); \
|
||||
+ method = SMCCC_CONDUIT_NONE; \
|
||||
+ break; \
|
||||
+ } \
|
||||
+ method; \
|
||||
+ })
|
||||
+
|
||||
#endif /*__ASSEMBLY__*/
|
||||
#endif /*__LINUX_ARM_SMCCC_H*/
|
||||
--
|
||||
2.17.1
|
||||
|
@@ -1,81 +0,0 @@
|
||||
From b830806f5cd02119be9b25812b3ea56d97cd08f3 Mon Sep 17 00:00:00 2001
|
||||
From: Mark Rutland <mark.rutland@arm.com>
|
||||
Date: Fri, 9 Aug 2019 14:22:40 +0100
|
||||
Subject: [PATCH 2/9] arm/arm64: smccc/psci: add arm_smccc_1_1_get_conduit()
|
||||
|
||||
SMCCC callers are currently amassing a collection of enums for the SMCCC
|
||||
conduit, and are having to dig into the PSCI driver's internals in order
|
||||
to figure out what to do.
|
||||
|
||||
Let's clean this up, with common SMCCC_CONDUIT_* definitions, and an
|
||||
arm_smccc_1_1_get_conduit() helper that abstracts the PSCI driver's
|
||||
internal state.
|
||||
|
||||
We can kill off the PSCI_CONDUIT_* definitions once we've migrated users
|
||||
over to the new interface.
|
||||
|
||||
Signed-off-by: Mark Rutland <mark.rutland@arm.com>
|
||||
Acked-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
|
||||
Acked-by: Will Deacon <will.deacon@arm.com>
|
||||
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
|
||||
---
|
||||
drivers/firmware/psci/psci.c | 15 +++++++++++++++
|
||||
include/linux/arm-smccc.h | 16 ++++++++++++++++
|
||||
2 files changed, 31 insertions(+)
|
||||
|
||||
diff --git a/drivers/firmware/psci/psci.c b/drivers/firmware/psci/psci.c
|
||||
index 84f4ff351c62..eb797081d159 100644
|
||||
--- a/drivers/firmware/psci/psci.c
|
||||
+++ b/drivers/firmware/psci/psci.c
|
||||
@@ -57,6 +57,21 @@ struct psci_operations psci_ops = {
|
||||
.smccc_version = SMCCC_VERSION_1_0,
|
||||
};
|
||||
|
||||
+enum arm_smccc_conduit arm_smccc_1_1_get_conduit(void)
|
||||
+{
|
||||
+ if (psci_ops.smccc_version < SMCCC_VERSION_1_1)
|
||||
+ return SMCCC_CONDUIT_NONE;
|
||||
+
|
||||
+ switch (psci_ops.conduit) {
|
||||
+ case PSCI_CONDUIT_SMC:
|
||||
+ return SMCCC_CONDUIT_SMC;
|
||||
+ case PSCI_CONDUIT_HVC:
|
||||
+ return SMCCC_CONDUIT_HVC;
|
||||
+ default:
|
||||
+ return SMCCC_CONDUIT_NONE;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
typedef unsigned long (psci_fn)(unsigned long, unsigned long,
|
||||
unsigned long, unsigned long);
|
||||
static psci_fn *invoke_psci_fn;
|
||||
diff --git a/include/linux/arm-smccc.h b/include/linux/arm-smccc.h
|
||||
index 131edde5d37e..e6d4cb4f61f1 100644
|
||||
--- a/include/linux/arm-smccc.h
|
||||
+++ b/include/linux/arm-smccc.h
|
||||
@@ -80,6 +80,22 @@
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <linux/types.h>
|
||||
+
|
||||
+enum arm_smccc_conduit {
|
||||
+ SMCCC_CONDUIT_NONE,
|
||||
+ SMCCC_CONDUIT_SMC,
|
||||
+ SMCCC_CONDUIT_HVC,
|
||||
+};
|
||||
+
|
||||
+/**
|
||||
+ * arm_smccc_1_1_get_conduit()
|
||||
+ *
|
||||
+ * Returns the conduit to be used for SMCCCv1.1 or later.
|
||||
+ *
|
||||
+ * When SMCCCv1.1 is not present, returns SMCCC_CONDUIT_NONE.
|
||||
+ */
|
||||
+enum arm_smccc_conduit arm_smccc_1_1_get_conduit(void);
|
||||
+
|
||||
/**
|
||||
* struct arm_smccc_res - Result from SMC/HVC call
|
||||
* @a0-a3 result values from registers 0 to 3
|
||||
--
|
||||
2.17.1
|
||||
|
Reference in New Issue
Block a user