-
Notifications
You must be signed in to change notification settings - Fork 82
Basic Virtual Memory Implementation Fixes & Improvements #165
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Conversation
|
Notice that address sanitizer is failing in CI. |
src/gui/windows/tlb/tlbview.h
Outdated
| void tlb_update(unsigned way, unsigned set, bool valid, unsigned asid, quint64 vpn, quint64 phys, bool write); | ||
|
|
||
| private: | ||
| const machine::TLB *tlb; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Who owns this pointer?
src/machine/memory/tlb/tlb.h
Outdated
| #include <cstdint> | ||
|
|
||
| namespace machine { | ||
| enum TLBType { PROGRAM, DATA }; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why does LTB need to know this?
|
@jdupak thanks for review of interfacing to the memory model architecture. |
|
From my side, the changes to the processor pipeline diagram has been applied directly to the SVG files (src/gui/windows/coreview/schemas), but current design uses DRAW.IO source (extras/core_graphics) as the authoritative source of the pipeline visualization and SVGs are generated from this file. So the commit with SVG change should include |
|
For memory view, I would not complicate it with |
0bb04d1 to
ca4300b
Compare
ca4300b to
a6cbf71
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There is a typo in the dir name
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There is no cmake logic to run these tests. I think we want to run them as cli tests.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thank you for the comment. I’ve added the CMake logic to run these as CLI tests in the commit 7a204cf.
a6cbf71 to
bc32933
Compare
|
I pushed some slight edits. Barring the issue with new tests not being run I am fine with merging this. |
|
I am going through the code. I have one overall remark, that there are lot of formatting changes included in functional changes. I am not reluctant to formatting changes even that I think that sometimes formatting left by human to align for example some case lines into columns etc. has some value. But formatting changes unrelated to the functional changes make review harder. So I would keep with patches as they are but I would suggest to separate formatting, even over all later modified files in series, separate from functional changes. |
|
I am do not like As for enabling cache for accesses there is a hack in the QtRvSim which enforces next uncached region In the longer term, cacheability should be controlled from page tables. But
But the physical region marked to skip caching in cache implementation (current state) should be enough for now. |
|
Not so critical for now, but should be solved in the longer time perspective. The behavior of |
|
It seems that TLBs are updated from the start of the system. The TLB and its updates should be enable only when root register is set. And they should not be updated in |
|
There is one actual issue from CI: you cannot use ftruncate. It fails compilation on Win. |
Never mind, this is broken on master. I will fix that. It does not block this PR. |
c846a9e to
442a091
Compare
3238c4f to
62777b5
Compare
62777b5 to
6c37dd9
Compare
6c37dd9 to
861f836
Compare
ppisa
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks to @nemecad for the virtual memory implementation. The code is clean and readable in general. Thanks to @jdupak for review and formatting.
There are some minor issues to resolve or discuss. Same some suggestion to history cleanup but I think that we can merge code soon.
To speedup discussion, I would like to meet or call with @nemecad.
But congratulation to good job generally. As the next step I would like to discuss possibility to work on Sv39 which would allow to test some more real operating system scenarios.
src/machine/memory/tlb/tlb.cpp
Outdated
|
|
||
| namespace machine { | ||
|
|
||
| static bool is_mmio_region(uint64_t virt) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This function should be removed from the history. The logic is corrected by the commit 667bd4f
But it would be much better, if it does not appear in the history at all.
src/machine/memory/tlb/tlb.cpp
Outdated
| return false; | ||
| } | ||
|
|
||
| static Address bypass_mmio(Address vaddr) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
dtto
| mem = machine->cache_data(); | ||
| } | ||
| } else { | ||
| if (access_through_cache == 2) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The modes should be changed to proper enum to make code readable.
The field name access_through_cache should be adjusted. Something like mem_access_kind, mem_access_level or some better name name.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This commit and previous one should be squashed or kept but location of the test files as they are introduced in the previous commit should be already the final one. The move is abundant in new component history.
| flags = (enum InstructionFlags)im.flags; | ||
| alu_op = im.alu; | ||
| mem_ctl = im.mem_ctl; | ||
| if (flags & IMF_CSR) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I agree with this additional logic to map CSR to required privilege level. But see proposed testing remark.
| ExceptionCause excause = dt.excause; | ||
|
|
||
| dt.inst.flags_alu_op_mem_ctl(flags, alu_op, mem_ctl); | ||
| auto current_priv = state.current_privilege(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would suggest to use some masking there. Ideally included directly by updates of check_inst_flags_val and check_inst_flags_mask when which would be updated when the privilege level changes. This would allow speedup and even check on individual instruction level when mret, sret etc, can be augmented by required privilege level directly in the instruction table. This common illegal instruction processing is possible because privilege violation should lead to regular illegal instruction exception. See
2.1. CSR Address Mapping Conventions
Instructions that access a non-existent CSR are reserved. Attempts to access a CSR without appropriate privilege level raise illegal-instruction exceptions or, as described in Section 21.6.1, virtual-instruction exceptions. Attempts to write a read-only register raise illegal-instruction exceptions. read/write register might also contain some bits that are read-only, in which case writes to the read-
only bits are ignored.
Add tracking of the hart's current privilege level to the core state so code handling exceptions/returns and visualization can read/update it from the central CoreState structure.
The next supervisor CSRs has been added: sstatus, stvec, sscratch, sepc, scause, stval, satp Write handler has been added as well. It presents sstatus as a masked view of mstatus so supervisor-visible bits stay in sync.
Add privilege level mapping to the GUI so the current hart privilege (UNPRIV, SUPERV, HYPERV, MACHINE) is displayed in core state visualization.
Extend NewDialog with controls for virtual memory setup, including TLB number of sets, associativity, and replacement policy.
Introduce new components for displaying and tracking TLB state similar to cache. TLBViewBlock and TLBAddressBlock render per-set and per-way TLB contents, updated on tlb_update signals. TLBViewScene assembles these views based on associativity. TLBDock integrates into the GUI, showing hit/miss counts, memory accesses, stall cycles, hit rate, and speed improvement, with live updates from the TLB.
Introduce an "As CPU (VMA)" access option in the cached access selector to render memory contents as observed by the CPU through the frontend interface.
Add a set of small assembly tests that exercise the SV32 page-table walker, SATP enablement and the new TLB code. The tests create a root page table and map a virtual page at 0xC4000000, then exercise several scenarios. The tests verify page-table walker behaviour, SATP switching and TLB caching/flush logic. Tests were written based on the consultation.
Ensure that TLBs are only updated when the root register is set, and disable TLB updates while running in Machine mode.
Decode MRET/SRET/URET in the decode stage, carry the return type through interstage registers, and pass it to ControlState::exception_return in the memory stage. Mark returns illegal if they request a higher privilege (e.g., MRET in S-mode). When returning from M to a less-privileged mode, clear MPRV per the privileged spec.
Extend instruction metadata with privilege flags (IMF_PRIV_M/H/S) for privileged operations. In the decode stage, compare the current privilege level against these flags to detect and raise illegal-instruction exceptions early, preventing execution of instructions that require higher privilege.
861f836 to
b5940e8
Compare

This PR addresses some previous feedback, most notably:
Tests:
UI Components: