Skip to content

Commit cd14167

Browse files
authored
Merge pull request #528 from mkroening/unsafe-base-write
fix(model_specific): make `{Fs,Gs,KernelGs}Base::write()` unsafe
2 parents 8ca2ab9 + 5807c5c commit cd14167

File tree

1 file changed

+17
-3
lines changed

1 file changed

+17
-3
lines changed

src/registers/model_specific.rs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -307,8 +307,13 @@ mod x86_64 {
307307
///
308308
/// If [`CR4.FSGSBASE`][Cr4Flags::FSGSBASE] is set, the more efficient
309309
/// [`FS::write_base`] can be used instead.
310+
///
311+
/// ## Safety
312+
///
313+
/// The caller must ensure that this write operation has no unsafe side
314+
/// effects, as the segment base address might be in use.
310315
#[inline]
311-
pub fn write(address: VirtAddr) {
316+
pub unsafe fn write(address: VirtAddr) {
312317
let mut msr = Self::MSR;
313318
unsafe { msr.write(address.as_u64()) };
314319
}
@@ -328,8 +333,13 @@ mod x86_64 {
328333
///
329334
/// If [`CR4.FSGSBASE`][Cr4Flags::FSGSBASE] is set, the more efficient
330335
/// [`GS::write_base`] can be used instead.
336+
///
337+
/// ## Safety
338+
///
339+
/// The caller must ensure that this write operation has no unsafe side
340+
/// effects, as the segment base address might be in use.
331341
#[inline]
332-
pub fn write(address: VirtAddr) {
342+
pub unsafe fn write(address: VirtAddr) {
333343
let mut msr = Self::MSR;
334344
unsafe { msr.write(address.as_u64()) };
335345
}
@@ -343,8 +353,12 @@ mod x86_64 {
343353
}
344354

345355
/// Write a given virtual address to the KernelGsBase register.
356+
///
357+
/// ## Safety
358+
///
359+
/// The caller must ensure that a future call to [`GS::swap`] has no unsafe side effects.
346360
#[inline]
347-
pub fn write(address: VirtAddr) {
361+
pub unsafe fn write(address: VirtAddr) {
348362
let mut msr = Self::MSR;
349363
unsafe { msr.write(address.as_u64()) };
350364
}

0 commit comments

Comments
 (0)