Skip to content

Commit 9508e21

Browse files
committed
Add kernel-hwaddress sanitizer
Signed-off-by: Alice Ryhl <aliceryhl@google.com>
1 parent 0028f34 commit 9508e21

36 files changed

+352
-22
lines changed

compiler/rustc_attr_parsing/src/attributes/codegen_attrs.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -587,6 +587,7 @@ impl<S: Stage> SingleAttributeParser<S> for SanitizeParser {
587587
r#"kernel_address = "on|off""#,
588588
r#"cfi = "on|off""#,
589589
r#"hwaddress = "on|off""#,
590+
r#"kernel_hwaddress = "on|off""#,
590591
r#"kcfi = "on|off""#,
591592
r#"memory = "on|off""#,
592593
r#"memtag = "on|off""#,
@@ -654,7 +655,9 @@ impl<S: Stage> SingleAttributeParser<S> for SanitizeParser {
654655
Some(sym::memtag) => apply(SanitizerSet::MEMTAG),
655656
Some(sym::shadow_call_stack) => apply(SanitizerSet::SHADOWCALLSTACK),
656657
Some(sym::thread) => apply(SanitizerSet::THREAD),
657-
Some(sym::hwaddress) => apply(SanitizerSet::HWADDRESS),
658+
Some(sym::hwaddress) | Some(sym::kernel_hwaddress) => {
659+
apply(SanitizerSet::HWADDRESS | SanitizerSet::KERNELHWADDRESS)
660+
}
658661
Some(sym::realtime) => match value.value_as_str() {
659662
Some(sym::nonblocking) => rtsan = Some(RtsanSetting::Nonblocking),
660663
Some(sym::blocking) => rtsan = Some(RtsanSetting::Blocking),
@@ -678,6 +681,8 @@ impl<S: Stage> SingleAttributeParser<S> for SanitizeParser {
678681
sym::shadow_call_stack,
679682
sym::thread,
680683
sym::hwaddress,
684+
sym::kernel_address,
685+
sym::kernel_hwaddress,
681686
sym::realtime,
682687
],
683688
);

compiler/rustc_codegen_llvm/src/attributes.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,8 @@ pub(crate) fn sanitize_attrs<'ll, 'tcx>(
120120
if enabled.contains(SanitizerSet::THREAD) {
121121
attrs.push(llvm::AttributeKind::SanitizeThread.create_attr(cx.llcx));
122122
}
123-
if enabled.contains(SanitizerSet::HWADDRESS) {
123+
if enabled.contains(SanitizerSet::HWADDRESS) || enabled.contains(SanitizerSet::KERNELHWADDRESS)
124+
{
124125
attrs.push(llvm::AttributeKind::SanitizeHWAddress.create_attr(cx.llcx));
125126
}
126127
if enabled.contains(SanitizerSet::SHADOWCALLSTACK) {

compiler/rustc_codegen_llvm/src/back/write.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -652,6 +652,10 @@ pub(crate) unsafe fn llvm_optimize(
652652
sanitize_kernel_address_recover: config
653653
.sanitizer_recover
654654
.contains(SanitizerSet::KERNELADDRESS),
655+
sanitize_kernel_hwaddress: config.sanitizer.contains(SanitizerSet::KERNELHWADDRESS),
656+
sanitize_kernel_hwaddress_recover: config
657+
.sanitizer_recover
658+
.contains(SanitizerSet::KERNELHWADDRESS),
655659
})
656660
} else {
657661
None

compiler/rustc_codegen_llvm/src/base.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -210,10 +210,14 @@ pub(crate) fn visibility_to_llvm(linkage: Visibility) -> llvm::Visibility {
210210
}
211211

212212
pub(crate) fn set_variable_sanitizer_attrs(llval: &Value, attrs: &CodegenFnAttrs) {
213-
if attrs.sanitizers.disabled.contains(SanitizerSet::ADDRESS) {
213+
if attrs.sanitizers.disabled.contains(SanitizerSet::ADDRESS)
214+
|| attrs.sanitizers.disabled.contains(SanitizerSet::KERNELADDRESS)
215+
{
214216
unsafe { llvm::LLVMRustSetNoSanitizeAddress(llval) };
215217
}
216-
if attrs.sanitizers.disabled.contains(SanitizerSet::HWADDRESS) {
218+
if attrs.sanitizers.disabled.contains(SanitizerSet::HWADDRESS)
219+
|| attrs.sanitizers.disabled.contains(SanitizerSet::KERNELHWADDRESS)
220+
{
217221
unsafe { llvm::LLVMRustSetNoSanitizeHWAddress(llval) };
218222
}
219223
}

compiler/rustc_codegen_llvm/src/llvm/ffi.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -464,6 +464,8 @@ pub(crate) struct SanitizerOptions {
464464
pub sanitize_hwaddress_recover: bool,
465465
pub sanitize_kernel_address: bool,
466466
pub sanitize_kernel_address_recover: bool,
467+
pub sanitize_kernel_hwaddress: bool,
468+
pub sanitize_kernel_hwaddress_recover: bool,
467469
}
468470

469471
/// LLVMRustRelocModel

compiler/rustc_codegen_ssa/src/back/link.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1235,6 +1235,7 @@ fn add_sanitizer_libraries(
12351235
if sanitizer.contains(SanitizerSet::LEAK)
12361236
&& !sanitizer.contains(SanitizerSet::ADDRESS)
12371237
&& !sanitizer.contains(SanitizerSet::HWADDRESS)
1238+
&& !sanitizer.contains(SanitizerSet::KERNELHWADDRESS)
12381239
{
12391240
link_sanitizer_runtime(sess, flavor, linker, "lsan");
12401241
}

compiler/rustc_feature/src/builtin_attrs.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -778,7 +778,7 @@ pub static BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
778778
DuplicatesOk, EncodeCrossCrate::No, effective_target_features, experimental!(force_target_feature)
779779
),
780780
gated!(
781-
sanitize, Normal, template!(List: &[r#"address = "on|off""#, r#"kernel_address = "on|off""#, r#"cfi = "on|off""#, r#"hwaddress = "on|off""#, r#"kcfi = "on|off""#, r#"memory = "on|off""#, r#"memtag = "on|off""#, r#"shadow_call_stack = "on|off""#, r#"thread = "on|off""#]), ErrorPreceding,
781+
sanitize, Normal, template!(List: &[r#"address = "on|off""#, r#"kernel_address = "on|off""#, r#"cfi = "on|off""#, r#"hwaddress = "on|off""#, r#"kernel_hwaddress = "on|off""#, r#"kcfi = "on|off""#, r#"memory = "on|off""#, r#"memtag = "on|off""#, r#"shadow_call_stack = "on|off""#, r#"thread = "on|off""#]), ErrorPreceding,
782782
EncodeCrossCrate::No, sanitize, experimental!(sanitize),
783783
),
784784
gated!(

compiler/rustc_llvm/llvm-wrapper/PassWrapper.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -544,6 +544,8 @@ struct LLVMRustSanitizerOptions {
544544
bool SanitizeHWAddressRecover;
545545
bool SanitizeKernelAddress;
546546
bool SanitizeKernelAddressRecover;
547+
bool SanitizeKernelHWAddress;
548+
bool SanitizeKernelHWAddressRecover;
547549
};
548550

549551
extern "C" typedef void (*registerEnzymeAndPassPipelineFn)(
@@ -775,13 +777,15 @@ extern "C" LLVMRustResult LLVMRustOptimize(
775777
!TM->getTargetTriple().isOSWindows()));
776778
});
777779
}
778-
if (SanitizerOptions->SanitizeHWAddress) {
780+
if (SanitizerOptions->SanitizeHWAddress ||
781+
SanitizerOptions->SanitizeKernelHWAddress) {
779782
OptimizerLastEPCallbacks.push_back(
780783
[SanitizerOptions](ModulePassManager &MPM, OptimizationLevel Level,
781784
ThinOrFullLTOPhase phase) {
782785
HWAddressSanitizerOptions opts(
783-
/*CompileKernel=*/false,
784-
SanitizerOptions->SanitizeHWAddressRecover,
786+
SanitizerOptions->SanitizeKernelHWAddress,
787+
SanitizerOptions->SanitizeHWAddressRecover ||
788+
SanitizerOptions->SanitizeKernelHWAddressRecover,
785789
/*DisableOptimization=*/false);
786790
MPM.addPass(HWAddressSanitizerPass(opts));
787791
});

compiler/rustc_session/src/config/cfg.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,10 @@ pub(crate) fn default_configuration(sess: &Session) -> Cfg {
229229
if s == SanitizerSet::KERNELADDRESS {
230230
s = SanitizerSet::ADDRESS;
231231
}
232+
// KHWASAN is still HWASAN under the hood, so it uses the same attribute.
233+
if s == SanitizerSet::KERNELHWADDRESS {
234+
s = SanitizerSet::HWADDRESS;
235+
}
232236
ins_str!(sym::sanitize, &s.to_string());
233237
}
234238

compiler/rustc_session/src/options.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ mod target_modifier_consistency_check {
106106
| SanitizerSet::SHADOWCALLSTACK
107107
| SanitizerSet::KCFI
108108
| SanitizerSet::KERNELADDRESS
109+
| SanitizerSet::KERNELHWADDRESS
109110
| SanitizerSet::SAFESTACK
110111
| SanitizerSet::DATAFLOW;
111112

@@ -810,7 +811,7 @@ mod desc {
810811
pub(crate) const parse_patchable_function_entry: &str = "either two comma separated integers (total_nops,prefix_nops), with prefix_nops <= total_nops, or one integer (total_nops)";
811812
pub(crate) const parse_opt_panic_strategy: &str = parse_panic_strategy;
812813
pub(crate) const parse_relro_level: &str = "one of: `full`, `partial`, or `off`";
813-
pub(crate) const parse_sanitizers: &str = "comma separated list of sanitizers: `address`, `cfi`, `dataflow`, `hwaddress`, `kcfi`, `kernel-address`, `leak`, `memory`, `memtag`, `safestack`, `shadow-call-stack`, `thread`, or 'realtime'";
814+
pub(crate) const parse_sanitizers: &str = "comma separated list of sanitizers: `address`, `cfi`, `dataflow`, `hwaddress`, `kcfi`, `kernel-address`, `kernel-hwaddress`, `leak`, `memory`, `memtag`, `safestack`, `shadow-call-stack`, `thread`, or 'realtime'";
814815
pub(crate) const parse_sanitizer_memory_track_origins: &str = "0, 1, or 2";
815816
pub(crate) const parse_cfguard: &str =
816817
"either a boolean (`yes`, `no`, `on`, `off`, etc), `checks`, or `nochecks`";
@@ -1252,6 +1253,7 @@ pub mod parse {
12521253
"dataflow" => SanitizerSet::DATAFLOW,
12531254
"kcfi" => SanitizerSet::KCFI,
12541255
"kernel-address" => SanitizerSet::KERNELADDRESS,
1256+
"kernel-hwaddress" => SanitizerSet::KERNELHWADDRESS,
12551257
"leak" => SanitizerSet::LEAK,
12561258
"memory" => SanitizerSet::MEMORY,
12571259
"memtag" => SanitizerSet::MEMTAG,

0 commit comments

Comments
 (0)