Implement Atomics Behavior#1
Draft
TYKUHN2 wants to merge 7 commits into
Draft
Conversation
Properly implemented Zalrsc pending testing. RL/AC flags are still missing, I'll have to read how to implement them. The notify is before the store, which could cause spurious failures if the store fails, but spec permits that :)
Fixed notify not triggering if TLB is missed due to split TLB.
Required adding new method to MemoryMappedDevice interface, but denying Zaamo with MemoryAccessViolation is acceptable. Devices where Compare and Set is possible (and easy) to implement have gotten implementations. Implemented a new test case for ByteBufferMemory to test storeCAS reference implementation (used elsewhere) works.
After reconsideration, emulation code is *very* unlikely to be short enough for the host to reorder emulated operations. Theoretically, it could be reordered, but emulation framework will likely more than fully occupy and reordering system. For the same reason, FENCE (FENCE.I is different) can remain NO-OP.
Turns out the byteBufferViewVarHandle does not support direct byte buffers. Replaced with an Unsafe call for slightly reduced (but should still be sufficient) functionality. Only Word and DoubleWord instructions exist so the RISC-V code shouldn't see a difference.
Fixed alignment testing errors in Zalrsc Fixed incorrect implementation for AMOSWAP.W Fixed missing sign extension for LR.W Fixed bounds check for storeCAS and notify. Added quick return in notify if nothing is in reservation set (mostly for debugging reasons.) Fixed storex using virtual address notification using a notify in both storex and storeSlow.
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.
(Copied from upstream)
Implemented full atomics behavior (minus RL/AC) for potential future multicore support.
Zalrsc was implemented by emulating bus snooping with a notify function. When multicore is implemented, the notify mechanism will have to be improved.
Zaamo was implemented using Java features including VarHandle and Unsafe. Unsafe only has support for word and double word. Some devices were omitted (throws MemoryAccessException) due to being out of scope. VirtIO is currently omitted because I am unfamiliar and am not sure if implementing it makes sense.
Direct test for ByteBufferMemory atomic support added with aggressive data racing to verify functionality. No new tests specific to the Zaamo instructions added. I have made tests for Zalrsc that verify they work, but I have not committed them. Existing Zalrsc tests fail, but when recompiled from source they succeed.
Zawrs and Zacas were never defined within the emulator so I haven't implemented them.
FENCE, FENCE.I and RL/AC flags for A instructions are not implemented (NOPs) because, realistically, the emulator's overhead will prevent the spatial/temporal locality that necessitates such features.
Tasks: