From 886ed246b39dccfd9b16026c2464d655ff0bcd75 Mon Sep 17 00:00:00 2001 From: Jingkui Wang Date: Thu, 7 Mar 2019 12:23:42 -0800 Subject: [PATCH] register_space: fix u64 write callback u64 register callback will only be invoked when the write is done. BUG=chromium:831850 TEST=local build CQ-DEPEND=CL:1509514 Change-Id: Id0be69535898fdcc4ba24d3151df7a5107a2725b Reviewed-on: https://chromium-review.googlesource.com/1509515 Commit-Ready: Zach Reizner Tested-by: Jingkui Wang Tested-by: kokoro Reviewed-by: Zach Reizner --- devices/src/register_space/register.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/devices/src/register_space/register.rs b/devices/src/register_space/register.rs index 44beaf5e61..eae5abc56b 100644 --- a/devices/src/register_space/register.rs +++ b/devices/src/register_space/register.rs @@ -267,6 +267,14 @@ impl RegisterInterface for Register { ); } } + + // A single u64 register is done by write to lower 32 bit and then higher 32 bit. Callback + // should only be invoked when higher is written. + if my_range.to != overlap.to { + self.lock().value = reg_value; + return; + } + // Taking the callback out of register when executing it. This prevent dead lock if // callback want to read current register value. // Note that the only source of callback comes from mmio writing, which is synchronized.