From 36d1b3bff14b48cb2166e0bc27cf74c9c3bc3c25 Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Wed, 10 Aug 2022 12:14:16 -0700 Subject: [PATCH] Write memory capabilities atomically. Use target_write_capability to write a capability atomically in put_frame_register. --- gdb/frame.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/gdb/frame.c b/gdb/frame.c index 44b3bd09463..bc3189e3dac 100644 --- a/gdb/frame.c +++ b/gdb/frame.c @@ -1399,15 +1399,21 @@ put_frame_register (struct frame_info *frame, int regnum, { case lval_memory: { - write_memory (addr, buf, register_size (gdbarch, regnum)); - /* If this value is a capability, we need to handle the capability tag - as well. */ + as an atomic write. */ if ((val_type->code () == TYPE_CODE_CAPABILITY || (val_type->code () == TYPE_CODE_PTR && TYPE_CAPABILITY (val_type))) && value_tagged (fromval)) - gdbarch_set_cap_tag_from_address (gdbarch, addr, value_tag (fromval)); + { + gdb::byte_vector cap (register_size (gdbarch, regnum) + 1); + + cap[0] = value_tag (fromval) ? 1 : 0; + memcpy (cap.data () + 1, buf, register_size (gdbarch, regnum)); + if (target_write_capability (addr, cap)) + break; + } + write_memory (addr, buf, register_size (gdbarch, regnum)); break; } case lval_register: -- 2.47.2