diff mbox

[v3] kvm: add set_one_reg/get_one_reg helpers

Message ID 1379558748-13808-1-git-send-email-aik@ozlabs.ru
State New
Headers show

Commit Message

Alexey Kardashevskiy Sept. 19, 2013, 2:45 a.m. UTC
This adds QEMU wrappers for KVM_SET_ONE_REG/KVM_GET_ONE_REG ioctls.

Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
---
Changes:
v3:
* changed comments

v2:
* added Doc Comments
* removed error_print
---
 include/sysemu/kvm.h | 21 +++++++++++++++++++++
 kvm-all.c            | 18 ++++++++++++++++++
 2 files changed, 39 insertions(+)

Comments

Alexey Kardashevskiy Sept. 27, 2013, 8:02 a.m. UTC | #1
On 09/19/2013 12:45 PM, Alexey Kardashevskiy wrote:
> This adds QEMU wrappers for KVM_SET_ONE_REG/KVM_GET_ONE_REG ioctls.

Ping?


> 
> Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
> ---
> Changes:
> v3:
> * changed comments
> 
> v2:
> * added Doc Comments
> * removed error_print
> ---
>  include/sysemu/kvm.h | 21 +++++++++++++++++++++
>  kvm-all.c            | 18 ++++++++++++++++++
>  2 files changed, 39 insertions(+)
> 
> diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h
> index c7bc07b..9080ffe 100644
> --- a/include/sysemu/kvm.h
> +++ b/include/sysemu/kvm.h
> @@ -319,4 +319,25 @@ int kvm_irqchip_remove_irqfd_notifier(KVMState *s, EventNotifier *n, int virq);
>  void kvm_pc_gsi_handler(void *opaque, int n, int level);
>  void kvm_pc_setup_irq_routing(bool pci_enabled);
>  void kvm_init_irq_routing(KVMState *s);
> +
> +/**
> + * kvm_set_one_reg - set a register value in KVM via KVM_SET_ONE_REG ioctl
> + * @id: The register ID
> + * @addr: The pointer to a value must point to a variable of the correct
> + * type/size for the register being accessed.
> + *
> + * Returns: 0 on success, or a negative errno on failure.
> + */
> +int kvm_set_one_reg(CPUState *cs, uint64_t id, void *addr);
> +
> +/**
> + * kvm_get_one_reg - get a register value from KVM via KVM_GET_ONE_REG ioctl
> + * @id: The register ID
> + * @addr: The pointer to a value must point to a variable of the correct
> + * type/size for the register being accessed.
> + *
> + * Returns: 0 on success, or a negative errno on failure.
> + */
> +int kvm_get_one_reg(CPUState *cs, uint64_t id, void *addr);
> +
>  #endif
> diff --git a/kvm-all.c b/kvm-all.c
> index ded7fc8..cdc32ec 100644
> --- a/kvm-all.c
> +++ b/kvm-all.c
> @@ -2049,3 +2049,21 @@ int kvm_on_sigbus(int code, void *addr)
>  {
>      return kvm_arch_on_sigbus(code, addr);
>  }
> +
> +int kvm_set_one_reg(CPUState *cs, uint64_t id, void *addr)
> +{
> +    struct kvm_one_reg reg = {
> +        .id = id,
> +        .addr = (uintptr_t)addr,
> +    };
> +    return kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
> +}
> +
> +int kvm_get_one_reg(CPUState *cs, uint64_t id, void *addr)
> +{
> +    struct kvm_one_reg reg = {
> +        .id = id,
> +        .addr = (uintptr_t)addr,
> +    };
> +    return kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
> +}
>
Paolo Bonzini Sept. 27, 2013, 8:59 a.m. UTC | #2
Il 27/09/2013 10:02, Alexey Kardashevskiy ha scritto:
> On 09/19/2013 12:45 PM, Alexey Kardashevskiy wrote:
>> This adds QEMU wrappers for KVM_SET_ONE_REG/KVM_GET_ONE_REG ioctls.
> 
> Ping?
> 
> 
>>
>> Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
>> ---
>> Changes:
>> v3:
>> * changed comments
>>
>> v2:
>> * added Doc Comments
>> * removed error_print
>> ---
>>  include/sysemu/kvm.h | 21 +++++++++++++++++++++
>>  kvm-all.c            | 18 ++++++++++++++++++
>>  2 files changed, 39 insertions(+)
>>
>> diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h
>> index c7bc07b..9080ffe 100644
>> --- a/include/sysemu/kvm.h
>> +++ b/include/sysemu/kvm.h
>> @@ -319,4 +319,25 @@ int kvm_irqchip_remove_irqfd_notifier(KVMState *s, EventNotifier *n, int virq);
>>  void kvm_pc_gsi_handler(void *opaque, int n, int level);
>>  void kvm_pc_setup_irq_routing(bool pci_enabled);
>>  void kvm_init_irq_routing(KVMState *s);
>> +
>> +/**
>> + * kvm_set_one_reg - set a register value in KVM via KVM_SET_ONE_REG ioctl
>> + * @id: The register ID
>> + * @addr: The pointer to a value must point to a variable of the correct
>> + * type/size for the register being accessed.
>> + *
>> + * Returns: 0 on success, or a negative errno on failure.
>> + */
>> +int kvm_set_one_reg(CPUState *cs, uint64_t id, void *addr);
>> +
>> +/**
>> + * kvm_get_one_reg - get a register value from KVM via KVM_GET_ONE_REG ioctl
>> + * @id: The register ID
>> + * @addr: The pointer to a value must point to a variable of the correct
>> + * type/size for the register being accessed.
>> + *
>> + * Returns: 0 on success, or a negative errno on failure.
>> + */
>> +int kvm_get_one_reg(CPUState *cs, uint64_t id, void *addr);
>> +
>>  #endif
>> diff --git a/kvm-all.c b/kvm-all.c
>> index ded7fc8..cdc32ec 100644
>> --- a/kvm-all.c
>> +++ b/kvm-all.c
>> @@ -2049,3 +2049,21 @@ int kvm_on_sigbus(int code, void *addr)
>>  {
>>      return kvm_arch_on_sigbus(code, addr);
>>  }
>> +
>> +int kvm_set_one_reg(CPUState *cs, uint64_t id, void *addr)
>> +{
>> +    struct kvm_one_reg reg = {
>> +        .id = id,
>> +        .addr = (uintptr_t)addr,
>> +    };
>> +    return kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
>> +}
>> +
>> +int kvm_get_one_reg(CPUState *cs, uint64_t id, void *addr)
>> +{
>> +    struct kvm_one_reg reg = {
>> +        .id = id,
>> +        .addr = (uintptr_t)addr,
>> +    };
>> +    return kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
>> +}
>>
> 
> 

Acked-by: Paolo Bonzini <pbonzini@redhat.com>

Include it with the acked-by together with the first patch that needs
it.  Alex can pick it up.

Paolo
Alexey Kardashevskiy Sept. 27, 2013, 9:08 a.m. UTC | #3
On 09/27/2013 06:59 PM, Paolo Bonzini wrote:
> Il 27/09/2013 10:02, Alexey Kardashevskiy ha scritto:
>> On 09/19/2013 12:45 PM, Alexey Kardashevskiy wrote:
>>> This adds QEMU wrappers for KVM_SET_ONE_REG/KVM_GET_ONE_REG ioctls.
>>
>> Ping?
>>
>>
>>>
>>> Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
>>> ---
>>> Changes:
>>> v3:
>>> * changed comments
>>>
>>> v2:
>>> * added Doc Comments
>>> * removed error_print
>>> ---
>>>  include/sysemu/kvm.h | 21 +++++++++++++++++++++
>>>  kvm-all.c            | 18 ++++++++++++++++++
>>>  2 files changed, 39 insertions(+)
>>>
>>> diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h
>>> index c7bc07b..9080ffe 100644
>>> --- a/include/sysemu/kvm.h
>>> +++ b/include/sysemu/kvm.h
>>> @@ -319,4 +319,25 @@ int kvm_irqchip_remove_irqfd_notifier(KVMState *s, EventNotifier *n, int virq);
>>>  void kvm_pc_gsi_handler(void *opaque, int n, int level);
>>>  void kvm_pc_setup_irq_routing(bool pci_enabled);
>>>  void kvm_init_irq_routing(KVMState *s);
>>> +
>>> +/**
>>> + * kvm_set_one_reg - set a register value in KVM via KVM_SET_ONE_REG ioctl
>>> + * @id: The register ID
>>> + * @addr: The pointer to a value must point to a variable of the correct
>>> + * type/size for the register being accessed.
>>> + *
>>> + * Returns: 0 on success, or a negative errno on failure.
>>> + */
>>> +int kvm_set_one_reg(CPUState *cs, uint64_t id, void *addr);
>>> +
>>> +/**
>>> + * kvm_get_one_reg - get a register value from KVM via KVM_GET_ONE_REG ioctl
>>> + * @id: The register ID
>>> + * @addr: The pointer to a value must point to a variable of the correct
>>> + * type/size for the register being accessed.
>>> + *
>>> + * Returns: 0 on success, or a negative errno on failure.
>>> + */
>>> +int kvm_get_one_reg(CPUState *cs, uint64_t id, void *addr);
>>> +
>>>  #endif
>>> diff --git a/kvm-all.c b/kvm-all.c
>>> index ded7fc8..cdc32ec 100644
>>> --- a/kvm-all.c
>>> +++ b/kvm-all.c
>>> @@ -2049,3 +2049,21 @@ int kvm_on_sigbus(int code, void *addr)
>>>  {
>>>      return kvm_arch_on_sigbus(code, addr);
>>>  }
>>> +
>>> +int kvm_set_one_reg(CPUState *cs, uint64_t id, void *addr)
>>> +{
>>> +    struct kvm_one_reg reg = {
>>> +        .id = id,
>>> +        .addr = (uintptr_t)addr,
>>> +    };
>>> +    return kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
>>> +}
>>> +
>>> +int kvm_get_one_reg(CPUState *cs, uint64_t id, void *addr)
>>> +{
>>> +    struct kvm_one_reg reg = {
>>> +        .id = id,
>>> +        .addr = (uintptr_t)addr,
>>> +    };
>>> +    return kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
>>> +}
>>>
>>
>>
> 
> Acked-by: Paolo Bonzini <pbonzini@redhat.com>
> 
> Include it with the acked-by together with the first patch that needs
> it.  Alex can pick it up.


Why to wait?

Alex, please pick it up.

The first patch which needs it is "[PATCH] spapr: add "compat" machine
option", posted earlier today.
Paolo Bonzini Sept. 27, 2013, 9:37 a.m. UTC | #4
Il 27/09/2013 11:08, Alexey Kardashevskiy ha scritto:
>> > Include it with the acked-by together with the first patch that needs
>> > it.  Alex can pick it up.
> 
> Why to wait?
> 
> Alex, please pick it up.
> 
> The first patch which needs it is "[PATCH] spapr: add "compat" machine
> option", posted earlier today.

Perfect.  I just didn't want to force Alex to wait for the next pull
request from me or Gleb.

Paolo
Alexey Kardashevskiy March 20, 2014, 12:35 p.m. UTC | #5
On 09/27/2013 07:08 PM, Alexey Kardashevskiy wrote:
> On 09/27/2013 06:59 PM, Paolo Bonzini wrote:
>> Il 27/09/2013 10:02, Alexey Kardashevskiy ha scritto:
>>> On 09/19/2013 12:45 PM, Alexey Kardashevskiy wrote:
>>>> This adds QEMU wrappers for KVM_SET_ONE_REG/KVM_GET_ONE_REG ioctls.
>>>
>>> Ping?
>>>
>>>
>>>>
>>>> Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
>>>> ---
>>>> Changes:
>>>> v3:
>>>> * changed comments
>>>>
>>>> v2:
>>>> * added Doc Comments
>>>> * removed error_print
>>>> ---
>>>>  include/sysemu/kvm.h | 21 +++++++++++++++++++++
>>>>  kvm-all.c            | 18 ++++++++++++++++++
>>>>  2 files changed, 39 insertions(+)
>>>>
>>>> diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h
>>>> index c7bc07b..9080ffe 100644
>>>> --- a/include/sysemu/kvm.h
>>>> +++ b/include/sysemu/kvm.h
>>>> @@ -319,4 +319,25 @@ int kvm_irqchip_remove_irqfd_notifier(KVMState *s, EventNotifier *n, int virq);
>>>>  void kvm_pc_gsi_handler(void *opaque, int n, int level);
>>>>  void kvm_pc_setup_irq_routing(bool pci_enabled);
>>>>  void kvm_init_irq_routing(KVMState *s);
>>>> +
>>>> +/**
>>>> + * kvm_set_one_reg - set a register value in KVM via KVM_SET_ONE_REG ioctl
>>>> + * @id: The register ID
>>>> + * @addr: The pointer to a value must point to a variable of the correct
>>>> + * type/size for the register being accessed.
>>>> + *
>>>> + * Returns: 0 on success, or a negative errno on failure.
>>>> + */
>>>> +int kvm_set_one_reg(CPUState *cs, uint64_t id, void *addr);
>>>> +
>>>> +/**
>>>> + * kvm_get_one_reg - get a register value from KVM via KVM_GET_ONE_REG ioctl
>>>> + * @id: The register ID
>>>> + * @addr: The pointer to a value must point to a variable of the correct
>>>> + * type/size for the register being accessed.
>>>> + *
>>>> + * Returns: 0 on success, or a negative errno on failure.
>>>> + */
>>>> +int kvm_get_one_reg(CPUState *cs, uint64_t id, void *addr);
>>>> +
>>>>  #endif
>>>> diff --git a/kvm-all.c b/kvm-all.c
>>>> index ded7fc8..cdc32ec 100644
>>>> --- a/kvm-all.c
>>>> +++ b/kvm-all.c
>>>> @@ -2049,3 +2049,21 @@ int kvm_on_sigbus(int code, void *addr)
>>>>  {
>>>>      return kvm_arch_on_sigbus(code, addr);
>>>>  }
>>>> +
>>>> +int kvm_set_one_reg(CPUState *cs, uint64_t id, void *addr)
>>>> +{
>>>> +    struct kvm_one_reg reg = {
>>>> +        .id = id,
>>>> +        .addr = (uintptr_t)addr,
>>>> +    };
>>>> +    return kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
>>>> +}
>>>> +
>>>> +int kvm_get_one_reg(CPUState *cs, uint64_t id, void *addr)
>>>> +{
>>>> +    struct kvm_one_reg reg = {
>>>> +        .id = id,
>>>> +        .addr = (uintptr_t)addr,
>>>> +    };
>>>> +    return kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
>>>> +}
>>>>
>>>
>>>
>>
>> Acked-by: Paolo Bonzini <pbonzini@redhat.com>
>>
>> Include it with the acked-by together with the first patch that needs
>> it.  Alex can pick it up.
> 
> 
> Why to wait?
> 
> Alex, please pick it up.
> 
> The first patch which needs it is "[PATCH] spapr: add "compat" machine
> option", posted earlier today.

Alex did not pick it up. And I use this patch in 2 of my series
(client-arch-support and power8 migration patch) so I would really love not
to post it twice. This does not need to go to 2.0-lalala but would be nice
to have it in some kvm-next. Thanks!
Alexey Kardashevskiy March 26, 2014, 2:23 p.m. UTC | #6
On 03/20/2014 11:35 PM, Alexey Kardashevskiy wrote:
> On 09/27/2013 07:08 PM, Alexey Kardashevskiy wrote:
>> On 09/27/2013 06:59 PM, Paolo Bonzini wrote:
>>> Il 27/09/2013 10:02, Alexey Kardashevskiy ha scritto:
>>>> On 09/19/2013 12:45 PM, Alexey Kardashevskiy wrote:
>>>>> This adds QEMU wrappers for KVM_SET_ONE_REG/KVM_GET_ONE_REG ioctls.
>>>>
>>>> Ping?
>>>>
>>>>
>>>>>
>>>>> Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
>>>>> ---
>>>>> Changes:
>>>>> v3:
>>>>> * changed comments
>>>>>
>>>>> v2:
>>>>> * added Doc Comments
>>>>> * removed error_print
>>>>> ---
>>>>>  include/sysemu/kvm.h | 21 +++++++++++++++++++++
>>>>>  kvm-all.c            | 18 ++++++++++++++++++
>>>>>  2 files changed, 39 insertions(+)
>>>>>
>>>>> diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h
>>>>> index c7bc07b..9080ffe 100644
>>>>> --- a/include/sysemu/kvm.h
>>>>> +++ b/include/sysemu/kvm.h
>>>>> @@ -319,4 +319,25 @@ int kvm_irqchip_remove_irqfd_notifier(KVMState *s, EventNotifier *n, int virq);
>>>>>  void kvm_pc_gsi_handler(void *opaque, int n, int level);
>>>>>  void kvm_pc_setup_irq_routing(bool pci_enabled);
>>>>>  void kvm_init_irq_routing(KVMState *s);
>>>>> +
>>>>> +/**
>>>>> + * kvm_set_one_reg - set a register value in KVM via KVM_SET_ONE_REG ioctl
>>>>> + * @id: The register ID
>>>>> + * @addr: The pointer to a value must point to a variable of the correct
>>>>> + * type/size for the register being accessed.
>>>>> + *
>>>>> + * Returns: 0 on success, or a negative errno on failure.
>>>>> + */
>>>>> +int kvm_set_one_reg(CPUState *cs, uint64_t id, void *addr);
>>>>> +
>>>>> +/**
>>>>> + * kvm_get_one_reg - get a register value from KVM via KVM_GET_ONE_REG ioctl
>>>>> + * @id: The register ID
>>>>> + * @addr: The pointer to a value must point to a variable of the correct
>>>>> + * type/size for the register being accessed.
>>>>> + *
>>>>> + * Returns: 0 on success, or a negative errno on failure.
>>>>> + */
>>>>> +int kvm_get_one_reg(CPUState *cs, uint64_t id, void *addr);
>>>>> +
>>>>>  #endif
>>>>> diff --git a/kvm-all.c b/kvm-all.c
>>>>> index ded7fc8..cdc32ec 100644
>>>>> --- a/kvm-all.c
>>>>> +++ b/kvm-all.c
>>>>> @@ -2049,3 +2049,21 @@ int kvm_on_sigbus(int code, void *addr)
>>>>>  {
>>>>>      return kvm_arch_on_sigbus(code, addr);
>>>>>  }
>>>>> +
>>>>> +int kvm_set_one_reg(CPUState *cs, uint64_t id, void *addr)
>>>>> +{
>>>>> +    struct kvm_one_reg reg = {
>>>>> +        .id = id,
>>>>> +        .addr = (uintptr_t)addr,
>>>>> +    };
>>>>> +    return kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
>>>>> +}
>>>>> +
>>>>> +int kvm_get_one_reg(CPUState *cs, uint64_t id, void *addr)
>>>>> +{
>>>>> +    struct kvm_one_reg reg = {
>>>>> +        .id = id,
>>>>> +        .addr = (uintptr_t)addr,
>>>>> +    };
>>>>> +    return kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
>>>>> +}
>>>>>
>>>>
>>>>
>>>
>>> Acked-by: Paolo Bonzini <pbonzini@redhat.com>
>>>
>>> Include it with the acked-by together with the first patch that needs
>>> it.  Alex can pick it up.
>>
>>
>> Why to wait?
>>
>> Alex, please pick it up.
>>
>> The first patch which needs it is "[PATCH] spapr: add "compat" machine
>> option", posted earlier today.
> 
> Alex did not pick it up. And I use this patch in 2 of my series
> (client-arch-support and power8 migration patch) so I would really love not
> to post it twice. This does not need to go to 2.0-lalala but would be nice
> to have it in some kvm-next. Thanks!


Paolo, ping!
Thanks!
Paolo Bonzini March 26, 2014, 2:35 p.m. UTC | #7
Il 26/03/2014 15:23, Alexey Kardashevskiy ha scritto:
>> Alex did not pick it up. And I use this patch in 2 of my series
>> (client-arch-support and power8 migration patch) so I would really love not
>> to post it twice. This does not need to go to 2.0-lalala but would be nice
>> to have it in some kvm-next. Thanks!
>
>
> Paolo, ping!

Applying it now to uq/master, thanks.

Paolo
Alexey Kardashevskiy May 2, 2014, 2:38 a.m. UTC | #8
On 03/27/2014 01:35 AM, Paolo Bonzini wrote:
> Il 26/03/2014 15:23, Alexey Kardashevskiy ha scritto:
>>> Alex did not pick it up. And I use this patch in 2 of my series
>>> (client-arch-support and power8 migration patch) so I would really love not
>>> to post it twice. This does not need to go to 2.0-lalala but would be nice
>>> to have it in some kvm-next. Thanks!
>>
>>
>> Paolo, ping!
> 
> Applying it now to uq/master, thanks.

I looked at git://github.com/bonzini/qemu.git, "uq/master", it is 7 months
old so I am obviously looking at the wrong repo. Where exactly did the subj
patch go? Or you just do not push "uq/master" very often? :) Thanks!
Paolo Bonzini May 2, 2014, 8:36 a.m. UTC | #9
> > Applying it now to uq/master, thanks.
> 
> I looked at git://github.com/bonzini/qemu.git, "uq/master", it is 7 months
> old so I am obviously looking at the wrong repo. Where exactly did the subj
> patch go? Or you just do not push "uq/master" very often? :) Thanks!


It's git://git.kernel.org/pub/scm/virt/kvm/qemu-kvm.git -- I'll add to my
workflow to push uq/master to github as well, thanks for the suggestion.

Paolo
diff mbox

Patch

diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h
index c7bc07b..9080ffe 100644
--- a/include/sysemu/kvm.h
+++ b/include/sysemu/kvm.h
@@ -319,4 +319,25 @@  int kvm_irqchip_remove_irqfd_notifier(KVMState *s, EventNotifier *n, int virq);
 void kvm_pc_gsi_handler(void *opaque, int n, int level);
 void kvm_pc_setup_irq_routing(bool pci_enabled);
 void kvm_init_irq_routing(KVMState *s);
+
+/**
+ * kvm_set_one_reg - set a register value in KVM via KVM_SET_ONE_REG ioctl
+ * @id: The register ID
+ * @addr: The pointer to a value must point to a variable of the correct
+ * type/size for the register being accessed.
+ *
+ * Returns: 0 on success, or a negative errno on failure.
+ */
+int kvm_set_one_reg(CPUState *cs, uint64_t id, void *addr);
+
+/**
+ * kvm_get_one_reg - get a register value from KVM via KVM_GET_ONE_REG ioctl
+ * @id: The register ID
+ * @addr: The pointer to a value must point to a variable of the correct
+ * type/size for the register being accessed.
+ *
+ * Returns: 0 on success, or a negative errno on failure.
+ */
+int kvm_get_one_reg(CPUState *cs, uint64_t id, void *addr);
+
 #endif
diff --git a/kvm-all.c b/kvm-all.c
index ded7fc8..cdc32ec 100644
--- a/kvm-all.c
+++ b/kvm-all.c
@@ -2049,3 +2049,21 @@  int kvm_on_sigbus(int code, void *addr)
 {
     return kvm_arch_on_sigbus(code, addr);
 }
+
+int kvm_set_one_reg(CPUState *cs, uint64_t id, void *addr)
+{
+    struct kvm_one_reg reg = {
+        .id = id,
+        .addr = (uintptr_t)addr,
+    };
+    return kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
+}
+
+int kvm_get_one_reg(CPUState *cs, uint64_t id, void *addr)
+{
+    struct kvm_one_reg reg = {
+        .id = id,
+        .addr = (uintptr_t)addr,
+    };
+    return kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
+}