-
Notifications
You must be signed in to change notification settings - Fork 81
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
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.
Add supervisor CSRs (sstatus, stvec, sscratch, sepc, scause, stval, satp) and a write handler that presents sstatus as a masked view of mstatus so supervisor-visible bits stay in sync.
Add a configurable TLB and a full SV32 page-table walker. The walker implements two-level SV32 walks and raises page-fault exceptions for invalid mappings. The TLB supports I/D caches, SATP awareness (SATP writes flush the TLB), and caching of resolved mappings.
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.
src/gui/CMakeLists.txt
Outdated
windows/tlb/tlbview.h | ||
windows/tlb/tlbview.cpp | ||
windows/tlb/tlbdock.cpp | ||
windows/tlb/tlbdock.h) |
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 does no seem right - source files in icon path.
src/gui/dialogs/new/newdialog.cpp
Outdated
void NewDialog::vm_enabled_change(bool v) { | ||
if (config->get_vm_enabled() != v) { | ||
config->set_vm_enabled(v); | ||
switch2custom(); |
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.
Nit: please prefer a consistent naming convention switch_to_custom
. Also try to think of a more descriptive name or add a comment.
src/gui/windows/tlb/tlbview.cpp
Outdated
} | ||
|
||
TLBViewScene::~TLBViewScene() { | ||
delete[] block; |
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.
Can we make this RAII?
src/gui/windows/tlb/tlbview.h
Outdated
unsigned way_index; | ||
unsigned rows; | ||
QGraphicsSimpleTextItem **validity; | ||
QGraphicsSimpleTextItem **asid; |
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.
@nemecad This is an important comment with a more generic theme:
Please avoid using pointer type for arrays at all cost. That is extremely confusing and dangerous. Just use std::vector
or std::array
. As a rule of thumb, new
keyword should be avoided unless it is required by Qt (method that take ownership of the pointer). Such pointers should be marked by the QT_OWNED macro to make it clear.
For owned types that need to be allocated (because of Qt requirements), use Box<T>
.
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.
For any class members, please:
- prefer value types, if not possible use
Box
(shorthand forQtScopedPointer
),std::vector
orstd::array
. - Prefer references over pointers, of not possible mark them with macro
BORROWED
(another custom class) orQT_OWNED
. And consider adding a comment explaining the lifetime if it is not obvious.
src/machine/CMakeLists.txt
Outdated
memory/cache/cache_policy.cpp | ||
memory/frontend_memory.cpp | ||
memory/memory_bus.cpp | ||
memory/tlb/tlb.cpp |
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.
Formatting
} | ||
|
||
const TLB *Machine::get_tlb_program() const { | ||
return tlb_program ? &*tlb_program : nullptr; |
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 method for this (get
iirc). I am not sure if this is correct.
src/machine/machine.h
Outdated
#include <QObject> | ||
#include <QTimer> | ||
#include <cstdint> | ||
#include <iostream> |
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 is this needed?
src/machine/machineconfig.cpp
Outdated
|
||
#include <QMap> | ||
#include <utility> | ||
#include <iostream> |
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 is this needed?
// See example in read_generic for byteswap explanation. | ||
const T swapped_value | ||
= byteswap_if(value, this->simulated_machine_endian != NATIVE_ENDIAN); | ||
if (auto tlb = dynamic_cast<TLB *>(this)) { |
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 makes me worried. This object model does not make much sense. See my comments on the previous PR.
static constexpr uint64_t PHYS_PPN_START = 0x200; // I have noticed that programs are loaded into memory starting at 0x200. | ||
|
||
// Sv32Pte wraps the raw 32-bit PTE value and provides helpers to read flags and fields. | ||
// Layout (bit indices): |
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 :)
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 |
Add privilege level mapping to the GUI so the current hart privilege (UNPRIV, SUPERV, HYPERV, MACHINE) is displayed in core state visualization.
aa7df79
to
7b06705
Compare
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.
This resolves the incorrect zoom behavior.
Store only `current_privilege_u` in CoreState and use accessor methods to convert to CSR::PrivilegeLevel. Resolves previous issues with duplicated privilege representation.
Removes the previous approach; instead, TLBs are now created every time. If virtual memory is disabled, the TLB logic is skipped.
Include new supervisor registers in the expected output to fix CI failures.
0bb04d1
to
ca4300b
Compare
This PR addresses some previous feedback, most notably:
Tests:
UI Components: