xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: "Roger Pau Monné" <roger.pau@citrix.com>
To: Jan Beulich <JBeulich@suse.com>
Cc: Ian Campbell <ian.campbell@citrix.com>,
	Andrew Cooper <andrew.cooper3@citrix.com>,
	David Vrabel <david.vrabel@citrix.com>,
	xen-devel@lists.xenproject.org,
	Boris Ostrovsky <boris.ostrovsky@oracle.com>
Subject: Re: [PATCH v3 07/32] xen/x86: fix arch_set_info_guest for HVM guests
Date: Fri, 24 Jul 2015 18:54:09 +0200	[thread overview]
Message-ID: <55B26DB1.4020302@citrix.com> (raw)
In-Reply-To: <55B27AAB02000078000954A0@prv-mh.provo.novell.com>

El 24/07/15 a les 17.49, Jan Beulich ha escrit:
>>>> On 24.07.15 at 17:26, <roger.pau@citrix.com> wrote:
>> El 24/07/15 a les 14.44, Jan Beulich ha escrit:
>>>>>> On 24.07.15 at 14:11, <roger.pau@citrix.com> wrote:
>>>> Or your idea was to put all the bitness specific registers inside of
>>>> another separate structure and then unionize them? AFAICT the 16 and
>>>> 32bit structures are going to be empty.
>>>
>>> How that? 64-bit mode e.g. doesn't need full descriptor data for
>>> many of the segment registers.
>>
>> Please bear with me, but AFAIK cs, ds, es and ss still need to point to 
>> a GDT entry with a 0 base and a limit of 2^64.
> 
> No, in 64-bit mode bases are implicitly zero (with the exception of
> fs and gs) and limits are implicitly 2^64-1 (which you can't even
> express in a descriptor table entry, and with the exception of AMD's
> Long Mode Segment Limit extension).
> 
> But looking at the code below I see that you're thinking of selector
> values only, which would imply that you expect the hypervisor
> to actually read descriptors from the descriptor tables. That's
> doable, but cumbersome.

See the comment in the bottom of the email.

>> What about the following layout:
>>
>> #if defined(__GNUC__) && !defined(__STRICT_ANSI__)
>> /* Anonymous union includes 16-, 32- and 64-bit names (e.g., bp/ebp/rbp). */
>> # define __DECL_REG(n64, n32, n16) union {     \
>>         uint64_t n64;                          \
>>         uint32_t n32;                          \
>>         uint16_t n16;                          \
>>     }
>> #else
>> /* Non-gcc sources must always use the proper 64-bit name (e.g., rbp). */
>> #define __DECL_REG(n64, n32, n16) uint64_t n64
>> #endif
> 
> Since you keep repeating this, I finally have to comment on it: This
> is a suitable model for where we use it currently. It's imo not
> suitable at all here - not the least because even non-gcc users
> should be allowed to use just a 32-bit field when they mean one.
> But the problem is also that for 16- and 32-bit mode a 64-bit
> register is meaningless: Equally well you could expose r8-r15 to
> them.

Sorry, I didn't get that feeling by reading your previous comments. So
you would prefer to pack everything inside of the cpu_x86_<bitness>
structures?

>> #define __DECL_GP_REG(n) __DECL_REG(r##n, e##n, n)
>>
>> struct cpu_x86_16 {
>>     /* Control registers. */
>>     uint32_t cr[8];
>>     /* Debug registers. */
>>     uint32_t dr[8];
>>     /* GDT descriptor address. */
>>     uint16_t gdtr;
> 
> Even in 16-bit mode this is a 32-bit base address. And you're
> omitting the limit here an below (which is a required part namely
> when you expect the hypervisor to access this table).

Well, I had in mind that this would be the memory address where the GDTR
base and limit is stored, just like the one you would use with the lgdt
instruction, but please read below.

>> };
>>
>> struct cpu_x86_32 {
>>     /* Control registers. */
>>     uint32_t cr[8];
>>     /* Debug registers. */
>>     uint32_t dr[8];
>>     /* GDT descriptor address. */
>>     uint32_t gdtr;
>> };
>>
>> struct cpu_x86_64 {
>>     /* Additional amd64 general purpose registers. */
>>     uint64_t r8, r9, r10, r11, r12, r13, r14, r15;
>>     /* Control registers. */
>>     uint64_t cr[9];
> 
> [16]

Why 16? Intel SDM section 2.5 only mentions cr8 as newly added in amd64.
TBH, I'm not sure it makes much sense to be able to set cr8 from this
interface, it can always be set by the guest OS and should not be
required for booting.

>>     /* Debug registers. */
>>     uint64_t dr[8];
>>     /* Extended Feature Enable Register. */
>>     uint64_t efer;
>>     /* GDT descriptor address. */
>>     uint64_t gdtr;
>> };
>>
>> struct cpu_hvm_regs {
>>     /* General purpose registers. */
>>     __DECL_GP_REG(ax);
>>     __DECL_GP_REG(bx);
>>     __DECL_GP_REG(cx);
>>     __DECL_GP_REG(dx);
>>
>>     /* Index registers. */
>>     __DECL_GP_REG(di);
>>     __DECL_GP_REG(si);
>>
>>     /* Pointer registers. */
>>     __DECL_GP_REG(bp);
>>     __DECL_GP_REG(sp);
> 
> Now didn't you agree to use the _natural_ order (i.e. according to
> the numbers used to encode registers e.g. in instructions)?

OK, sorry, I didn't understand it that way. I though you only wanted
them properly sorted (so a, b, c...) and labelled.

>> struct vcpu_hvm_context {
>> /* 16bit fields of the strucutre will be used. */
>> #define _VCPUHVM_MODE_16B              0
>> #define VCPUHVM_MODE_16B               (1<<_VCPUHVM_MODE_16B)
>> /* 32bit fields of the structure will be used. */
>> #define _VCPUHVM_MODE_32B              1
>> #define VCPUHVM_MODE_32B               (1<<_VCPUHVM_MODE_32B)
>> /* 64bit fields of the structure will be used. */
>> #define _VCPUHVM_MODE_64B              2
>> #define VCPUHVM_MODE_64B               (1<<_VCPUHVM_MODE_64B)
> 
> As soon as we have three values here, a boolean flag approach
> doesn't make sense anymore.

Yes, taking into account that only _one_ of them can be used at the same
time.

I have the feeling that we are over engineering this interface. IMHO we
should only allow the user to set the control registers, efer (on amd64)
and the GP registers. Segment selectors would be set by Xen to point to
a flat segment suitable for the mode the guest has selected. I think
that should be enough to get the guest OS into it's entry point, and
then it can do whatever it wants.

If that's not suitable, then my second option would be to allow the
guest to set the base, limit and AR bytes of the selectors, but not load
a GDT.

Roger.

  reply	other threads:[~2015-07-24 16:54 UTC|newest]

Thread overview: 121+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-03 11:34 [PATCH v3 00/32] Introduce HVM without dm and new boot ABI Roger Pau Monne
2015-07-03 11:34 ` [PATCH v3 01/32] libxc: split x86 HVM setup_guest into smaller logical functions Roger Pau Monne
2015-07-06 10:45   ` Andrew Cooper
2015-07-28 11:22   ` Wei Liu
2015-07-03 11:34 ` [PATCH v3 02/32] libxc: unify xc_dom_p2m_{host/guest} Roger Pau Monne
2015-07-06 10:49   ` Andrew Cooper
2015-07-28 11:22   ` Wei Liu
2015-07-03 11:34 ` [PATCH v3 03/32] libxc: introduce the notion of a container type Roger Pau Monne
2015-07-06 12:01   ` Andrew Cooper
2015-07-28 11:22   ` Wei Liu
2015-07-03 11:34 ` [PATCH v3 04/32] libxc: introduce a domain loader for HVM guest firmware Roger Pau Monne
2015-07-06 12:11   ` Andrew Cooper
2015-07-28 11:22   ` Wei Liu
2015-07-03 11:34 ` [PATCH v3 05/32] libxc: make arch_setup_meminit a xc_dom_arch hook Roger Pau Monne
2015-07-06 12:23   ` Andrew Cooper
2015-07-27 10:40     ` Roger Pau Monné
2015-07-28 11:22   ` Wei Liu
2015-07-03 11:34 ` [PATCH v3 06/32] libxc: make arch_setup_boot{init/late} xc_dom_arch hooks Roger Pau Monne
2015-07-06 12:27   ` Andrew Cooper
2015-07-28 11:22   ` Wei Liu
2015-07-03 11:34 ` [PATCH v3 07/32] xen/x86: fix arch_set_info_guest for HVM guests Roger Pau Monne
2015-07-06 12:58   ` Andrew Cooper
2015-07-23 10:14     ` Roger Pau Monné
2015-07-10 18:39   ` Konrad Rzeszutek Wilk
2015-07-10 18:47   ` Konrad Rzeszutek Wilk
2015-07-23 10:17     ` Roger Pau Monné
2015-07-13 14:01   ` Jan Beulich
2015-07-23 10:25     ` Roger Pau Monné
2015-07-23 11:29       ` Jan Beulich
2015-07-23 11:41         ` Ian Campbell
2015-07-23 15:10           ` Roger Pau Monné
2015-07-23 15:32             ` Jan Beulich
2015-07-23 15:48               ` Roger Pau Monné
2015-07-23 15:58                 ` Jan Beulich
2015-07-23 16:00                 ` Ian Campbell
2015-07-23 16:15                   ` Andrew Cooper
2015-07-23 16:19                     ` Jan Beulich
2015-07-23 16:49                       ` Andrew Cooper
2015-07-23 17:06                         ` Roger Pau Monné
2015-07-23 16:56                       ` Roger Pau Monné
2015-07-23 17:12                         ` Andrew Cooper
2015-07-24  8:22                           ` Jan Beulich
2015-07-24  9:59                             ` Roger Pau Monné
2015-07-24 10:46                               ` Jan Beulich
2015-07-24 12:11                                 ` Roger Pau Monné
2015-07-24 12:44                                   ` Jan Beulich
2015-07-24 15:26                                     ` Roger Pau Monné
2015-07-24 15:49                                       ` Jan Beulich
2015-07-24 16:54                                         ` Roger Pau Monné [this message]
2015-07-24 17:36                                           ` Konrad Rzeszutek Wilk
2015-07-27 11:55                                             ` Roger Pau Monné
2015-08-03 16:55                                           ` Andrew Cooper
2015-08-03 17:31                                             ` Roger Pau Monné
2015-08-04 18:08                                               ` Andrew Cooper
2015-08-05  9:53                                                 ` Roger Pau Monné
2015-08-05 15:39                                                   ` Andrew Cooper
2015-08-05 16:40                                                     ` Roger Pau Monné
2015-08-05 16:46                                                       ` Andrew Cooper
2015-08-05 17:11                                                         ` Roger Pau Monné
2015-08-05 19:00                                                           ` Andrew Cooper
2015-08-07 12:15                                                           ` Tim Deegan
2015-08-11  7:26                                                 ` Jan Beulich
2015-07-24 11:11                               ` Andrew Cooper
2015-07-24 11:28                                 ` Ian Campbell
2015-07-24 11:49                                   ` Jan Beulich
2015-07-24 11:46                                 ` Jan Beulich
2015-07-24 11:49                                 ` Roger Pau Monné
2015-07-24 12:41                                   ` Jan Beulich
2015-07-24 15:28                                     ` Roger Pau Monné
2015-07-03 11:34 ` [PATCH v3 08/32] libxc: introduce a xc_dom_arch for hvm-3.0-x86_32 guests Roger Pau Monne
2015-07-06 13:40   ` Andrew Cooper
2015-07-03 11:34 ` [PATCH v3 09/32] libxl: switch HVM domain building to use xc_dom_* helpers Roger Pau Monne
2015-07-28 11:22   ` Wei Liu
2015-07-28 14:26     ` Roger Pau Monné
2015-07-28 14:29       ` Wei Liu
2015-07-03 11:34 ` [PATCH v3 10/32] libxc: remove dead HVM building code Roger Pau Monne
2015-07-06 13:46   ` Andrew Cooper
2015-07-23 10:27     ` Roger Pau Monné
2015-07-03 11:34 ` [PATCH v3 11/32] xen/x86: add bitmap of enabled emulated devices Roger Pau Monne
2015-07-06 14:10   ` Andrew Cooper
2015-07-07  7:26     ` Jan Beulich
2015-07-23 10:29     ` Roger Pau Monné
2015-07-03 11:34 ` [PATCH v3 12/32] xen/x86: allow disabling the emulated local apic Roger Pau Monne
2015-07-03 11:34 ` [PATCH v3 13/32] xen/x86: allow disabling the emulated HPET Roger Pau Monne
2015-07-03 11:34 ` [PATCH v3 14/32] xen/x86: allow disabling the pmtimer Roger Pau Monne
2015-07-03 11:34 ` [PATCH v3 15/32] xen/x86: allow disabling the emulated RTC Roger Pau Monne
2015-07-03 11:34 ` [PATCH v3 16/32] xen/x86: allow disabling the emulated IO APIC Roger Pau Monne
2015-07-03 11:34 ` [PATCH v3 17/32] xen/x86: allow disabling the emulated PIC Roger Pau Monne
2015-07-03 11:34 ` [PATCH v3 18/32] xen/x86: allow disabling the emulated pmu Roger Pau Monne
2015-07-03 11:34 ` [PATCH v3 19/32] xen/x86: allow disabling the emulated VGA Roger Pau Monne
2015-07-03 11:34 ` [PATCH v3 20/32] xen/x86: allow disabling the emulated IOMMU Roger Pau Monne
2015-07-03 11:34 ` [PATCH v3 21/32] xen/x86: allow disabling all emulated devices inside of Xen Roger Pau Monne
2015-07-03 11:35 ` [PATCH v3 22/32] elfnotes: intorduce a new PHYS_ENTRY elfnote Roger Pau Monne
2015-07-03 11:35 ` [PATCH v3 23/32] libxc: allow creating domains without emulated devices Roger Pau Monne
2015-07-28 11:22   ` Wei Liu
2015-07-03 11:35 ` [PATCH v3 24/32] xen: allow HVM guests to use XENMEM_memory_map Roger Pau Monne
2015-07-03 11:35 ` [PATCH v3 25/32] xen/x86: allow HVM guests to use hypercalls to bring up vCPUs Roger Pau Monne
2015-07-03 11:35 ` [PATCH v3 26/32] xenconsole: try to attach to PV console if HVM fails Roger Pau Monne
2015-07-14 13:46   ` Stefano Stabellini
2015-07-23 10:30     ` Roger Pau Monné
2015-07-03 11:35 ` [PATCH v3 27/32] libxc: change the position of the special pages Roger Pau Monne
2015-07-03 15:36   ` Roger Pau Monné
2015-07-10 19:06     ` Konrad Rzeszutek Wilk
2015-07-23 10:42       ` Roger Pau Monné
2015-07-03 11:35 ` [PATCH v3 28/32] libxc/xen: introduce HVM_PARAM_CMDLINE_PFN Roger Pau Monne
2015-07-03 11:35 ` [PATCH v3 29/32] libxc/xen: introduce HVM_PARAM_FIRST_FREE_PFN Roger Pau Monne
2015-07-10 19:05   ` Konrad Rzeszutek Wilk
2015-07-23 10:46     ` Roger Pau Monné
2015-07-03 11:35 ` [PATCH v3 30/32] libxc/xen: introduce HVM_PARAM_MODLIST_PFN Roger Pau Monne
2015-07-03 11:35 ` [PATCH v3 31/32] libxc: switch xc_dom_elfloader to be used with HVMlite domains Roger Pau Monne
2015-07-10 19:07   ` Konrad Rzeszutek Wilk
2015-07-23 10:48     ` Roger Pau Monné
2015-07-03 11:35 ` [PATCH v3 32/32] libxl: allow the creation of HVM domains without a device model Roger Pau Monne
2015-07-28 11:22   ` Wei Liu
2015-07-29 14:43     ` Roger Pau Monné
2015-07-29 14:50       ` Wei Liu
2015-07-29 14:58       ` Andrew Cooper
2015-07-03 16:19 ` [PATCH v3 00/32] Introduce HVM without dm and new boot ABI David Vrabel
2015-07-03 16:36   ` Roger Pau Monné
2015-07-10 17:44     ` Konrad Rzeszutek Wilk
2015-07-10 18:01       ` Konrad Rzeszutek Wilk

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=55B26DB1.4020302@citrix.com \
    --to=roger.pau@citrix.com \
    --cc=JBeulich@suse.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=boris.ostrovsky@oracle.com \
    --cc=david.vrabel@citrix.com \
    --cc=ian.campbell@citrix.com \
    --cc=xen-devel@lists.xenproject.org \
    /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 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).