summary refs log tree commit diff
path: root/devices/src/register_space
diff options
context:
space:
mode:
authorJingkui Wang <jkwang@google.com>2019-03-07 12:23:42 -0800
committerchrome-bot <chrome-bot@chromium.org>2019-03-08 21:20:19 -0800
commit886ed246b39dccfd9b16026c2464d655ff0bcd75 (patch)
tree45c57108607517d310573febfd8a66071fbd47d2 /devices/src/register_space
parent9fc96ec8fb6bd23dbe2eff6e44ebe7549787e5d0 (diff)
downloadcrosvm-886ed246b39dccfd9b16026c2464d655ff0bcd75.tar
crosvm-886ed246b39dccfd9b16026c2464d655ff0bcd75.tar.gz
crosvm-886ed246b39dccfd9b16026c2464d655ff0bcd75.tar.bz2
crosvm-886ed246b39dccfd9b16026c2464d655ff0bcd75.tar.lz
crosvm-886ed246b39dccfd9b16026c2464d655ff0bcd75.tar.xz
crosvm-886ed246b39dccfd9b16026c2464d655ff0bcd75.tar.zst
crosvm-886ed246b39dccfd9b16026c2464d655ff0bcd75.zip
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 <zachr@chromium.org>
Tested-by: Jingkui Wang <jkwang@google.com>
Tested-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Zach Reizner <zachr@chromium.org>
Diffstat (limited to 'devices/src/register_space')
-rw-r--r--devices/src/register_space/register.rs8
1 files changed, 8 insertions, 0 deletions
diff --git a/devices/src/register_space/register.rs b/devices/src/register_space/register.rs
index 44beaf5..eae5abc 100644
--- a/devices/src/register_space/register.rs
+++ b/devices/src/register_space/register.rs
@@ -267,6 +267,14 @@ impl<T: RegisterValue> RegisterInterface for Register<T> {
                 );
             }
         }
+
+        // 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.