cpu: fix IDT and GDT lifetimes on load methods #366
Merged
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.
When running the LIDT or LGDT instructions, we pass addresses pointing to architecture-specific tables that the CPU will use during operation. These tables must reside on valid memory during CPU operation to avoid malfunction.
In practical terms, this means the GDT and IDT entries must have a
static
lifetime. This will avoid at compile time the following construct:We could enforce this at the type level by requiring the
load()
method on these structs to take a&'static lifetime
. However, since we use locking, we cannot get such reference, only a reference that lives as long as a lock guard we get from the lock protecting the struct. However, this does not matter, as we can check that the guard points to a struct with static lifetime (Guard<'static, T>
).Thus, rewrite the methods on these structs that have these requirements such that they take a guard pointing to a
'static
IDT or GDT.