* [Qemu-devel] [PATCH 1/2] ppc: Generalize the kvmppc_get_clockfreq() function
@ 2011-10-11 4:31 David Gibson
2011-10-11 4:31 ` [Qemu-devel] [PATCH 2/2] pseries: Add device tree properties for VMX/VSX and DFP under kvm David Gibson
2011-10-12 14:19 ` [Qemu-devel] [PATCH 1/2] ppc: Generalize the kvmppc_get_clockfreq() function Alexander Graf
0 siblings, 2 replies; 4+ messages in thread
From: David Gibson @ 2011-10-11 4:31 UTC (permalink / raw)
To: agraf; +Cc: qemu-devel
Currently the kvmppc_get_clockfreq() function reads the host's clock
frequency from /proc/device-tree, which is useful to past to the guest
in KVM setups. However, there are some other host properties
advertised in the device tree which can also be relevant to the
guests.
This patch, therefore, replaces kvmppc_get_clockfreq() which can
retrieve any named, single integer property from the host device
tree's CPU node.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
target-ppc/kvm.c | 35 ++++++++++++++++++++++++-----------
1 files changed, 24 insertions(+), 11 deletions(-)
diff --git a/target-ppc/kvm.c b/target-ppc/kvm.c
index 26165b6..6667b61 100644
--- a/target-ppc/kvm.c
+++ b/target-ppc/kvm.c
@@ -650,37 +650,50 @@ static int kvmppc_find_cpu_dt(char *buf, int buf_len)
return 0;
}
-uint64_t kvmppc_get_clockfreq(void)
+/* Read a CPU node property from the host device tree that's a single
+ * integer (32-bit or 64-bit). Returns 0 if anything goes wrong
+ * (can't find or open the property, or doesn't understand the
+ * format) */
+static uint64_t kvmppc_read_int_cpu_dt(const char *propname)
{
- char buf[512];
- uint32_t tb[2];
+ char buf[PATH_MAX];
+ union {
+ uint32_t v32;
+ uint64_t v64;
+ } u;
FILE *f;
int len;
if (kvmppc_find_cpu_dt(buf, sizeof(buf))) {
- return 0;
+ return -1;
}
- strncat(buf, "/clock-frequency", sizeof(buf) - strlen(buf));
+ strncat(buf, "/", sizeof(buf) - strlen(buf));
+ strncat(buf, propname, sizeof(buf) - strlen(buf));
f = fopen(buf, "rb");
if (!f) {
return -1;
}
- len = fread(tb, sizeof(tb[0]), 2, f);
+ len = fread(&u, 1, sizeof(u), f);
fclose(f);
switch (len) {
- case 1:
- /* freq is only a single cell */
- return tb[0];
- case 2:
- return *(uint64_t*)tb;
+ case 4:
+ /* property is a 32-bit quantity */
+ return be32_to_cpu(u.v32);
+ case 8:
+ return be64_to_cpu(u.v64);
}
return 0;
}
+uint64_t kvmppc_get_clockfreq(void)
+{
+ return kvmppc_read_int_cpu_dt("clock-frequency");
+}
+
int kvmppc_get_hypercall(CPUState *env, uint8_t *buf, int buf_len)
{
uint32_t *hc = (uint32_t*)buf;
--
1.7.6.3
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [Qemu-devel] [PATCH 2/2] pseries: Add device tree properties for VMX/VSX and DFP under kvm
2011-10-11 4:31 [Qemu-devel] [PATCH 1/2] ppc: Generalize the kvmppc_get_clockfreq() function David Gibson
@ 2011-10-11 4:31 ` David Gibson
2011-10-12 14:17 ` Alexander Graf
2011-10-12 14:19 ` [Qemu-devel] [PATCH 1/2] ppc: Generalize the kvmppc_get_clockfreq() function Alexander Graf
1 sibling, 1 reply; 4+ messages in thread
From: David Gibson @ 2011-10-11 4:31 UTC (permalink / raw)
To: agraf; +Cc: qemu-devel
Sufficiently recent PAPR specifications define properties "ibm,vmx"
and "ibm,dfp" on the CPU node which advertise whether the VMX vector
extensions (or the later VSX version) and/or the Decimal Floating
Point operations from IBM's recent POWER CPUs are available.
Currently we do not put these in the guest device tree and the guest
kernel will consequently assume they are not available. This is good,
because they are not supported under TCG. VMX is similar enough to
Altivec that it might be trivial to support, but VSX and DFP would
both require significant work to support in TCG.
However, when running under kvm on a host which supports these
instructions, there's no reason not to let the guest use them. This
patch, therefore, checks for the relevant support on the host CPU
and, if present, advertises them to the guest as well.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
hw/spapr.c | 17 +++++++++++++++++
target-ppc/kvm.c | 10 ++++++++++
target-ppc/kvm_ppc.h | 12 ++++++++++++
3 files changed, 39 insertions(+), 0 deletions(-)
diff --git a/hw/spapr.c b/hw/spapr.c
index 9a3a1ea..00b9c67 100644
--- a/hw/spapr.c
+++ b/hw/spapr.c
@@ -186,6 +186,8 @@ static void *spapr_create_fdt_skel(const char *cpu_model,
0xffffffff, 0xffffffff};
uint32_t tbfreq = kvm_enabled() ? kvmppc_get_tbfreq() : TIMEBASE_FREQ;
uint32_t cpufreq = kvm_enabled() ? kvmppc_get_clockfreq() : 1000000000;
+ uint32_t vmx = kvm_enabled() ? kvmppc_get_vmx() : 0;
+ uint32_t dfp = kvm_enabled() ? kvmppc_get_dfp() : 0;
if ((index % smt) != 0) {
continue;
@@ -233,6 +235,21 @@ static void *spapr_create_fdt_skel(const char *cpu_model,
segs, sizeof(segs))));
}
+ /* Advertise VMX/VSX (vector extensions) if available
+ * 0 / no property == no vector extensions
+ * 1 == VMX / Altivec available
+ * 2 == VSX available */
+ if (vmx) {
+ _FDT((fdt_property_cell(fdt, "ibm,vmx", vmx)));
+ }
+
+ /* Advertise DFP (Decimal Floating Point) if available
+ * 0 / no property == no DFP
+ * 1 == DFP available */
+ if (dfp) {
+ _FDT((fdt_property_cell(fdt, "ibm,dfp", dfp)));
+ }
+
_FDT((fdt_end_node(fdt)));
}
diff --git a/target-ppc/kvm.c b/target-ppc/kvm.c
index 6667b61..6a48eb4 100644
--- a/target-ppc/kvm.c
+++ b/target-ppc/kvm.c
@@ -694,6 +694,16 @@ uint64_t kvmppc_get_clockfreq(void)
return kvmppc_read_int_cpu_dt("clock-frequency");
}
+uint32_t kvmppc_get_vmx(void)
+{
+ return kvmppc_read_int_cpu_dt("ibm,vmx");
+}
+
+uint32_t kvmppc_get_dfp(void)
+{
+ return kvmppc_read_int_cpu_dt("ibm,dfp");
+}
+
int kvmppc_get_hypercall(CPUState *env, uint8_t *buf, int buf_len)
{
uint32_t *hc = (uint32_t*)buf;
diff --git a/target-ppc/kvm_ppc.h b/target-ppc/kvm_ppc.h
index 9e8a7b5..fa131bf 100644
--- a/target-ppc/kvm_ppc.h
+++ b/target-ppc/kvm_ppc.h
@@ -15,6 +15,8 @@ void kvmppc_init(void);
uint32_t kvmppc_get_tbfreq(void);
uint64_t kvmppc_get_clockfreq(void);
+uint32_t kvmppc_get_vmx(void);
+uint32_t kvmppc_get_dfp(void);
int kvmppc_get_hypercall(CPUState *env, uint8_t *buf, int buf_len);
int kvmppc_set_interrupt(CPUState *env, int irq, int level);
void kvmppc_set_papr(CPUState *env);
@@ -35,6 +37,16 @@ static inline uint64_t kvmppc_get_clockfreq(void)
return 0;
}
+static inline uint32_t kvmppc_get_vmx(void)
+{
+ return 0;
+}
+
+static inline uint32_t kvmppc_get_dfp(void)
+{
+ return 0;
+}
+
static inline int kvmppc_get_hypercall(CPUState *env, uint8_t *buf, int buf_len)
{
return -1;
--
1.7.6.3
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [Qemu-devel] [PATCH 2/2] pseries: Add device tree properties for VMX/VSX and DFP under kvm
2011-10-11 4:31 ` [Qemu-devel] [PATCH 2/2] pseries: Add device tree properties for VMX/VSX and DFP under kvm David Gibson
@ 2011-10-12 14:17 ` Alexander Graf
0 siblings, 0 replies; 4+ messages in thread
From: Alexander Graf @ 2011-10-12 14:17 UTC (permalink / raw)
To: David Gibson; +Cc: qemu-devel
On 10/11/2011 06:31 AM, David Gibson wrote:
> Sufficiently recent PAPR specifications define properties "ibm,vmx"
> and "ibm,dfp" on the CPU node which advertise whether the VMX vector
> extensions (or the later VSX version) and/or the Decimal Floating
> Point operations from IBM's recent POWER CPUs are available.
>
> Currently we do not put these in the guest device tree and the guest
> kernel will consequently assume they are not available. This is good,
> because they are not supported under TCG. VMX is similar enough to
> Altivec that it might be trivial to support, but VSX and DFP would
> both require significant work to support in TCG.
>
> However, when running under kvm on a host which supports these
> instructions, there's no reason not to let the guest use them. This
> patch, therefore, checks for the relevant support on the host CPU
> and, if present, advertises them to the guest as well.
>
> Signed-off-by: David Gibson<david@gibson.dropbear.id.au>
> ---
> hw/spapr.c | 17 +++++++++++++++++
> target-ppc/kvm.c | 10 ++++++++++
> target-ppc/kvm_ppc.h | 12 ++++++++++++
> 3 files changed, 39 insertions(+), 0 deletions(-)
>
> diff --git a/hw/spapr.c b/hw/spapr.c
> index 9a3a1ea..00b9c67 100644
> --- a/hw/spapr.c
> +++ b/hw/spapr.c
> @@ -186,6 +186,8 @@ static void *spapr_create_fdt_skel(const char *cpu_model,
> 0xffffffff, 0xffffffff};
> uint32_t tbfreq = kvm_enabled() ? kvmppc_get_tbfreq() : TIMEBASE_FREQ;
> uint32_t cpufreq = kvm_enabled() ? kvmppc_get_clockfreq() : 1000000000;
> + uint32_t vmx = kvm_enabled() ? kvmppc_get_vmx() : 0;
> + uint32_t dfp = kvm_enabled() ? kvmppc_get_dfp() : 0;
This should only happen when the CPU type selected by -cpu also supports
VMX or DFP. For now, this is moot as we can't run any non-host CPU in
KVM for HV PPC. But looking forward, it certainly makes sense to split it.
This is not a nack, but please make sure to implement -cpu host in the
near future and default to that for -M pseries. Then we can change this
piece here to check for vcpu capabilities and AND them with the host caps.
The rest looks good.
Alex
>
> if ((index % smt) != 0) {
> continue;
> @@ -233,6 +235,21 @@ static void *spapr_create_fdt_skel(const char *cpu_model,
> segs, sizeof(segs))));
> }
>
> + /* Advertise VMX/VSX (vector extensions) if available
> + * 0 / no property == no vector extensions
> + * 1 == VMX / Altivec available
> + * 2 == VSX available */
> + if (vmx) {
> + _FDT((fdt_property_cell(fdt, "ibm,vmx", vmx)));
> + }
> +
> + /* Advertise DFP (Decimal Floating Point) if available
> + * 0 / no property == no DFP
> + * 1 == DFP available */
> + if (dfp) {
> + _FDT((fdt_property_cell(fdt, "ibm,dfp", dfp)));
> + }
> +
> _FDT((fdt_end_node(fdt)));
> }
>
> diff --git a/target-ppc/kvm.c b/target-ppc/kvm.c
> index 6667b61..6a48eb4 100644
> --- a/target-ppc/kvm.c
> +++ b/target-ppc/kvm.c
> @@ -694,6 +694,16 @@ uint64_t kvmppc_get_clockfreq(void)
> return kvmppc_read_int_cpu_dt("clock-frequency");
> }
>
> +uint32_t kvmppc_get_vmx(void)
> +{
> + return kvmppc_read_int_cpu_dt("ibm,vmx");
> +}
> +
> +uint32_t kvmppc_get_dfp(void)
> +{
> + return kvmppc_read_int_cpu_dt("ibm,dfp");
> +}
> +
> int kvmppc_get_hypercall(CPUState *env, uint8_t *buf, int buf_len)
> {
> uint32_t *hc = (uint32_t*)buf;
> diff --git a/target-ppc/kvm_ppc.h b/target-ppc/kvm_ppc.h
> index 9e8a7b5..fa131bf 100644
> --- a/target-ppc/kvm_ppc.h
> +++ b/target-ppc/kvm_ppc.h
> @@ -15,6 +15,8 @@ void kvmppc_init(void);
>
> uint32_t kvmppc_get_tbfreq(void);
> uint64_t kvmppc_get_clockfreq(void);
> +uint32_t kvmppc_get_vmx(void);
> +uint32_t kvmppc_get_dfp(void);
> int kvmppc_get_hypercall(CPUState *env, uint8_t *buf, int buf_len);
> int kvmppc_set_interrupt(CPUState *env, int irq, int level);
> void kvmppc_set_papr(CPUState *env);
> @@ -35,6 +37,16 @@ static inline uint64_t kvmppc_get_clockfreq(void)
> return 0;
> }
>
> +static inline uint32_t kvmppc_get_vmx(void)
> +{
> + return 0;
> +}
> +
> +static inline uint32_t kvmppc_get_dfp(void)
> +{
> + return 0;
> +}
> +
> static inline int kvmppc_get_hypercall(CPUState *env, uint8_t *buf, int buf_len)
> {
> return -1;
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [Qemu-devel] [PATCH 1/2] ppc: Generalize the kvmppc_get_clockfreq() function
2011-10-11 4:31 [Qemu-devel] [PATCH 1/2] ppc: Generalize the kvmppc_get_clockfreq() function David Gibson
2011-10-11 4:31 ` [Qemu-devel] [PATCH 2/2] pseries: Add device tree properties for VMX/VSX and DFP under kvm David Gibson
@ 2011-10-12 14:19 ` Alexander Graf
1 sibling, 0 replies; 4+ messages in thread
From: Alexander Graf @ 2011-10-12 14:19 UTC (permalink / raw)
To: David Gibson; +Cc: qemu-devel
On 10/11/2011 06:31 AM, David Gibson wrote:
> Currently the kvmppc_get_clockfreq() function reads the host's clock
> frequency from /proc/device-tree, which is useful to past to the guest
> in KVM setups. However, there are some other host properties
> advertised in the device tree which can also be relevant to the
> guests.
>
> This patch, therefore, replaces kvmppc_get_clockfreq() which can
> retrieve any named, single integer property from the host device
> tree's CPU node.
>
> Signed-off-by: David Gibson<david@gibson.dropbear.id.au>
Thanks, applied both patches to ppc-next.
Alex
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2011-10-12 14:16 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-10-11 4:31 [Qemu-devel] [PATCH 1/2] ppc: Generalize the kvmppc_get_clockfreq() function David Gibson
2011-10-11 4:31 ` [Qemu-devel] [PATCH 2/2] pseries: Add device tree properties for VMX/VSX and DFP under kvm David Gibson
2011-10-12 14:17 ` Alexander Graf
2011-10-12 14:19 ` [Qemu-devel] [PATCH 1/2] ppc: Generalize the kvmppc_get_clockfreq() function Alexander Graf
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).