All of lore.kernel.org
 help / color / mirror / Atom feed
From: Robin Murphy <robin.murphy@arm.com>
To: Marc Zyngier <marc.zyngier@arm.com>,
	linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	kvmarm@lists.cs.columbia.edu
Cc: Catalin Marinas <catalin.marinas@arm.com>,
	Will Deacon <will.deacon@arm.com>,
	Peter Maydell <peter.maydell@linaro.org>,
	Christoffer Dall <christoffer.dall@linaro.org>,
	Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>,
	Mark Rutland <mark.rutland@arm.com>,
	Ard Biesheuvel <ard.biesheuvel@linaro.org>,
	Jon Masters <jcm@redhat.com>
Subject: Re: [PATCH v2 15/16] arm/arm64: smccc: Implement SMCCC v1.1 inline primitive
Date: Mon, 29 Jan 2018 19:07:00 +0000	[thread overview]
Message-ID: <04d16ecd-044c-fe56-f9be-78d0cb591e71@arm.com> (raw)
In-Reply-To: <20180129174559.1866-16-marc.zyngier@arm.com>

On 29/01/18 17:45, Marc Zyngier wrote:
> One of the major improvement of SMCCC v1.1 is that it only clobbers
> the first 4 registers, both on 32 and 64bit. This means that it
> becomes very easy to provide an inline version of the SMC call
> primitive, and avoid performing a function call to stash the
> registers that would otherwise be clobbered by SMCCC v1.0.

This is disgusting... I love it :D

> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
> ---
>   include/linux/arm-smccc.h | 157 ++++++++++++++++++++++++++++++++++++++++++++++
>   1 file changed, 157 insertions(+)
> 
> diff --git a/include/linux/arm-smccc.h b/include/linux/arm-smccc.h
> index dd44d8458c04..bc5843728909 100644
> --- a/include/linux/arm-smccc.h
> +++ b/include/linux/arm-smccc.h
> @@ -150,5 +150,162 @@ asmlinkage void __arm_smccc_hvc(unsigned long a0, unsigned long a1,
>   
>   #define arm_smccc_hvc_quirk(...) __arm_smccc_hvc(__VA_ARGS__)
>   
> +/* SMCCC v1.1 implementation madness follows */
> +#ifdef CONFIG_ARM64
> +
> +#define SMCCC_SMC_INST	"smc	#0"
> +#define SMCCC_HVC_INST	"hvc	#0"
> +
> +#define __arm_smccc_1_1_prologue(inst)					\
> +	inst "\n"							\
> +	"cbz	%[ptr], 1f\n"						\
> +	"stp	%x[r0], %x[r1], %[ra0]\n"				\
> +	"stp	%x[r2], %x[r3], %[ra2]\n"				\
> +	"1:\n"								\
> +	: [ra0] "=Ump" (*(&___res->a0)),				\
> +	  [ra2] "=Ump" (*(&___res->a2)),

Rather than embedding a guaranteed spill to memory, I wonder if there's 
money in just always declaring r0-r3 as in-out operands, and propagating 
them by value afterwards, i.e.:

	asm(...);
	if (___res)
		*___res = (struct arm_smccc_res){ r0, r1, r2, r3 };

In theory, for sufficiently simple callers that might allow res to stay 
in registers for its entire lifetime and give nicer codegen. It *might* 
also simplify some of this macro machinery too, although at this point 
in the evening I can't really tell...

Robin.

> +
> +#define __arm_smccc_1_1_epilogue	: "memory"
> +		
> +#endif
> +
> +#ifdef CONFIG_ARM
> +#include <asm/opcodes-sec.h>
> +#include <asm/opcodes-virt.h>
> +
> +#define SMCCC_SMC_INST	__SMC(0)
> +#define SMCCC_HVC_INST	__HVC(0)
> +
> +#define __arm_smccc_1_1_prologue(inst)					\
> +	inst "\n"							\
> +	"cmp	%[ptr], #0\n"						\
> +	"stmne	%[ptr], {%[r0], %[r1], %[r2], %[r3]}\n"			\
> +	: "=m" (*___res),
> +
> +#define __arm_smccc_1_1_epilogue	: "memory", "cc"
> +		
> +#endif
> +
> +#define __constraint_write_0						\
> +	[r0] "+r" (r0), [r1] "=r" (r1), [r2] "=r" (r2), [r3] "=r" (r3)
> +#define __constraint_write_1						\
> +	[r0] "+r" (r0), [r1] "+r" (r1), [r2] "=r" (r2), [r3] "=r" (r3)
> +#define __constraint_write_2						\
> +	[r0] "+r" (r0), [r1] "+r" (r1), [r2] "+r" (r2), [r3] "=r" (r3)
> +#define __constraint_write_3						\
> +	[r0] "+r" (r0), [r1] "+r" (r1), [r2] "+r" (r2), [r3] "+r" (r3)
> +#define __constraint_write_4	__constraint_write_3
> +#define __constraint_write_5	__constraint_write_3
> +#define __constraint_write_6	__constraint_write_3
> +#define __constraint_write_7	__constraint_write_3
> +
> +#define __constraint_read_0	: [ptr] "r" (___res)
> +#define __constraint_read_1	__constraint_read_0
> +#define __constraint_read_2	__constraint_read_0
> +#define __constraint_read_3	__constraint_read_0
> +#define __constraint_read_4	__constraint_read_3, "r" (r4)
> +#define __constraint_read_5	__constraint_read_4, "r" (r5)
> +#define __constraint_read_6	__constraint_read_5, "r" (r6)
> +#define __constraint_read_7	__constraint_read_6, "r" (r7)
> +
> +#define ___count_args(_0, _1, _2, _3, _4, _5, _6, _7, _8, x, ...) x
> +
> +#define __count_args(...)						\
> +	___count_args(__VA_ARGS__, 7, 6, 5, 4, 3, 2, 1, 0)
> +
> +#define __declare_arg_0(a0, res)					\
> +	struct arm_smccc_res   *___res = res;				\
> +	register u32           r0 asm("r0") = a0;			\
> +	register unsigned long r1 asm("r1");				\
> +	register unsigned long r2 asm("r2");				\
> +	register unsigned long r3 asm("r3")
> +
> +#define __declare_arg_1(a0, a1, res)					\
> +	struct arm_smccc_res   *___res = res;				\
> +	register u32           r0 asm("r0") = a0;			\
> +	register typeof(a1)    r1 asm("r1") = a1;			\
> +	register unsigned long r2 asm("r2");				\
> +	register unsigned long r3 asm("r3")
> +
> +#define __declare_arg_2(a0, a1, a2, res)				\
> +	struct arm_smccc_res   *___res = res;				\
> +	register u32           r0 asm("r0") = a0;			\
> +	register typeof(a1)    r1 asm("r1") = a1;			\
> +	register typeof(a2)    r2 asm("r2") = a2;			\
> +	register unsigned long r3 asm("r3")
> +
> +#define __declare_arg_3(a0, a1, a2, a3, res)				\
> +	struct arm_smccc_res   *___res = res;				\
> +	register u32           r0 asm("r0") = a0;			\
> +	register typeof(a1)    r1 asm("r1") = a1;			\
> +	register typeof(a2)    r2 asm("r2") = a2;			\
> +	register typeof(a3)    r3 asm("r3") = a3
> +
> +#define __declare_arg_4(a0, a1, a2, a3, a4, res)			\
> +	__declare_arg_3(a0, a1, a2, a3, res);				\
> +	register typeof(a4) r4 asm("r4") = a4
> +
> +#define __declare_arg_5(a0, a1, a2, a3, a4, a5, res)			\
> +	__declare_arg_4(a0, a1, a2, a3, a4, res);			\
> +	register typeof(a5) r5 asm("r5") = a5
> +
> +#define __declare_arg_6(a0, a1, a2, a3, a4, a5, a6, res)		\
> +	__declare_arg_5(a0, a1, a2, a3, a4, a5, res);			\
> +	register typeof(a6) r6 asm("r6") = a6
> +
> +#define __declare_arg_7(a0, a1, a2, a3, a4, a5, a6, a7, res)		\
> +	__declare_arg_6(a0, a1, a2, a3, a4, a5, a6, res);		\
> +	register typeof(a7) r7 asm("r7") = a7
> +
> +#define ___declare_args(count, ...) __declare_arg_ ## count(__VA_ARGS__)
> +#define __declare_args(count, ...)  ___declare_args(count, __VA_ARGS__)
> +
> +#define ___constraint_write(count)  __constraint_write_ ## count
> +#define __constraint_write(count)   ___constraint_write(count)
> +
> +#define ___constraint_read(count)   __constraint_read_ ## count
> +#define __constraint_read(count)    ___constraint_read(count)
> +
> +#define __arm_smccc_1_1(inst, ...)					\
> +	do {								\
> +		__declare_args(__count_args(__VA_ARGS__), __VA_ARGS__);	\
> +		asm(__arm_smccc_1_1_prologue(inst)			\
> +		    __constraint_write(__count_args(__VA_ARGS__))	\
> +		    __constraint_read(__count_args(__VA_ARGS__))	\
> +		    __arm_smccc_1_1_epilogue);				\
> +	} while (0)
> +
> +/*
> + * arm_smccc_1_1_smc() - make an SMCCC v1.1 compliant SMC 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 is used to make SMC calls following SMC Calling Convention v1.1.
> + * The content of the supplied param are copied to registers 0 to 7 prior
> + * to the SMC instruction. The return values are updated with the content
> + * from register 0 to 3 on return from the SMC instruction if not NULL.
> + */
> +#define arm_smccc_1_1_smc(...)	__arm_smccc_1_1(SMCCC_SMC_INST, __VA_ARGS__)
> +
> +/*
> + * arm_smccc_1_1_hvc() - make an SMCCC v1.1 compliant HVC 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 is used to make HVC calls following SMC Calling Convention v1.1.
> + * The content of the supplied param are copied to registers 0 to 7 prior
> + * to the HVC instruction. The return values are updated with the content
> + * from register 0 to 3 on return from the HVC instruction if not NULL.
> + */
> +#define arm_smccc_1_1_hvc(...)	__arm_smccc_1_1(SMCCC_HVC_INST, __VA_ARGS__)
> +
>   #endif /*__ASSEMBLY__*/
>   #endif /*__LINUX_ARM_SMCCC_H*/
> 

WARNING: multiple messages have this Message-ID (diff)
From: robin.murphy@arm.com (Robin Murphy)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v2 15/16] arm/arm64: smccc: Implement SMCCC v1.1 inline primitive
Date: Mon, 29 Jan 2018 19:07:00 +0000	[thread overview]
Message-ID: <04d16ecd-044c-fe56-f9be-78d0cb591e71@arm.com> (raw)
In-Reply-To: <20180129174559.1866-16-marc.zyngier@arm.com>

On 29/01/18 17:45, Marc Zyngier wrote:
> One of the major improvement of SMCCC v1.1 is that it only clobbers
> the first 4 registers, both on 32 and 64bit. This means that it
> becomes very easy to provide an inline version of the SMC call
> primitive, and avoid performing a function call to stash the
> registers that would otherwise be clobbered by SMCCC v1.0.

This is disgusting... I love it :D

> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
> ---
>   include/linux/arm-smccc.h | 157 ++++++++++++++++++++++++++++++++++++++++++++++
>   1 file changed, 157 insertions(+)
> 
> diff --git a/include/linux/arm-smccc.h b/include/linux/arm-smccc.h
> index dd44d8458c04..bc5843728909 100644
> --- a/include/linux/arm-smccc.h
> +++ b/include/linux/arm-smccc.h
> @@ -150,5 +150,162 @@ asmlinkage void __arm_smccc_hvc(unsigned long a0, unsigned long a1,
>   
>   #define arm_smccc_hvc_quirk(...) __arm_smccc_hvc(__VA_ARGS__)
>   
> +/* SMCCC v1.1 implementation madness follows */
> +#ifdef CONFIG_ARM64
> +
> +#define SMCCC_SMC_INST	"smc	#0"
> +#define SMCCC_HVC_INST	"hvc	#0"
> +
> +#define __arm_smccc_1_1_prologue(inst)					\
> +	inst "\n"							\
> +	"cbz	%[ptr], 1f\n"						\
> +	"stp	%x[r0], %x[r1], %[ra0]\n"				\
> +	"stp	%x[r2], %x[r3], %[ra2]\n"				\
> +	"1:\n"								\
> +	: [ra0] "=Ump" (*(&___res->a0)),				\
> +	  [ra2] "=Ump" (*(&___res->a2)),

Rather than embedding a guaranteed spill to memory, I wonder if there's 
money in just always declaring r0-r3 as in-out operands, and propagating 
them by value afterwards, i.e.:

	asm(...);
	if (___res)
		*___res = (struct arm_smccc_res){ r0, r1, r2, r3 };

In theory, for sufficiently simple callers that might allow res to stay 
in registers for its entire lifetime and give nicer codegen. It *might* 
also simplify some of this macro machinery too, although at this point 
in the evening I can't really tell...

Robin.

> +
> +#define __arm_smccc_1_1_epilogue	: "memory"
> +		
> +#endif
> +
> +#ifdef CONFIG_ARM
> +#include <asm/opcodes-sec.h>
> +#include <asm/opcodes-virt.h>
> +
> +#define SMCCC_SMC_INST	__SMC(0)
> +#define SMCCC_HVC_INST	__HVC(0)
> +
> +#define __arm_smccc_1_1_prologue(inst)					\
> +	inst "\n"							\
> +	"cmp	%[ptr], #0\n"						\
> +	"stmne	%[ptr], {%[r0], %[r1], %[r2], %[r3]}\n"			\
> +	: "=m" (*___res),
> +
> +#define __arm_smccc_1_1_epilogue	: "memory", "cc"
> +		
> +#endif
> +
> +#define __constraint_write_0						\
> +	[r0] "+r" (r0), [r1] "=r" (r1), [r2] "=r" (r2), [r3] "=r" (r3)
> +#define __constraint_write_1						\
> +	[r0] "+r" (r0), [r1] "+r" (r1), [r2] "=r" (r2), [r3] "=r" (r3)
> +#define __constraint_write_2						\
> +	[r0] "+r" (r0), [r1] "+r" (r1), [r2] "+r" (r2), [r3] "=r" (r3)
> +#define __constraint_write_3						\
> +	[r0] "+r" (r0), [r1] "+r" (r1), [r2] "+r" (r2), [r3] "+r" (r3)
> +#define __constraint_write_4	__constraint_write_3
> +#define __constraint_write_5	__constraint_write_3
> +#define __constraint_write_6	__constraint_write_3
> +#define __constraint_write_7	__constraint_write_3
> +
> +#define __constraint_read_0	: [ptr] "r" (___res)
> +#define __constraint_read_1	__constraint_read_0
> +#define __constraint_read_2	__constraint_read_0
> +#define __constraint_read_3	__constraint_read_0
> +#define __constraint_read_4	__constraint_read_3, "r" (r4)
> +#define __constraint_read_5	__constraint_read_4, "r" (r5)
> +#define __constraint_read_6	__constraint_read_5, "r" (r6)
> +#define __constraint_read_7	__constraint_read_6, "r" (r7)
> +
> +#define ___count_args(_0, _1, _2, _3, _4, _5, _6, _7, _8, x, ...) x
> +
> +#define __count_args(...)						\
> +	___count_args(__VA_ARGS__, 7, 6, 5, 4, 3, 2, 1, 0)
> +
> +#define __declare_arg_0(a0, res)					\
> +	struct arm_smccc_res   *___res = res;				\
> +	register u32           r0 asm("r0") = a0;			\
> +	register unsigned long r1 asm("r1");				\
> +	register unsigned long r2 asm("r2");				\
> +	register unsigned long r3 asm("r3")
> +
> +#define __declare_arg_1(a0, a1, res)					\
> +	struct arm_smccc_res   *___res = res;				\
> +	register u32           r0 asm("r0") = a0;			\
> +	register typeof(a1)    r1 asm("r1") = a1;			\
> +	register unsigned long r2 asm("r2");				\
> +	register unsigned long r3 asm("r3")
> +
> +#define __declare_arg_2(a0, a1, a2, res)				\
> +	struct arm_smccc_res   *___res = res;				\
> +	register u32           r0 asm("r0") = a0;			\
> +	register typeof(a1)    r1 asm("r1") = a1;			\
> +	register typeof(a2)    r2 asm("r2") = a2;			\
> +	register unsigned long r3 asm("r3")
> +
> +#define __declare_arg_3(a0, a1, a2, a3, res)				\
> +	struct arm_smccc_res   *___res = res;				\
> +	register u32           r0 asm("r0") = a0;			\
> +	register typeof(a1)    r1 asm("r1") = a1;			\
> +	register typeof(a2)    r2 asm("r2") = a2;			\
> +	register typeof(a3)    r3 asm("r3") = a3
> +
> +#define __declare_arg_4(a0, a1, a2, a3, a4, res)			\
> +	__declare_arg_3(a0, a1, a2, a3, res);				\
> +	register typeof(a4) r4 asm("r4") = a4
> +
> +#define __declare_arg_5(a0, a1, a2, a3, a4, a5, res)			\
> +	__declare_arg_4(a0, a1, a2, a3, a4, res);			\
> +	register typeof(a5) r5 asm("r5") = a5
> +
> +#define __declare_arg_6(a0, a1, a2, a3, a4, a5, a6, res)		\
> +	__declare_arg_5(a0, a1, a2, a3, a4, a5, res);			\
> +	register typeof(a6) r6 asm("r6") = a6
> +
> +#define __declare_arg_7(a0, a1, a2, a3, a4, a5, a6, a7, res)		\
> +	__declare_arg_6(a0, a1, a2, a3, a4, a5, a6, res);		\
> +	register typeof(a7) r7 asm("r7") = a7
> +
> +#define ___declare_args(count, ...) __declare_arg_ ## count(__VA_ARGS__)
> +#define __declare_args(count, ...)  ___declare_args(count, __VA_ARGS__)
> +
> +#define ___constraint_write(count)  __constraint_write_ ## count
> +#define __constraint_write(count)   ___constraint_write(count)
> +
> +#define ___constraint_read(count)   __constraint_read_ ## count
> +#define __constraint_read(count)    ___constraint_read(count)
> +
> +#define __arm_smccc_1_1(inst, ...)					\
> +	do {								\
> +		__declare_args(__count_args(__VA_ARGS__), __VA_ARGS__);	\
> +		asm(__arm_smccc_1_1_prologue(inst)			\
> +		    __constraint_write(__count_args(__VA_ARGS__))	\
> +		    __constraint_read(__count_args(__VA_ARGS__))	\
> +		    __arm_smccc_1_1_epilogue);				\
> +	} while (0)
> +
> +/*
> + * arm_smccc_1_1_smc() - make an SMCCC v1.1 compliant SMC 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 is used to make SMC calls following SMC Calling Convention v1.1.
> + * The content of the supplied param are copied to registers 0 to 7 prior
> + * to the SMC instruction. The return values are updated with the content
> + * from register 0 to 3 on return from the SMC instruction if not NULL.
> + */
> +#define arm_smccc_1_1_smc(...)	__arm_smccc_1_1(SMCCC_SMC_INST, __VA_ARGS__)
> +
> +/*
> + * arm_smccc_1_1_hvc() - make an SMCCC v1.1 compliant HVC 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 is used to make HVC calls following SMC Calling Convention v1.1.
> + * The content of the supplied param are copied to registers 0 to 7 prior
> + * to the HVC instruction. The return values are updated with the content
> + * from register 0 to 3 on return from the HVC instruction if not NULL.
> + */
> +#define arm_smccc_1_1_hvc(...)	__arm_smccc_1_1(SMCCC_HVC_INST, __VA_ARGS__)
> +
>   #endif /*__ASSEMBLY__*/
>   #endif /*__LINUX_ARM_SMCCC_H*/
> 

  reply	other threads:[~2018-01-29 19:07 UTC|newest]

Thread overview: 116+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-01-29 17:45 [PATCH v2 00/16] arm64: Add SMCCC v1.1 support and CVE-2017-5715 (Spectre variant 2) mitigation Marc Zyngier
2018-01-29 17:45 ` Marc Zyngier
2018-01-29 17:45 ` [PATCH v2 01/16] arm64: KVM: Fix SMCCC handling of unimplemented SMC/HVC calls Marc Zyngier
2018-01-29 17:45   ` Marc Zyngier
2018-01-29 17:45 ` [PATCH v2 02/16] arm: " Marc Zyngier
2018-01-29 17:45   ` Marc Zyngier
2018-01-29 17:45   ` Marc Zyngier
2018-01-29 17:45 ` [PATCH v2 03/16] arm/arm64: KVM: Consolidate the PSCI include files Marc Zyngier
2018-01-29 17:45   ` Marc Zyngier
2018-01-29 17:45 ` [PATCH v2 04/16] arm/arm64: KVM: Add PSCI_VERSION helper Marc Zyngier
2018-01-29 17:45   ` Marc Zyngier
2018-01-29 17:45   ` Marc Zyngier
2018-01-30 13:15   ` Robin Murphy
2018-01-30 13:15     ` Robin Murphy
2018-01-30 14:52     ` Marc Zyngier
2018-01-30 14:52       ` Marc Zyngier
2018-01-29 17:45 ` [PATCH v2 05/16] arm/arm64: KVM: Add smccc accessors to PSCI code Marc Zyngier
2018-01-29 17:45   ` Marc Zyngier
2018-01-29 17:45 ` [PATCH v2 06/16] arm/arm64: KVM: Implement PSCI 1.0 support Marc Zyngier
2018-01-29 17:45   ` Marc Zyngier
2018-01-29 17:45 ` [PATCH v2 07/16] arm/arm64: KVM: Add PSCI version selection API Marc Zyngier
2018-01-29 17:45   ` Marc Zyngier
2018-01-31 17:38   ` Andrew Jones
2018-01-31 17:38     ` Andrew Jones
2018-01-31 17:45     ` Marc Zyngier
2018-01-31 17:45       ` Marc Zyngier
2018-01-31 18:03       ` Andrew Jones
2018-01-31 18:03         ` Andrew Jones
2018-01-31 18:03         ` Andrew Jones
2018-01-31 18:36         ` Marc Zyngier
2018-01-31 18:36           ` Marc Zyngier
2018-01-31 19:15           ` Andrew Jones
2018-01-31 19:15             ` Andrew Jones
2018-01-31 18:11   ` kbuild test robot
2018-01-31 18:11     ` kbuild test robot
2018-01-29 17:45 ` [PATCH v2 08/16] arm/arm64: KVM: Advertise SMCCC v1.1 Marc Zyngier
2018-01-29 17:45   ` Marc Zyngier
2018-01-30  0:23   ` Russell King - ARM Linux
2018-01-30  0:23     ` Russell King - ARM Linux
2018-01-30 12:28     ` Marc Zyngier
2018-01-30 12:28       ` Marc Zyngier
2018-01-30 12:28       ` Marc Zyngier
2018-01-29 17:45 ` [PATCH v2 09/16] arm/arm64: KVM: Turn kvm_psci_version into a static inline Marc Zyngier
2018-01-29 17:45   ` Marc Zyngier
2018-01-29 17:45 ` [PATCH v2 10/16] arm64: KVM: Report SMCCC_ARCH_WORKAROUND_1 BP hardening support Marc Zyngier
2018-01-29 17:45   ` Marc Zyngier
2018-01-30 12:38   ` Robin Murphy
2018-01-30 12:38     ` Robin Murphy
2018-01-29 17:45 ` [PATCH v2 11/16] arm64: KVM: Add SMCCC_ARCH_WORKAROUND_1 fast handling Marc Zyngier
2018-01-29 17:45   ` Marc Zyngier
2018-01-29 17:45   ` Marc Zyngier
2018-01-29 17:45 ` [PATCH v2 12/16] firmware/psci: Expose PSCI conduit Marc Zyngier
2018-01-29 17:45   ` Marc Zyngier
2018-01-29 17:45   ` Marc Zyngier
2018-01-29 17:55   ` Lorenzo Pieralisi
2018-01-29 17:55     ` Lorenzo Pieralisi
2018-01-29 17:45 ` [PATCH v2 13/16] firmware/psci: Expose SMCCC version through psci_ops Marc Zyngier
2018-01-29 17:45   ` Marc Zyngier
2018-01-29 17:45   ` Marc Zyngier
2018-01-29 18:39   ` Lorenzo Pieralisi
2018-01-29 18:39     ` Lorenzo Pieralisi
2018-01-30 12:09     ` Marc Zyngier
2018-01-30 12:09       ` Marc Zyngier
2018-01-30 12:55   ` Robin Murphy
2018-01-30 12:55     ` Robin Murphy
2018-01-30 13:51     ` Marc Zyngier
2018-01-30 13:51       ` Marc Zyngier
2018-01-29 17:45 ` [PATCH v2 14/16] arm/arm64: smccc: Make function identifiers an unsigned quantity Marc Zyngier
2018-01-29 17:45   ` Marc Zyngier
2018-01-29 17:45   ` Marc Zyngier
2018-01-29 17:45 ` [PATCH v2 15/16] arm/arm64: smccc: Implement SMCCC v1.1 inline primitive Marc Zyngier
2018-01-29 17:45   ` Marc Zyngier
2018-01-29 17:45   ` Marc Zyngier
2018-01-29 19:07   ` Robin Murphy [this message]
2018-01-29 19:07     ` Robin Murphy
2018-01-30  8:54     ` Marc Zyngier
2018-01-30  8:54       ` Marc Zyngier
2018-01-29 21:45   ` Ard Biesheuvel
2018-01-29 21:45     ` Ard Biesheuvel
2018-01-30 12:27     ` Marc Zyngier
2018-01-30 12:27       ` Marc Zyngier
2018-01-30 12:29       ` Ard Biesheuvel
2018-01-30 12:29         ` Ard Biesheuvel
2018-01-30 12:29         ` Ard Biesheuvel
2018-01-29 17:45 ` [PATCH v2 16/16] arm64: Add ARM_SMCCC_ARCH_WORKAROUND_1 BP hardening support Marc Zyngier
2018-01-29 17:45   ` Marc Zyngier
2018-01-29 17:45   ` Marc Zyngier
2018-01-29 19:41   ` Ard Biesheuvel
2018-01-29 19:41     ` Ard Biesheuvel
2018-01-30 12:10     ` Marc Zyngier
2018-01-30 12:10       ` Marc Zyngier
2018-01-31 13:56   ` Hanjun Guo
2018-01-31 13:56     ` Hanjun Guo
2018-01-31 13:56     ` Hanjun Guo
2018-01-31 14:11     ` Marc Zyngier
2018-01-31 14:11       ` Marc Zyngier
2018-01-31 14:35       ` Ard Biesheuvel
2018-01-31 14:35         ` Ard Biesheuvel
2018-01-31 14:38         ` Ard Biesheuvel
2018-01-31 14:38           ` Ard Biesheuvel
2018-01-31 15:05           ` Marc Zyngier
2018-01-31 15:05             ` Marc Zyngier
2018-02-01  2:40             ` Hanjun Guo
2018-02-01  2:40               ` Hanjun Guo
2018-02-01  6:52               ` Hanjun Guo
2018-02-01  6:52                 ` Hanjun Guo
2018-02-01  6:52                 ` Hanjun Guo
2018-02-01  8:53               ` Marc Zyngier
2018-02-01  8:53                 ` Marc Zyngier
2018-02-02  3:43                 ` Hanjun Guo
2018-02-02  3:43                   ` Hanjun Guo
2018-06-09 13:22 ` [PATCH v2 00/16] arm64: Add SMCCC v1.1 support and CVE-2017-5715 (Spectre variant 2) mitigation Jon Masters
2018-06-09 13:22   ` Jon Masters
2018-06-09 14:06   ` Marc Zyngier
2018-06-09 14:06     ` Marc Zyngier
2018-06-09 14:06     ` Marc Zyngier

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=04d16ecd-044c-fe56-f9be-78d0cb591e71@arm.com \
    --to=robin.murphy@arm.com \
    --cc=ard.biesheuvel@linaro.org \
    --cc=catalin.marinas@arm.com \
    --cc=christoffer.dall@linaro.org \
    --cc=jcm@redhat.com \
    --cc=kvmarm@lists.cs.columbia.edu \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lorenzo.pieralisi@arm.com \
    --cc=marc.zyngier@arm.com \
    --cc=mark.rutland@arm.com \
    --cc=peter.maydell@linaro.org \
    --cc=will.deacon@arm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.