Skip to content

Commit

Permalink
s390/kvm: Support for get/set of extended TOD-Clock for guest
Browse files Browse the repository at this point in the history
Provides an interface for getting and setting the guest's extended
TOD-Clock via a single ioctl to kvm. If the ioctl fails because it
is not support by kvm, then we fall back to the old style of
retrieving the clock via two ioctls.

Signed-off-by: Collin L. Walling <walling@linux.vnet.ibm.com>
Reviewed-by: Eric Farman <farman@linux.vnet.ibm.com>
Reviewed-by: Claudio Imbrenda <imbrenda@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
[split failure change from epoch index change]
Message-Id: <20171004105751.24655-2-borntraeger@de.ibm.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
[some cosmetic fixes]
  • Loading branch information
Collin L. Walling authored and cohuck committed Oct 6, 2017
1 parent 489c909 commit 7edd4a4
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 8 deletions.
26 changes: 19 additions & 7 deletions target/s390x/cpu.c
Expand Up @@ -347,22 +347,34 @@ unsigned int s390_cpu_set_state(uint8_t cpu_state, S390CPU *cpu)

int s390_get_clock(uint8_t *tod_high, uint64_t *tod_low)
{
int r = 0;

if (kvm_enabled()) {
return kvm_s390_get_clock(tod_high, tod_low);
r = kvm_s390_get_clock_ext(tod_high, tod_low);
if (r == -ENXIO) {
return kvm_s390_get_clock(tod_high, tod_low);
}
} else {
/* Fixme TCG */
*tod_high = 0;
*tod_low = 0;
}
/* Fixme TCG */
*tod_high = 0;
*tod_low = 0;
return 0;

return r;
}

int s390_set_clock(uint8_t *tod_high, uint64_t *tod_low)
{
int r = 0;

if (kvm_enabled()) {
return kvm_s390_set_clock(tod_high, tod_low);
r = kvm_s390_set_clock_ext(tod_high, tod_low);
if (r == -ENXIO) {
return kvm_s390_set_clock(tod_high, tod_low);
}
}
/* Fixme TCG */
return 0;
return r;
}

int s390_set_memory_limit(uint64_t new_limit, uint64_t *hw_limit)
Expand Down
10 changes: 10 additions & 0 deletions target/s390x/kvm-stub.c
Expand Up @@ -68,11 +68,21 @@ int kvm_s390_get_clock(uint8_t *tod_high, uint64_t *tod_low)
return -ENOSYS;
}

int kvm_s390_get_clock_ext(uint8_t *tod_high, uint64_t *tod_low)
{
return -ENOSYS;
}

int kvm_s390_set_clock(uint8_t *tod_high, uint64_t *tod_low)
{
return -ENOSYS;
}

int kvm_s390_set_clock_ext(uint8_t *tod_high, uint64_t *tod_low)
{
return -ENOSYS;
}

void kvm_s390_enable_css_support(S390CPU *cpu)
{
}
Expand Down
33 changes: 32 additions & 1 deletion target/s390x/kvm.c
Expand Up @@ -646,10 +646,26 @@ int kvm_s390_get_clock(uint8_t *tod_high, uint64_t *tod_low)
return kvm_vm_ioctl(kvm_state, KVM_GET_DEVICE_ATTR, &attr);
}

int kvm_s390_set_clock(uint8_t *tod_high, uint64_t *tod_low)
int kvm_s390_get_clock_ext(uint8_t *tod_high, uint64_t *tod_low)
{
int r;
struct kvm_s390_vm_tod_clock gtod;
struct kvm_device_attr attr = {
.group = KVM_S390_VM_TOD,
.attr = KVM_S390_VM_TOD_EXT,
.addr = (uint64_t)&gtod,
};

r = kvm_vm_ioctl(kvm_state, KVM_GET_DEVICE_ATTR, &attr);
*tod_high = gtod.epoch_idx;
*tod_low = gtod.tod;

return r;
}

int kvm_s390_set_clock(uint8_t *tod_high, uint64_t *tod_low)
{
int r;
struct kvm_device_attr attr = {
.group = KVM_S390_VM_TOD,
.attr = KVM_S390_VM_TOD_LOW,
Expand All @@ -666,6 +682,21 @@ int kvm_s390_set_clock(uint8_t *tod_high, uint64_t *tod_low)
return kvm_vm_ioctl(kvm_state, KVM_SET_DEVICE_ATTR, &attr);
}

int kvm_s390_set_clock_ext(uint8_t *tod_high, uint64_t *tod_low)
{
struct kvm_s390_vm_tod_clock gtod = {
.epoch_idx = *tod_high,
.tod = *tod_low,
};
struct kvm_device_attr attr = {
.group = KVM_S390_VM_TOD,
.attr = KVM_S390_VM_TOD_EXT,
.addr = (uint64_t)&gtod,
};

return kvm_vm_ioctl(kvm_state, KVM_SET_DEVICE_ATTR, &attr);
}

/**
* kvm_s390_mem_op:
* @addr: the logical start address in guest memory
Expand Down
2 changes: 2 additions & 0 deletions target/s390x/kvm_s390x.h
Expand Up @@ -29,7 +29,9 @@ int kvm_s390_vcpu_interrupt_post_load(S390CPU *cpu);
int kvm_s390_get_ri(void);
int kvm_s390_get_gs(void);
int kvm_s390_get_clock(uint8_t *tod_high, uint64_t *tod_clock);
int kvm_s390_get_clock_ext(uint8_t *tod_high, uint64_t *tod_clock);
int kvm_s390_set_clock(uint8_t *tod_high, uint64_t *tod_clock);
int kvm_s390_set_clock_ext(uint8_t *tod_high, uint64_t *tod_clock);
void kvm_s390_enable_css_support(S390CPU *cpu);
int kvm_s390_assign_subch_ioeventfd(EventNotifier *notifier, uint32_t sch,
int vq, bool assign);
Expand Down

0 comments on commit 7edd4a4

Please sign in to comment.