Conversation
up_addrenv_va_to_pa() is declared in include/nuttx/arch.h but implemented only by armv7-a, so no arm64 port can map a virtual address to a physical one. A driver whose device addresses memory physically has nothing to call. The translation is asked of the MMU with AT S1E1R rather than walked in software, so it answers for whatever is actually mapped: any granule size, block or page, at any level, and it cannot drift from the tables in use. PAR_EL1 is one register per CPU, so nothing may run between the translation and reading the result. Interrupts are banked with it, so masking them locally is sufficient and SMP needs nothing further. Returns zero for an address that is not mapped for a privileged read, which is what the declaration in arch.h specifies. Note this differs from the armv7-a implementation, which returns the virtual address unchanged. Signed-off-by: Royyan Zahir <royzah@gmail.com>
…ual one. The ELE addresses memory physically; cache maintenance takes a virtual address. Both buffer calls supply one and use it for both, in opposite directions: get_random() runs up_flush_dcache() on a physical address, get_key() hands the enclave a virtual one. Both fail silently, and both are correct only while the two are equal. Take the virtual address in both, maintain the cache on it, and translate for the message. get_random() also gains the alignment check get_key() already has. Signed-off-by: Royyan Zahir <royzah@gmail.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
The ELE addresses memory physically. Cache maintenance takes a virtual address. The two buffer calls each supply one of them and use it for both purposes, in opposite directions.
imx9_ele_get_random()imx9_ele_get_key()up_flush_dcache()andup_invalidate_dcache()document their arguments as virtual. Soimx9_ele_get_random()maintains whatever lines its physical values happen to name, and a caller can read back what its own dirty line still holds rather than what the ELE wrote, with nothing reported anywhere.Both are correct only while the virtual and physical addresses are equal. That holds for the configurations in tree today. It does not hold for a kernel build with address environments.
Change
Both take the virtual address, maintain the cache on it, and translate for the message.
imx9_ele_get_random()also gains the cache line alignment checkimx9_ele_get_key()already has, because invalidating a partial line discards whatever shares it.imx9_ele_get_random()changes prototype. Neither function has an in-tree caller, so nothing else moves.Depends on
The arm64
up_addrenv_va_to_pa()in #20192, which is approved.Testing
Compiles for
imx93-evk:nsh. Not yet run on hardware, which is why this is a draft.