From: David Gibson <david@gibson.dropbear.id.au>
To: Alexey Kardashevskiy <aik@ozlabs.ru>
Cc: nikunj@linux.vnet.ibm.com, mdroth@linux.vnet.ibm.com,
thuth@redhat.com, lvivier@redhat.com, qemu-ppc@nongnu.org,
qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [RFC 09/17] ppc: Validate compatibility modes when setting
Date: Tue, 8 Nov 2016 16:14:13 +1100 [thread overview]
Message-ID: <20161108051413.GR28688@umbus.fritz.box> (raw)
In-Reply-To: <70ab01a2-2732-6615-f5fc-94b1eb6001b4@ozlabs.ru>
[-- Attachment #1: Type: text/plain, Size: 4463 bytes --]
On Fri, Nov 04, 2016 at 02:45:02PM +1100, Alexey Kardashevskiy wrote:
> On 31/10/16 19:39, David Gibson wrote:
> > On Mon, Oct 31, 2016 at 04:55:42PM +1100, Alexey Kardashevskiy wrote:
> >> On 30/10/16 22:12, David Gibson wrote:
> >>> Current ppc_set_compat() will attempt to set any compatiblity mode
> >>> specified, regardless of whether it's available on the CPU. The caller is
> >>> expected to make sure it is setting a possible mode, which is awkwward
> >>> because most of the information to make that decision is at the CPU level.
> >>>
> >>> This begins to clean this up by introducing a ppc_check_compat() function
> >>> which will determine if a given compatiblity mode is supported on a CPU
> >>> (and also whether it lies within specified minimum and maximum compat
> >>> levels, which will be useful later). It also contains an assertion that
> >>> the CPU has a "virtual hypervisor"[1], that is, that the guest isn't
> >>> permitted to execute hypervisor privilege code. Without that, the guest
> >>> would own the PCR and so could override any mode set here. Only machine
> >>> types which use a virtual hypervisor (i.e. 'pseries') should use
> >>> ppc_check_compat().
> >>>
> >>> ppc_set_compat() is modified to validate the compatibility mode it is given
> >>> and fail if it's not available on this CPU.
> >>>
> >>> [1] Or user-only mode, which also obviously doesn't allow access to the
> >>> hypervisor privileged PCR. We don't use that now, but could in future.
> >>>
> >>> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> >>> ---
> >>> target-ppc/compat.c | 41 +++++++++++++++++++++++++++++++++++++++++
> >>> target-ppc/cpu.h | 2 ++
> >>> 2 files changed, 43 insertions(+)
> >>>
> >>> diff --git a/target-ppc/compat.c b/target-ppc/compat.c
> >>> index 66529a6..1059555 100644
> >>> --- a/target-ppc/compat.c
> >>> +++ b/target-ppc/compat.c
> >>> @@ -28,29 +28,37 @@
> >>> typedef struct {
> >>> uint32_t pvr;
> >>> uint64_t pcr;
> >>> + uint64_t pcr_level;
> >>> int max_threads;
> >>> } CompatInfo;
> >>>
> >>> static const CompatInfo compat_table[] = {
> >>> + /*
> >>> + * Ordered from oldest to newest - the code relies on this
>
> In last 5+ years, I have never seen pointer compared anyhow but using "=="
> and "!=". A bit unusual.
Unusual, yes, but it has its uses from time to time.
>
>
> Reviewed-by: Alexey Kardashevskiy <aik@ozlabs.ru>
>
>
>
>
>
> >>> + */
> >>> { /* POWER6, ISA2.05 */
> >>> .pvr = CPU_POWERPC_LOGICAL_2_05,
> >>> .pcr = PCR_COMPAT_2_07 | PCR_COMPAT_2_06 | PCR_COMPAT_2_05
> >>> | PCR_TM_DIS | PCR_VSX_DIS,
> >>> + .pcr_level = PCR_COMPAT_2_05,
> >>> .max_threads = 2,
> >>> },
> >>> { /* POWER7, ISA2.06 */
> >>> .pvr = CPU_POWERPC_LOGICAL_2_06,
> >>> .pcr = PCR_COMPAT_2_07 | PCR_COMPAT_2_06 | PCR_TM_DIS,
> >>> + .pcr_level = PCR_COMPAT_2_06,
> >>> .max_threads = 4,
> >>> },
> >>> {
> >>> .pvr = CPU_POWERPC_LOGICAL_2_06_PLUS,
> >>> .pcr = PCR_COMPAT_2_07 | PCR_COMPAT_2_06 | PCR_TM_DIS,
> >>> + .pcr_level = PCR_COMPAT_2_06,
> >>> .max_threads = 4,
> >>> },
> >>> { /* POWER8, ISA2.07 */
> >>> .pvr = CPU_POWERPC_LOGICAL_2_07,
> >>> .pcr = PCR_COMPAT_2_07,
> >>> + .pcr_level = PCR_COMPAT_2_07,
> >>> .max_threads = 8,
> >>> },
> >>> };
> >>> @@ -67,6 +75,35 @@ static const CompatInfo *compat_by_pvr(uint32_t pvr)
> >>> return NULL;
> >>> }
> >>>
> >>> +bool ppc_check_compat(PowerPCCPU *cpu, uint32_t compat_pvr,
> >>> + uint32_t min_compat_pvr, uint32_t max_compat_pvr)
> >>> +{
> >>> + PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
> >>> + const CompatInfo *compat = compat_by_pvr(compat_pvr);
> >>> + const CompatInfo *min = compat_by_pvr(min_compat_pvr);
> >>> + const CompatInfo *max = compat_by_pvr(max_compat_pvr);
> >>
> >>
> >> You keep giving very generic names (as "min" and "max") to local
> >> variables ;)
> >
> > For local variables, brevity is a virtue.
>
>
>
>
>
--
David Gibson | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_
| _way_ _around_!
http://www.ozlabs.org/~dgibson
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 819 bytes --]
next prev parent reply other threads:[~2016-11-08 5:35 UTC|newest]
Thread overview: 75+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-10-30 11:11 [Qemu-devel] [RFC 00/17] Clean up compatibility mode handling David Gibson
2016-10-30 11:11 ` [Qemu-devel] [RFC 01/17] ppc: Remove some stub POWER6 models David Gibson
2016-10-31 7:38 ` Thomas Huth
2016-10-31 8:37 ` David Gibson
2016-11-08 3:40 ` David Gibson
2016-10-30 11:11 ` [Qemu-devel] [RFC 02/17] powernv: CPU compatibility modes don't make sense for powernv David Gibson
2016-10-31 7:46 ` Thomas Huth
2016-10-31 8:38 ` David Gibson
2016-10-31 10:35 ` Greg Kurz
2016-10-30 11:11 ` [Qemu-devel] [RFC 03/17] pseries: Always use core objects for CPU construction David Gibson
2016-11-03 8:11 ` Alexey Kardashevskiy
2016-11-04 9:51 ` [Qemu-devel] [Qemu-ppc] " Greg Kurz
2016-11-08 5:34 ` David Gibson
2016-10-30 11:11 ` [Qemu-devel] [RFC 04/17] pseries: Make cpu_update during CAS unconditional David Gibson
2016-11-03 8:24 ` Alexey Kardashevskiy
2016-11-04 10:45 ` Thomas Huth
2016-11-08 3:44 ` David Gibson
2016-10-30 11:11 ` [Qemu-devel] [RFC 05/17] ppc: Clean up and QOMify hypercall emulation David Gibson
2016-11-03 8:50 ` Alexey Kardashevskiy
2016-10-30 11:11 ` [Qemu-devel] [RFC 06/17] ppc: Rename cpu_version to compat_pvr David Gibson
2016-11-04 2:26 ` Alexey Kardashevskiy
2016-11-08 3:48 ` David Gibson
2016-11-04 10:51 ` Thomas Huth
2016-10-30 11:11 ` [Qemu-devel] [RFC 07/17] ppc: Rewrite ppc_set_compat() David Gibson
2016-11-04 2:57 ` Alexey Kardashevskiy
2016-11-08 3:49 ` David Gibson
2016-10-30 11:11 ` [Qemu-devel] [RFC 08/17] ppc: Rewrite ppc_get_compat_smt_threads() David Gibson
2016-11-04 3:37 ` Alexey Kardashevskiy
2016-11-08 5:13 ` David Gibson
2016-10-30 11:12 ` [Qemu-devel] [RFC 09/17] ppc: Validate compatibility modes when setting David Gibson
2016-10-31 5:55 ` Alexey Kardashevskiy
2016-10-31 8:39 ` David Gibson
2016-11-04 3:45 ` Alexey Kardashevskiy
2016-11-08 5:14 ` David Gibson [this message]
2016-10-30 11:12 ` [Qemu-devel] [RFC 10/17] pseries: Rewrite CAS PVR compatibility logic David Gibson
2016-10-31 5:00 ` Alexey Kardashevskiy
2016-10-31 5:44 ` David Gibson
2016-11-10 17:54 ` Michael Roth
2016-11-10 23:50 ` David Gibson
2016-10-30 11:12 ` [Qemu-devel] [RFC 11/17] ppc: Add ppc_set_compat_all() David Gibson
2016-11-04 4:01 ` Alexey Kardashevskiy
2016-11-08 5:18 ` David Gibson
2016-11-09 1:27 ` Alexey Kardashevskiy
2016-11-09 3:52 ` David Gibson
2016-11-09 5:18 ` Alexey Kardashevskiy
2016-11-10 3:13 ` David Gibson
2016-10-30 11:12 ` [Qemu-devel] [RFC 12/17] ppc: Migrate compatibility mode David Gibson
2016-11-04 5:58 ` Alexey Kardashevskiy
2016-11-08 5:19 ` David Gibson
2016-11-08 5:51 ` Alexey Kardashevskiy
2016-11-10 1:59 ` David Gibson
2016-11-10 23:55 ` Michael Roth
2016-11-14 1:15 ` David Gibson
2016-10-30 11:12 ` [Qemu-devel] [RFC 13/17] pseries: Move CPU compatibility property to machine David Gibson
2016-11-04 7:43 ` Alexey Kardashevskiy
2016-11-08 5:26 ` David Gibson
2016-11-08 5:56 ` Alexey Kardashevskiy
2016-11-09 4:41 ` David Gibson
2016-10-30 11:12 ` [Qemu-devel] [RFC 14/17] pseries: Reset CPU compatibility mode David Gibson
2016-11-04 7:50 ` Alexey Kardashevskiy
2016-10-30 11:12 ` [Qemu-devel] [RFC 15/17] ppc: Check that CPU model stays consistent across migration David Gibson
2016-11-04 7:54 ` Alexey Kardashevskiy
2016-11-08 5:29 ` David Gibson
2016-11-08 6:03 ` Alexey Kardashevskiy
2016-11-09 4:24 ` David Gibson
2016-11-09 6:06 ` Alexey Kardashevskiy
2016-11-09 6:40 ` David Gibson
2016-10-30 11:12 ` [Qemu-devel] [RFC 16/17] ppc: Remove counter-productive "sanity checks" in migration David Gibson
2016-11-04 5:52 ` Alexey Kardashevskiy
2016-11-08 5:31 ` David Gibson
2016-11-11 18:13 ` [Qemu-devel] [Qemu-ppc] " Greg Kurz
2016-11-14 2:34 ` Alexey Kardashevskiy
2016-11-14 6:08 ` David Gibson
2016-10-30 11:12 ` [Qemu-devel] [RFC 17/17] pseries: Default to POWER8 compatibility mode David Gibson
2016-10-30 11:58 ` David Gibson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20161108051413.GR28688@umbus.fritz.box \
--to=david@gibson.dropbear.id.au \
--cc=aik@ozlabs.ru \
--cc=lvivier@redhat.com \
--cc=mdroth@linux.vnet.ibm.com \
--cc=nikunj@linux.vnet.ibm.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
--cc=thuth@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.