From: Andi Kleen <ak@suse.de>
To: gcosta@redhat.com, ak@suse.de, patches@x86-64.org,
linux-kernel@vger.kernel.org
Subject: [PATCH] [42/45] x86_64: use descriptor's functions instead of inline assembly
Date: Fri, 21 Sep 2007 22:45:25 +0200 (CEST) [thread overview]
Message-ID: <20070921204525.92E8314EF1@wotan.suse.de> (raw)
In-Reply-To: <200709211044.901175000@suse.de>
From: Glauber de Oliveira Costa <gcosta@redhat.com>
This patch provides a new set of functions for managing the descriptor
tables that can be used instead of putting the raw assembly in .c files.
Remodeling of store_tr() suggested by Frederik Deweerdt.
Signed-off-by: Glauber de Oliveira Costa <gcosta@redhat.com>
Signed-off-by: Andi Kleen <ak@suse.de>
Cc: Andi Kleen <ak@suse.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
---
arch/x86_64/kernel/head64.c | 2 +-
arch/x86_64/kernel/reboot.c | 3 ++-
arch/x86_64/kernel/setup64.c | 4 ++--
arch/x86_64/kernel/suspend.c | 11 ++++++-----
include/asm-x86_64/desc.h | 29 +++++++++++++++++++++++++++++
5 files changed, 40 insertions(+), 9 deletions(-)
Index: linux/arch/x86_64/kernel/head64.c
===================================================================
--- linux.orig/arch/x86_64/kernel/head64.c
+++ linux/arch/x86_64/kernel/head64.c
@@ -70,7 +70,7 @@ void __init x86_64_start_kernel(char * r
for (i = 0; i < IDT_ENTRIES; i++)
set_intr_gate(i, early_idt_handler);
- asm volatile("lidt %0" :: "m" (idt_descr));
+ load_idt((const struct desc_ptr *)&idt_descr);
early_printk("Kernel alive\n");
Index: linux/arch/x86_64/kernel/reboot.c
===================================================================
--- linux.orig/arch/x86_64/kernel/reboot.c
+++ linux/arch/x86_64/kernel/reboot.c
@@ -11,6 +11,7 @@
#include <linux/sched.h>
#include <asm/io.h>
#include <asm/delay.h>
+#include <asm/desc.h>
#include <asm/hw_irq.h>
#include <asm/system.h>
#include <asm/pgtable.h>
@@ -136,7 +137,7 @@ void machine_emergency_restart(void)
}
case BOOT_TRIPLE:
- __asm__ __volatile__("lidt (%0)": :"r" (&no_idt));
+ load_idt((const struct desc_ptr *)&no_idt);
__asm__ __volatile__("int3");
reboot_type = BOOT_KBD;
Index: linux/arch/x86_64/kernel/setup64.c
===================================================================
--- linux.orig/arch/x86_64/kernel/setup64.c
+++ linux/arch/x86_64/kernel/setup64.c
@@ -224,8 +224,8 @@ void __cpuinit cpu_init (void)
memcpy(cpu_gdt(cpu), cpu_gdt_table, GDT_SIZE);
cpu_gdt_descr[cpu].size = GDT_SIZE;
- asm volatile("lgdt %0" :: "m" (cpu_gdt_descr[cpu]));
- asm volatile("lidt %0" :: "m" (idt_descr));
+ load_gdt((const struct desc_ptr *)&cpu_gdt_descr[cpu]);
+ load_idt((const struct desc_ptr *)&idt_descr);
memset(me->thread.tls_array, 0, GDT_ENTRY_TLS_ENTRIES * 8);
syscall_init();
Index: linux/arch/x86_64/kernel/suspend.c
===================================================================
--- linux.orig/arch/x86_64/kernel/suspend.c
+++ linux/arch/x86_64/kernel/suspend.c
@@ -32,9 +32,9 @@ void __save_processor_state(struct saved
/*
* descriptor tables
*/
- asm volatile ("sgdt %0" : "=m" (ctxt->gdt_limit));
- asm volatile ("sidt %0" : "=m" (ctxt->idt_limit));
- asm volatile ("str %0" : "=m" (ctxt->tr));
+ store_gdt((struct desc_ptr *)&ctxt->gdt_limit);
+ store_idt((struct desc_ptr *)&ctxt->idt_limit);
+ store_tr(ctxt->tr);
/* XMM0..XMM15 should be handled by kernel_fpu_begin(). */
/*
@@ -91,8 +91,9 @@ void __restore_processor_state(struct sa
* now restore the descriptor tables to their proper values
* ltr is done i fix_processor_context().
*/
- asm volatile ("lgdt %0" :: "m" (ctxt->gdt_limit));
- asm volatile ("lidt %0" :: "m" (ctxt->idt_limit));
+ load_gdt((const struct desc_ptr *)&ctxt->gdt_limit);
+ load_idt((const struct desc_ptr *)&ctxt->idt_limit);
+
/*
* segment registers
Index: linux/include/asm-x86_64/desc.h
===================================================================
--- linux.orig/include/asm-x86_64/desc.h
+++ linux/include/asm-x86_64/desc.h
@@ -20,6 +20,15 @@ extern struct desc_struct cpu_gdt_table[
#define load_LDT_desc() asm volatile("lldt %w0"::"r" (GDT_ENTRY_LDT*8))
#define clear_LDT() asm volatile("lldt %w0"::"r" (0))
+static inline unsigned long __store_tr(void)
+{
+ unsigned long tr;
+ asm volatile ("str %w0":"=r" (tr));
+ return tr;
+}
+
+#define store_tr(tr) (tr) = __store_tr()
+
/*
* This is the ldt that every process will get unless we need
* something other than this.
@@ -31,6 +40,16 @@ extern struct desc_ptr cpu_gdt_descr[];
/* the cpu gdt accessor */
#define cpu_gdt(_cpu) ((struct desc_struct *)cpu_gdt_descr[_cpu].address)
+static inline void load_gdt(const struct desc_ptr *ptr)
+{
+ asm volatile("lgdt %w0"::"m" (*ptr));
+}
+
+static inline void store_gdt(struct desc_ptr *ptr)
+{
+ asm ("sgdt %w0":"=m" (*ptr));
+}
+
static inline void _set_gate(void *adr, unsigned type, unsigned long func, unsigned dpl, unsigned ist)
{
struct gate_struct s;
@@ -71,6 +90,16 @@ static inline void set_system_gate_ist(i
_set_gate(&idt_table[nr], GATE_INTERRUPT, (unsigned long) func, 3, ist);
}
+static inline void load_idt(const struct desc_ptr *ptr)
+{
+ asm volatile("lidt %w0"::"m" (*ptr));
+}
+
+static inline void store_idt(struct desc_ptr *dtr)
+{
+ asm ("sidt %w0":"=m" (*dtr));
+}
+
static inline void set_tssldt_descriptor(void *ptr, unsigned long tss, unsigned type,
unsigned size)
{
next prev parent reply other threads:[~2007-09-21 20:59 UTC|newest]
Thread overview: 59+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-09-21 20:44 [PATCH] [0/45] x86 2.6.24 patches review I Andi Kleen
2007-09-21 20:44 ` [PATCH] [1/45] x86: misc. constifications Andi Kleen
2007-09-21 20:44 ` [PATCH] [2/45] x86: constify stacktrace_ops Andi Kleen
2007-09-21 20:44 ` [PATCH] [3/45] x86: Separate checking of unsynchronized and unstable TSC Andi Kleen
2007-09-21 20:44 ` [PATCH] [4/45] i386: Rewrite sched_clock Andi Kleen
2007-09-21 20:44 ` [PATCH] [5/45] x86_64: Use new shared sched_clock in x86-64 too Andi Kleen
2007-09-21 20:44 ` [PATCH] [6/45] x86: Unify i386 and x86-64 early quirks Andi Kleen
2007-09-21 20:44 ` [PATCH] [7/45] x86_64: Replace nvidia timer override quirk with pci id list and unify quirks Andi Kleen
2007-09-21 20:44 ` [PATCH] [8/45] x86_64: Use string instruction memcpy on AMD Fam11h Andi Kleen
2007-09-22 9:29 ` Jan Engelhardt
2007-09-21 20:44 ` [PATCH] [9/45] i386: Clean up duplicate includes in arch/i386/kernel/ Andi Kleen
2007-09-21 20:44 ` [PATCH] [10/45] x86_64: x86_64 Sanitize user specified e820 memmap values Andi Kleen
2007-09-21 20:44 ` [PATCH] [11/45] x86_64: Remove rogue default m in drivers/video/Kconfig Andi Kleen
2007-09-22 3:15 ` Len Brown
2007-09-21 20:44 ` [PATCH] [12/45] i386: Fix arch/i386/kernel/nmi.c - 'unknown_nmi_panic_callback' declared 'static' but never defined warning Andi Kleen
2007-09-21 21:08 ` Dave Jones
2007-09-21 20:44 ` [PATCH] [13/45] x86_64: Increase VDSO_TEXT_OFFSET for ancient binutils Andi Kleen
2007-11-14 0:21 ` CaT
2007-11-14 0:25 ` Andi Kleen
2007-09-21 20:44 ` [PATCH] [14/45] x86: Create clflush() inline, remove hardcoded wbinvd Andi Kleen
2007-09-21 20:44 ` [PATCH] [15/45] i386: i386 add AMD64 Barcelona PMU MSR definitions to msr.h Andi Kleen
2007-09-21 20:44 ` [PATCH] [16/45] i386: do not BUG_ON() when MSR is unknown Andi Kleen
2007-09-21 20:44 ` [PATCH] [17/45] i386: make Oprofile call shutdown() only once per session Andi Kleen
2007-09-21 20:44 ` [PATCH] [18/45] x86_64: 0 -> NULL, for arch/x86_64 Andi Kleen
2007-09-21 20:45 ` [PATCH] [19/45] x86_64: Always accumulate compiler options in CFLAGS Andi Kleen
2007-09-21 20:45 ` [PATCH] [20/45] x86_64: Use 8 byte stack alignment when possible Andi Kleen
2007-09-21 21:13 ` Dave Jones
2007-09-21 22:34 ` Andi Kleen
2007-09-21 22:52 ` Dave Jones
2007-09-21 21:19 ` Jakub Jelinek
2007-09-30 22:07 ` Andi Kleen
2007-09-21 20:45 ` [PATCH] [21/45] x86_64: Some cleanups for pci gart code Andi Kleen
2007-09-21 20:45 ` [PATCH] [22/45] x86_64: Enable iommu_merge by default Andi Kleen
2007-09-21 20:45 ` [PATCH] [23/45] i386: Make callgraph use dump_trace() on i386/x86_64 Andi Kleen
2007-09-21 20:45 ` [PATCH] [24/45] x86: Introduce frame_pointer() and stack_pointer() Andi Kleen
2007-09-22 9:26 ` Christoph Hellwig
2007-10-01 16:48 ` Andi Kleen
2007-09-21 20:45 ` [PATCH] [25/45] x86_64: remove sync_Arb_IDs Andi Kleen
2007-09-21 20:45 ` [PATCH] [26/45] x86_64: clear IO_APIC before enabing apic error vector Andi Kleen
2007-09-21 20:45 ` [PATCH] [27/45] x86_64: convert mm_context_t semaphore to a mutex Andi Kleen
2007-09-21 20:45 ` [PATCH] [28/45] x86_64: clean up apicid_to_node declaration Andi Kleen
2007-09-21 20:45 ` [PATCH] [29/45] i386: Consolidate show_regs and show_registers for i386 Andi Kleen
2007-09-21 20:45 ` [PATCH] [30/45] i386: Remove local CPU logic in MTRR call to smp_call_function_single Andi Kleen
2007-09-21 20:45 ` [PATCH] [31/45] i386: make struct apic_probe static Andi Kleen
2007-09-21 20:45 ` [PATCH] [32/45] x86_64: hide cond_syscall behind __KERNEL__ Andi Kleen
2007-09-22 9:30 ` Christoph Hellwig
2007-09-21 20:45 ` [PATCH] [33/45] i386: es7000 minor cleanups Andi Kleen
2007-09-21 20:45 ` [PATCH] [34/45] i386: no need to make enable_cpu_hotplug a variable Andi Kleen
2007-09-21 20:45 ` [PATCH] [35/45] i386: make some variables static Andi Kleen
2007-09-21 20:45 ` [PATCH] [36/45] x86_64: kmalloc + memset conversion to kzalloc Andi Kleen
2007-09-21 20:45 ` [PATCH] [37/45] i386: remove -maccumulate-outgoing-args Andi Kleen
2007-09-21 20:45 ` [PATCH] [38/45] i386: setup_trampoline() must be __cpuinit Andi Kleen
2007-09-21 20:45 ` [PATCH] [39/45] x86_64: block irq balancing for timer Andi Kleen
2007-09-21 20:45 ` [PATCH] [40/45] i386: deactivate the test for the dead CONFIG_DEBUG_PAGE_TYPE Andi Kleen
2007-09-21 20:45 ` [PATCH] [41/45] i386: remove unnecessary code Andi Kleen
2007-09-21 20:45 ` Andi Kleen [this message]
2007-09-21 20:45 ` [PATCH] [43/45] i386: Clean up duplicate includes in arch/i386/xen/ Andi Kleen
2007-09-21 20:45 ` [PATCH] [44/45] i386: simplify smp_call_function_single() call sequence in cpuid Andi Kleen
2007-09-21 20:45 ` [PATCH] [45/45] i386: simplify smp_call_function_single() call sequence Andi Kleen
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=20070921204525.92E8314EF1@wotan.suse.de \
--to=ak@suse.de \
--cc=gcosta@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=patches@x86-64.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®