All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bagas Sanjaya <bagasdotme@gmail.com>
To: Xin Li <xin3.li@intel.com>,
	linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-edac@vger.kernel.org, linux-hyperv@vger.kernel.org,
	kvm@vger.kernel.org, xen-devel@lists.xenproject.org
Cc: tglx@linutronix.de, mingo@redhat.com, bp@alien8.de,
	dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com,
	luto@kernel.org, pbonzini@redhat.com, seanjc@google.com,
	peterz@infradead.org, jgross@suse.com, ravi.v.shankar@intel.com,
	mhiramat@kernel.org, andrew.cooper3@citrix.com,
	jiangshanlai@gmail.com, nik.borisov@suse.com
Subject: Re: [PATCH v12 06/37] Documentation/x86/64: Add a documentation for FRED
Date: Tue, 3 Oct 2023 16:59:52 +0700	[thread overview]
Message-ID: <ZRvmGNRZ4IvmguAY@debian.me> (raw)
In-Reply-To: <20231003062458.23552-7-xin3.li@intel.com>

[-- Attachment #1: Type: text/plain, Size: 4887 bytes --]

On Mon, Oct 02, 2023 at 11:24:27PM -0700, Xin Li wrote:
> diff --git a/Documentation/arch/x86/x86_64/fred.rst b/Documentation/arch/x86/x86_64/fred.rst
> new file mode 100644
> index 000000000000..9f57e7b91f7e
> --- /dev/null
> +++ b/Documentation/arch/x86/x86_64/fred.rst
> @@ -0,0 +1,96 @@
> +.. SPDX-License-Identifier: GPL-2.0
> +
> +=========================================
> +Flexible Return and Event Delivery (FRED)
> +=========================================
> +
> +Overview
> +========
> +
> +The FRED architecture defines simple new transitions that change
> +privilege level (ring transitions). The FRED architecture was
> +designed with the following goals:
> +
> +1) Improve overall performance and response time by replacing event
> +   delivery through the interrupt descriptor table (IDT event
> +   delivery) and event return by the IRET instruction with lower
> +   latency transitions.
> +
> +2) Improve software robustness by ensuring that event delivery
> +   establishes the full supervisor context and that event return
> +   establishes the full user context.
> +
> +The new transitions defined by the FRED architecture are FRED event
> +delivery and, for returning from events, two FRED return instructions.
> +FRED event delivery can effect a transition from ring 3 to ring 0, but
> +it is used also to deliver events incident to ring 0. One FRED
> +instruction (ERETU) effects a return from ring 0 to ring 3, while the
> +other (ERETS) returns while remaining in ring 0. Collectively, FRED
> +event delivery and the FRED return instructions are FRED transitions.
> +
> +In addition to these transitions, the FRED architecture defines a new
> +instruction (LKGS) for managing the state of the GS segment register.
> +The LKGS instruction can be used by 64-bit operating systems that do
> +not use the new FRED transitions.
> +
> +Furthermore, the FRED architecture is easy to extend for future CPU
> +architectures.
> +
> +Software based event dispatching
> +================================
> +
> +FRED operates differently from IDT in terms of event handling. Instead
> +of directly dispatching an event to its handler based on the event
> +vector, FRED requires the software to dispatch an event to its handler
> +based on both the event's type and vector. Therefore, an event dispatch
> +framework must be implemented to facilitate the event-to-handler
> +dispatch process. The FRED event dispatch framework takes control
> +once an event is delivered, and employs a two-level dispatch.
> +
> +The first level dispatching is event type based, and the second level
> +dispatching is event vector based.
> +
> +Full supervisor/user context
> +============================
> +
> +FRED event delivery atomically save and restore full supervisor/user
> +context upon event delivery and return. Thus it avoids the problem of
> +transient states due to %cr2 and/or %dr6, and it is no longer needed
> +to handle all the ugly corner cases caused by half baked entry states.
> +
> +FRED allows explicit unblock of NMI with new event return instructions
> +ERETS/ERETU, avoiding the mess caused by IRET which unconditionally
> +unblocks NMI, e.g., when an exception happens during NMI handling.
> +
> +FRED always restores the full value of %rsp, thus ESPFIX is no longer
> +needed when FRED is enabled.
> +
> +LKGS
> +====
> +
> +LKGS behaves like the MOV to GS instruction except that it loads the
> +base address into the IA32_KERNEL_GS_BASE MSR instead of the GS
> +segment’s descriptor cache. With LKGS, it ends up with avoiding
> +mucking with kernel GS, i.e., an operating system can always operate
> +with its own GS base address.
> +
> +Because FRED event delivery from ring 3 and ERETU both swap the value
> +of the GS base address and that of the IA32_KERNEL_GS_BASE MSR, plus
> +the introduction of LKGS instruction, the SWAPGS instruction is no
> +longer needed when FRED is enabled, thus is disallowed (#UD).
> +
> +Stack levels
> +============
> +
> +4 stack levels 0~3 are introduced to replace the nonreentrant IST for
> +event handling, and each stack level should be configured to use a
> +dedicated stack.
> +
> +The current stack level could be unchanged or go higher upon FRED
> +event delivery. If unchanged, the CPU keeps using the current event
> +stack. If higher, the CPU switches to a new event stack specified by
> +the MSR of the new stack level, i.e., MSR_IA32_FRED_RSP[123].
> +
> +Only execution of a FRED return instruction ERET[US], could lower the
> +current stack level, causing the CPU to switch back to the stack it was
> +on before a previous event delivery that promoted the stack level.

LGTM, thanks!

Reviewed-by: Bagas Sanjaya <bagasdotme@gmail.com>

-- 
An old man doll... just what I always wanted! - Clara

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

  reply	other threads:[~2023-10-03 10:00 UTC|newest]

Thread overview: 60+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-10-03  6:24 [PATCH v12 00/37] x86: enable FRED for x86-64 Xin Li
2023-10-03  6:24 ` [PATCH v12 01/37] x86/cpufeatures: Add the cpu feature bit for WRMSRNS Xin Li
2023-11-08 12:36   ` Borislav Petkov
2023-11-14  0:43     ` Li, Xin3
2023-11-14  5:02       ` Borislav Petkov
2023-11-14  5:58         ` Li, Xin3
2023-10-03  6:24 ` [PATCH v12 02/37] x86/opcode: Add the WRMSRNS instruction to the x86 opcode map Xin Li
2023-11-30  6:01   ` Li, Xin3
2023-10-03  6:24 ` [PATCH v12 03/37] x86/msr: Add the WRMSRNS instruction support Xin Li
2023-10-03  6:24 ` [PATCH v12 04/37] x86/entry: Remove idtentry_sysvec from entry_{32,64}.S Xin Li
2023-10-03  6:24 ` [PATCH v12 05/37] x86/trapnr: Add event type macros to <asm/trapnr.h> Xin Li
2023-10-03  6:24 ` [PATCH v12 06/37] Documentation/x86/64: Add a documentation for FRED Xin Li
2023-10-03  9:59   ` Bagas Sanjaya [this message]
2023-10-05  8:04     ` Li, Xin3
2023-10-03  6:24 ` [PATCH v12 07/37] x86/fred: Add Kconfig option for FRED (CONFIG_X86_FRED) Xin Li
2023-10-03  6:24 ` [PATCH v12 08/37] x86/cpufeatures: Add the cpu feature bit for FRED Xin Li
2023-10-03  6:24 ` [PATCH v12 09/37] x86/fred: Disable FRED support if CONFIG_X86_FRED is disabled Xin Li
2023-10-03  6:24 ` [PATCH v12 10/37] x86/fred: Disable FRED by default in its early stage Xin Li
2023-10-03  6:24 ` [PATCH v12 11/37] x86/opcode: Add ERET[US] instructions to the x86 opcode map Xin Li
2023-10-03  6:24 ` [PATCH v12 12/37] x86/objtool: Teach objtool about ERET[US] Xin Li
2023-10-03  6:24 ` [PATCH v12 13/37] x86/cpu: Add X86_CR4_FRED macro Xin Li
2023-10-03  6:24 ` [PATCH v12 14/37] x86/cpu: Add MSR numbers for FRED configuration Xin Li
2023-10-03  6:24 ` [PATCH v12 15/37] x86/ptrace: Cleanup the definition of the pt_regs structure Xin Li
2023-11-28  8:36   ` Borislav Petkov
2023-10-03  6:24 ` [PATCH v12 16/37] x86/ptrace: Add FRED additional information to " Xin Li
2023-11-28  8:51   ` Borislav Petkov
2023-11-28 17:18     ` H. Peter Anvin
2023-10-03  6:24 ` [PATCH v12 17/37] x86/fred: Add a new header file for FRED definitions Xin Li
2023-10-03  6:24 ` [PATCH v12 18/37] x86/fred: Reserve space for the FRED stack frame Xin Li
2023-10-03  6:24 ` [PATCH v12 19/37] x86/fred: Update MSR_IA32_FRED_RSP0 during task switch Xin Li
2023-11-13  9:37   ` Borislav Petkov
2023-11-13 17:36     ` H. Peter Anvin
2023-11-13 18:29       ` Borislav Petkov
2023-11-13 18:44         ` H. Peter Anvin
2023-10-03  6:24 ` [PATCH v12 20/37] x86/fred: Disallow the swapgs instruction when FRED is enabled Xin Li
2023-11-28  9:53   ` Borislav Petkov
2023-10-03  6:24 ` [PATCH v12 21/37] x86/fred: No ESPFIX needed " Xin Li
2023-10-03  6:24 ` [PATCH v12 22/37] x86/fred: Allow single-step trap and NMI when starting a new task Xin Li
2023-10-03  6:24 ` [PATCH v12 23/37] x86/fred: Make exc_page_fault() work for FRED Xin Li
2023-11-28 10:02   ` Borislav Petkov
2023-10-03  6:24 ` [PATCH v12 24/37] x86/idtentry: Incorporate definitions/declarations of the FRED entries Xin Li
2023-11-28 10:09   ` Borislav Petkov
2023-11-28 18:39     ` Li, Xin3
2023-11-28 18:58       ` H. Peter Anvin
2023-11-28 19:18         ` Borislav Petkov
2023-10-03  6:24 ` [PATCH v12 25/37] x86/fred: Add a debug fault entry stub for FRED Xin Li
2023-10-03  6:24 ` [PATCH v12 26/37] x86/fred: Add a NMI " Xin Li
2023-10-03  6:24 ` [PATCH v12 27/37] x86/fred: Add a machine check " Xin Li
2023-10-03  6:24 ` [PATCH v12 28/37] x86/fred: FRED entry/exit and dispatch code Xin Li
2023-10-03  6:24 ` [PATCH v12 29/37] x86/traps: Add sysvec_install() to install a system interrupt handler Xin Li
2023-10-03  6:24 ` [PATCH v12 30/37] x86/fred: Let ret_from_fork_asm() jmp to asm_fred_exit_user when FRED is enabled Xin Li
2023-10-03  6:24 ` [PATCH v12 31/37] x86/fred: Fixup fault on ERETU by jumping to fred_entrypoint_user Xin Li
2023-10-03  6:24 ` [PATCH v12 32/37] x86/entry/calling: Allow PUSH_AND_CLEAR_REGS being used beyond actual entry code Xin Li
2023-10-03  6:24 ` [PATCH v12 33/37] x86/entry: Add fred_entry_from_kvm() for VMX to handle IRQ/NMI Xin Li
2023-10-03  6:24 ` [PATCH v12 34/37] KVM: VMX: Call fred_entry_from_kvm() for IRQ/NMI handling Xin Li
2023-10-03  6:24 ` [PATCH v12 35/37] x86/syscall: Split IDT syscall setup code into idt_syscall_init() Xin Li
2023-10-03  6:24 ` [PATCH v12 36/37] x86/fred: Add FRED initialization functions Xin Li
2023-10-03  6:24 ` [PATCH v12 37/37] x86/fred: Invoke FRED initialization code to enable FRED Xin Li
2023-10-05  6:18 ` [PATCH v12 00/37] x86: enable FRED for x86-64 Nikolay Borisov
2023-10-05  7:21   ` Li, Xin3

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=ZRvmGNRZ4IvmguAY@debian.me \
    --to=bagasdotme@gmail.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=bp@alien8.de \
    --cc=dave.hansen@linux.intel.com \
    --cc=hpa@zytor.com \
    --cc=jgross@suse.com \
    --cc=jiangshanlai@gmail.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-edac@vger.kernel.org \
    --cc=linux-hyperv@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=luto@kernel.org \
    --cc=mhiramat@kernel.org \
    --cc=mingo@redhat.com \
    --cc=nik.borisov@suse.com \
    --cc=pbonzini@redhat.com \
    --cc=peterz@infradead.org \
    --cc=ravi.v.shankar@intel.com \
    --cc=seanjc@google.com \
    --cc=tglx@linutronix.de \
    --cc=x86@kernel.org \
    --cc=xen-devel@lists.xenproject.org \
    --cc=xin3.li@intel.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.