From d05e8779b8d3d722540cb21af0a81a3826d46efb Mon Sep 17 00:00:00 2001 From: Matt Knight Date: Mon, 15 May 2023 22:37:20 -0700 Subject: [PATCH] workaround for compiler bug where volatile is not propagated over a field access (#57) --- src/hal/resets.zig | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/hal/resets.zig b/src/hal/resets.zig index f25d550..a35ad79 100644 --- a/src/hal/resets.zig +++ b/src/hal/resets.zig @@ -44,18 +44,23 @@ pub fn reset(mask: Mask) void { while ((RESETS.RESET_DONE.raw & raw_mask) != raw_mask) {} } -pub fn reset_block(mask: Mask) void { +pub inline fn reset_block(mask: Mask) void { hw.set_alias_raw(&RESETS.RESET).* = @bitCast(u32, mask); } -pub fn unreset_block(mask: Mask) void { +pub inline fn unreset_block(mask: Mask) void { hw.clear_alias_raw(&RESETS.RESET).* = @bitCast(u32, mask); } pub fn unreset_block_wait(mask: Mask) void { const raw_mask = @bitCast(u32, mask); hw.clear_alias_raw(&RESETS.RESET).* = raw_mask; - while (RESETS.RESET_DONE.raw & raw_mask != raw_mask) {} + + // have to bitcast after a read() instead of `RESETS.RESET_DONE.raw` due to + // some optimization bug. While loops will not be optimzed away if the + // condition has side effects like dereferencing a volatile pointer. + // It seems that volatile is not propagating correctly. + while (@bitCast(u32, RESETS.RESET_DONE.read()) & raw_mask != raw_mask) {} } pub const masks = struct {