Thread (25 messages) 25 messages, 5 authors, 2025-02-27

Re: [PATCH v7 09/11] arm64: Enable memory encrypt for Realms

From: Catalin Marinas <catalin.marinas@arm.com>
Date: 2025-02-27 21:21:17
Also in: kvm, kvmarm, linux-coco, lkml

On Thu, Feb 27, 2025 at 05:22:55PM +0000, Will Deacon wrote:
On Thu, Feb 27, 2025 at 10:55:00AM +0000, Catalin Marinas wrote:
quoted
On Thu, Feb 27, 2025 at 12:23:31AM +0000, Will Deacon wrote:
quoted
On Wed, Feb 26, 2025 at 07:03:01PM +0000, Catalin Marinas wrote:
quoted
On Wed, Feb 19, 2025 at 02:30:28PM +0000, Steven Price wrote:
quoted
quoted
@@ -23,14 +25,16 @@ bool rodata_full __ro_after_init = IS_ENABLED(CONFIG_RODATA_FULL_DEFAULT_ENABLED
 bool can_set_direct_map(void)
 {
 	/*
-	 * rodata_full and DEBUG_PAGEALLOC require linear map to be
-	 * mapped at page granularity, so that it is possible to
+	 * rodata_full, DEBUG_PAGEALLOC and a Realm guest all require linear
+	 * map to be mapped at page granularity, so that it is possible to
 	 * protect/unprotect single pages.
 	 *
 	 * KFENCE pool requires page-granular mapping if initialized late.
+	 *
+	 * Realms need to make pages shared/protected at page granularity.
 	 */
 	return rodata_full || debug_pagealloc_enabled() ||
-	       arm64_kfence_can_set_direct_map();
+		arm64_kfence_can_set_direct_map() || is_realm_world();
 }
Aneesh pointed out that this call to is_realm_world() is now too early 
since the decision to delay the RSI detection. The upshot is that a 
realm guest which doesn't have page granularity forced for other reasons 
will fail to share pages with the host.

At the moment I can think of a couple of options:

(1) Make rodata_full a requirement for realm guests. 
    CONFIG_RODATA_FULL_DEFAULT_ENABLED is already "default y" so this 
    isn't a big ask.

(2) Revisit the idea of detecting when running as a realm guest early. 
    This has the advantage of also "fixing" earlycon (no need to 
    manually specify the shared-alias of an unprotected UART).

I'm currently leaning towards (1) because it's the default anyway. But 
if we're going to need to fix earlycon (or indeed find other similar 
issues) then (2) would obviously make sense.
I'd go with (1) since the end result is the same even if we implemented
(2) - i.e. we still avoid block mappings in realms.
Is it, though? The config option is about the default behaviour but there's
still an "rodata=" option on the command-line.
Yeah, that's why I suggested the pr_err() to only state that it cannot
set the direct map and consider rodata=full rather than a config option.
We already force CONFIG_STRICT_KERNEL_RWX.
rodata=full has absolutely nothing to do with realms, though.
I fully agree, that's what I said a couple of emails earlier (towards
the end, not quoted above).
It just
happens to result in the linear map being created at page granularity
and I don't think we should expose that implementation detail like this.
I wasn't keen on adding a new realms=on or whatever command line option,
so I suggested the lazy but confusing rodata=full.
quoted
But we can also revisit the decision not to probe the RSI early.
Alternatively, could we predicate realm support on BBM level-3 w/o TLB
conflicts? Then we could crack the blocks in the linear map.
Long term, I agree that's a better option. It needs wiring up though,
with some care to handle page table allocation failures at run-time. I
think most callers already handle the return code from set_memory_*().

-- 
Catalin
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help