[PATCH v5 05/19] arm64: Detect if in a realm and set RIPAS RAM
Shanker Donthineni
sdonthineni at nvidia.com
Mon Sep 9 08:15:39 PDT 2024
Hi Steven,
On 8/19/24 09:10, Steven Price wrote:
> External email: Use caution opening links or attachments
>
>
> On 19/08/2024 15:04, Suzuki K Poulose wrote:
>> Hi Steven
>>
>> On 19/08/2024 14:19, Steven Price wrote:
>>> From: Suzuki K Poulose <suzuki.poulose at arm.com>
>>>
>>> Detect that the VM is a realm guest by the presence of the RSI
>>> interface.
>>>
>>> If in a realm then all memory needs to be marked as RIPAS RAM initially,
>>> the loader may or may not have done this for us. To be sure iterate over
>>> all RAM and mark it as such. Any failure is fatal as that implies the
>>> RAM regions passed to Linux are incorrect - which would mean failing
>>> later when attempting to access non-existent RAM.
>>>
>>> Signed-off-by: Suzuki K Poulose <suzuki.poulose at arm.com>
>>> Co-developed-by: Steven Price <steven.price at arm.com>
>>> Signed-off-by: Steven Price <steven.price at arm.com>
>>> ---
>>> Changes since v4:
>>> * Minor tidy ups.
>>> Changes since v3:
>>> * Provide safe/unsafe versions for converting memory to protected,
>>> using the safer version only for the early boot.
>>> * Use the new psci_early_test_conduit() function to avoid calling an
>>> SMC if EL3 is not present (or not configured to handle an SMC).
>>> Changes since v2:
>>> * Use DECLARE_STATIC_KEY_FALSE rather than "extern struct
>>> static_key_false".
>>> * Rename set_memory_range() to rsi_set_memory_range().
>>> * Downgrade some BUG()s to WARN()s and handle the condition by
>>> propagating up the stack. Comment the remaining case that ends in a
>>> BUG() to explain why.
>>> * Rely on the return from rsi_request_version() rather than checking
>>> the version the RMM claims to support.
>>> * Rename the generic sounding arm64_setup_memory() to
>>> arm64_rsi_setup_memory() and move the call site to setup_arch().
>>> ---
>>> arch/arm64/include/asm/rsi.h | 65 ++++++++++++++++++++++++++++++
>>> arch/arm64/kernel/Makefile | 3 +-
>>> arch/arm64/kernel/rsi.c | 78 ++++++++++++++++++++++++++++++++++++
>>> arch/arm64/kernel/setup.c | 8 ++++
>>> 4 files changed, 153 insertions(+), 1 deletion(-)
>>> create mode 100644 arch/arm64/include/asm/rsi.h
>>> create mode 100644 arch/arm64/kernel/rsi.c
>>>
>>> diff --git a/arch/arm64/include/asm/rsi.h b/arch/arm64/include/asm/rsi.h
>>> new file mode 100644
>>> index 000000000000..2bc013badbc3
>>> --- /dev/null
>>> +++ b/arch/arm64/include/asm/rsi.h
>>> @@ -0,0 +1,65 @@
>>> +/* SPDX-License-Identifier: GPL-2.0-only */
>>> +/*
>>> + * Copyright (C) 2024 ARM Ltd.
>>> + */
>>> +
>>> +#ifndef __ASM_RSI_H_
>>> +#define __ASM_RSI_H_
>>> +
>>> +#include <linux/jump_label.h>
>>> +#include <asm/rsi_cmds.h>
The error number macros are used in this file, but the header file
'<linux/errno.h>' is not included.
>>> +
>>> +DECLARE_STATIC_KEY_FALSE(rsi_present);
>>> +
>>> +void __init arm64_rsi_init(void);
>>> +void __init arm64_rsi_setup_memory(void);
>>> +static inline bool is_realm_world(void)
>>> +{
>>> + return static_branch_unlikely(&rsi_present);
>>> +}
>>> +
>>> +static inline int rsi_set_memory_range(phys_addr_t start, phys_addr_t
>>> end,
>>> + enum ripas state, unsigned long flags)
>>> +{
>>> + unsigned long ret;
>>> + phys_addr_t top;
>>> +
>>> + while (start != end) {
>>> + ret = rsi_set_addr_range_state(start, end, state, flags, &top);
>>> + if (WARN_ON(ret || top < start || top > end))
>>> + return -EINVAL;
>>> + start = top;
>>> + }
>>> +
>>> + return 0;
-Shanker
More information about the linux-arm-kernel
mailing list