mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: "Fenghua Yu" <fenghua.yu@intel.com>
To: "H. Peter Anvin" <hpa@linux.intel.com>,
	"Ingo Molnar" <mingo@elte.hu>,
	"Thomas Gleixner" <tglx@linutronix.de>,
	"Asit K Mallick" <asit.k.mallick@intel.com>
Cc: "linux-kernel" <linux-kernel@vger.kernel.org>,
	"x86" <x86@kernel.org>, "Fenghua Yu" <fenghua.yu@intel.com>
Subject: [PATCH 15/15] Define kernel API to get address of each state in xsave area
Date: Mon, 26 May 2014 10:01:22 -0700	[thread overview]
Message-ID: <1401123682-5384-16-git-send-email-fenghua.yu@intel.com> (raw)
In-Reply-To: <1401123682-5384-1-git-send-email-fenghua.yu@intel.com>

From: Fenghua Yu <fenghua.yu@intel.com>

In standard format, each state is saved in the xsave area in fixed offset.
In compacted format, offset of each saved state only can be calculated during
run time because some xstates may not be saved.

get_xsave_addr() returns address of a given state saved in a xsave area.

It can be called in kernel to get address of each xstate in xsave area in
either standard format or compacted format.

Signed-off-by: Fenghua Yu <fenghua.yu@intel.com>
---
 arch/x86/include/asm/xsave.h |  3 +++
 arch/x86/kernel/process.c    |  1 +
 arch/x86/kernel/xsave.c      | 64 ++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 68 insertions(+)

diff --git a/arch/x86/include/asm/xsave.h b/arch/x86/include/asm/xsave.h
index 0de695d..575e156 100644
--- a/arch/x86/include/asm/xsave.h
+++ b/arch/x86/include/asm/xsave.h
@@ -253,4 +253,7 @@ static inline int xrestore_user(struct xsave_struct __user *buf, u64 mask)
 	return err;
 }
 
+void *get_xsave_addr(struct xsave_struct *xsave, int xstate);
+void setup_xstate_comp(void);
+
 #endif
diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c
index 4505e2a..f804dc9 100644
--- a/arch/x86/kernel/process.c
+++ b/arch/x86/kernel/process.c
@@ -93,6 +93,7 @@ void arch_task_cache_init(void)
         	kmem_cache_create("task_xstate", xstate_size,
 				  __alignof__(union thread_xstate),
 				  SLAB_PANIC | SLAB_NOTRACK, NULL);
+	setup_xstate_comp();
 }
 
 /*
diff --git a/arch/x86/kernel/xsave.c b/arch/x86/kernel/xsave.c
index 2e9a77d..87e77f4 100644
--- a/arch/x86/kernel/xsave.c
+++ b/arch/x86/kernel/xsave.c
@@ -482,6 +482,47 @@ static void __init setup_xstate_features(void)
 }
 
 /*
+ * This function sets up offsets and sizes of all extended states in
+ * xsave area. This supports both standard format and compacted format
+ * of the xsave aread.
+ *
+ * Input: void
+ * Output: void
+ */
+void setup_xstate_comp(void)
+{
+	int i;
+
+	xstate_comp_offsets = kmalloc(xstate_features * sizeof(int),
+				      GFP_KERNEL);
+	xstate_comp_sizes = kmalloc(xstate_features * sizeof(int), GFP_KERNEL);
+
+	if (!cpu_has_xsaves) {
+		for (i = 2; i < xstate_features; i++) {
+			if (test_bit(i, (unsigned long *)&pcntxt_mask)) {
+				xstate_comp_offsets[i] = xstate_offsets[i];
+				xstate_comp_sizes[i] = xstate_sizes[i];
+			}
+		}
+		return;
+	}
+
+	xstate_comp_offsets[2] = FXSAVE_SIZE + XSAVE_HDR_SIZE;
+
+	for (i = 2; i < xstate_features; i++) {
+		if (test_bit(i, (unsigned long *)&pcntxt_mask))
+			xstate_comp_sizes[i] = xstate_sizes[i];
+		else
+			xstate_comp_sizes[i] = 0;
+
+		if (i > 2)
+			xstate_comp_offsets[i] = xstate_comp_offsets[i-1]
+					+ xstate_comp_sizes[i-1];
+
+	}
+}
+
+/*
  * setup the xstate image representing the init state
  */
 static void __init setup_init_fpu_buf(void)
@@ -667,3 +708,26 @@ void eager_fpu_init(void)
 	else
 		fxrstor_checking(&init_xstate_buf->i387);
 }
+
+/*
+ * Given the xsave area and a state inside, this function returns the
+ * address of the state.
+ *
+ * This is the API that is called to get xstate address in either
+ * standard format or compacted format of xsave area.
+ *
+ * Inputs:
+ *	xsave: base address of the xsave area;
+ *	xstate: state which is defined in xsave.h (e.g. XSTATE_FP, XSTATE_SSE,
+ *	etc.)
+ * Output:
+ *	address of the state in the xsave area.
+ */
+void *get_xsave_addr(struct xsave_struct *xsave, int xstate)
+{
+	int feature = fls64(xstate) - 1;
+	if (!test_bit(feature, (unsigned long *)&pcntxt_mask))
+		return NULL;
+
+	return (void *)xsave + xstate_comp_offsets[feature];
+}
-- 
1.8.1.2


  parent reply	other threads:[~2014-05-26 16:58 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-05-26 17:01 [PATCH 0/15] x86/xsaves: Optimize xstate context switch by xsaves/xrstors Fenghua Yu
2014-05-26 17:01 ` [PATCH 01/15] x86/xsaves: Detect xsaves/xrstors feature Fenghua Yu
2014-05-26 17:01 ` [PATCH 02/15] x86/xsaves: Add kernel parameter to disable xsaves/xrstors Fenghua Yu
2014-05-26 17:01 ` [PATCH 03/15] x86/alternative: Add alternative_input_2 Fenghua Yu
2014-05-26 17:01 ` [PATCH 04/15] x86/xsaves: Change compacted format xsave area header Fenghua Yu
2014-05-26 17:01 ` [PATCH 05/15] x86/xsaves: Define macros for xsave instructions Fenghua Yu
2014-05-26 17:01 ` [PATCH 06/15] x86/xsaves: Define macro for handle xsave/xrstor fault Fenghua Yu
2014-05-26 17:01 ` [PATCH 07/15] x86/xsaves: Use xsaves/xrstors for saving and restoring xsave area Fenghua Yu
2014-05-26 17:01 ` [PATCH 08/15] x86/xsaves: Use xsaves/xrstors for context switch Fenghua Yu
2014-05-26 17:01 ` [PATCH 09/15] x86/xsaves: Use xsave/xrstor for saving and restoring user space context Fenghua Yu
2014-05-26 17:01 ` [PATCH 10/15] x86/xsaves: Clear reserved bits in xsave header Fenghua Yu
2014-05-26 17:01 ` [PATCH 11/15] x86/xsaves: Add xsaves and xrstors support for booting time Fenghua Yu
2014-05-26 17:01 ` [PATCH 12/15] x86/xsaves: Save xstate to task's xsave area in __save_fpu during " Fenghua Yu
2014-05-26 17:01 ` [PATCH 13/15] x86/xsaves: Call booting time xsaves and xrstors in setup_init_fpu_buf Fenghua Yu
2014-05-26 17:01 ` [PATCH 14/15] x86/xsaves: Enable xsaves/xrstors Fenghua Yu
2014-05-26 17:01 ` Fenghua Yu [this message]
2014-05-26 19:37 ` [PATCH 0/15] x86/xsaves: Optimize xstate context switch by xsaves/xrstors Andy Lutomirski
2014-05-26 20:13   ` Yu, Fenghua
2014-05-26 20:53     ` H. Peter Anvin
2014-05-26 21:40     ` Andy Lutomirski
2014-05-26 21:47       ` H. Peter Anvin

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=1401123682-5384-16-git-send-email-fenghua.yu@intel.com \
    --to=fenghua.yu@intel.com \
    --cc=asit.k.mallick@intel.com \
    --cc=hpa@linux.intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=tglx@linutronix.de \
    --cc=x86@kernel.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

all inboxes | Powered by JetHome®