From: tip-bot for Thomas Gleixner <tipbot@zytor.com> To: linux-tip-commits@vger.kernel.org Cc: jpoimboe@redhat.com, tglx@linutronix.de, dvlasenk@redhat.com, linux-kernel@vger.kernel.org, brgerst@gmail.com, rostedt@goodmis.org, luto@kernel.org, peterz@infradead.org, torvalds@linux-foundation.org, mingo@kernel.org, hpa@zytor.com, bp@alien8.de Subject: [tip:x86/apic] x86/gdt: Use bitfields for initialization Date: Tue, 29 Aug 2017 04:14:21 -0700 [thread overview] Message-ID: <tip-38e9e81f4c81c75799b002d5811de7241b307676@git.kernel.org> (raw) In-Reply-To: <20170828064958.197673367@linutronix.de> Commit-ID: 38e9e81f4c81c75799b002d5811de7241b307676 Gitweb: http://git.kernel.org/tip/38e9e81f4c81c75799b002d5811de7241b307676 Author: Thomas Gleixner <tglx@linutronix.de> AuthorDate: Mon, 28 Aug 2017 08:47:41 +0200 Committer: Ingo Molnar <mingo@kernel.org> CommitDate: Tue, 29 Aug 2017 12:07:25 +0200 x86/gdt: Use bitfields for initialization The GDT entry related code uses two ways to access entries via union fields: - bitfields - macros which initialize the two 16-bit parts of the entry by magic shift and mask operations. Clean it up and only use the bitfields to initialize and access entries. ( The old access patterns were partly done due to GCC optimizing bitfield accesses in a horrible way - that's mostly fixed these days and clarity of code in such low level accessors is very important. ) Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Cc: Andy Lutomirski <luto@kernel.org> Cc: Borislav Petkov <bp@alien8.de> Cc: Brian Gerst <brgerst@gmail.com> Cc: Denys Vlasenko <dvlasenk@redhat.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Josh Poimboeuf <jpoimboe@redhat.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Steven Rostedt <rostedt@goodmis.org> Link: http://lkml.kernel.org/r/20170828064958.197673367@linutronix.de Signed-off-by: Ingo Molnar <mingo@kernel.org> --- arch/x86/entry/vdso/vma.c | 2 +- arch/x86/include/asm/desc.h | 26 +++++++++++++++--------- arch/x86/include/asm/desc_defs.h | 44 ++++++++++++++++++---------------------- arch/x86/math-emu/fpu_system.h | 2 +- 4 files changed, 38 insertions(+), 36 deletions(-) diff --git a/arch/x86/entry/vdso/vma.c b/arch/x86/entry/vdso/vma.c index 726355c..1911310 100644 --- a/arch/x86/entry/vdso/vma.c +++ b/arch/x86/entry/vdso/vma.c @@ -351,7 +351,7 @@ static void vgetcpu_cpu_init(void *arg) * and 8 bits for the node) */ d.limit0 = cpu | ((node & 0xf) << 12); - d.limit = node >> 4; + d.limit1 = node >> 4; d.type = 5; /* RO data, expand down, accessed */ d.dpl = 3; /* Visible to user code */ d.s = 1; /* Not a system segment */ diff --git a/arch/x86/include/asm/desc.h b/arch/x86/include/asm/desc.h index 0731064..2090cd2 100644 --- a/arch/x86/include/asm/desc.h +++ b/arch/x86/include/asm/desc.h @@ -23,7 +23,7 @@ static inline void fill_ldt(struct desc_struct *desc, const struct user_desc *in desc->s = 1; desc->dpl = 0x3; desc->p = info->seg_not_present ^ 1; - desc->limit = (info->limit & 0xf0000) >> 16; + desc->limit1 = (info->limit & 0xf0000) >> 16; desc->avl = info->useable; desc->d = info->seg_32bit; desc->g = info->limit_in_pages; @@ -170,14 +170,20 @@ static inline void pack_descriptor(struct desc_struct *desc, unsigned long base, unsigned long limit, unsigned char type, unsigned char flags) { - desc->a = ((base & 0xffff) << 16) | (limit & 0xffff); - desc->b = (base & 0xff000000) | ((base & 0xff0000) >> 16) | - (limit & 0x000f0000) | ((type & 0xff) << 8) | - ((flags & 0xf) << 20); - desc->p = 1; + desc->limit0 = (u16) limit; + desc->base0 = (u16) base; + desc->base1 = (base >> 16) & 0xFF; + desc->type = type & 0x0F; + desc->s = 0; + desc->dpl = 0; + desc->p = 1; + desc->limit1 = (limit >> 16) & 0xF; + desc->avl = (flags >> 0) & 0x01; + desc->l = (flags >> 1) & 0x01; + desc->d = (flags >> 2) & 0x01; + desc->g = (flags >> 3) & 0x01; } - static inline void set_tssldt_descriptor(void *d, unsigned long addr, unsigned type, unsigned size) { @@ -195,7 +201,7 @@ static inline void set_tssldt_descriptor(void *d, unsigned long addr, desc->base2 = (addr >> 24) & 0xFF; desc->base3 = (u32) (addr >> 32); #else - pack_descriptor((struct desc_struct *)d, addr, size, 0x80 | type, 0); + pack_descriptor((struct desc_struct *)d, addr, size, type, 0); #endif } @@ -395,13 +401,13 @@ static inline void set_desc_base(struct desc_struct *desc, unsigned long base) static inline unsigned long get_desc_limit(const struct desc_struct *desc) { - return desc->limit0 | (desc->limit << 16); + return desc->limit0 | (desc->limit1 << 16); } static inline void set_desc_limit(struct desc_struct *desc, unsigned long limit) { desc->limit0 = limit & 0xffff; - desc->limit = (limit >> 16) & 0xf; + desc->limit1 = (limit >> 16) & 0xf; } #ifdef CONFIG_X86_64 diff --git a/arch/x86/include/asm/desc_defs.h b/arch/x86/include/asm/desc_defs.h index d684bee..1b9494e 100644 --- a/arch/x86/include/asm/desc_defs.h +++ b/arch/x86/include/asm/desc_defs.h @@ -11,34 +11,30 @@ #include <linux/types.h> -/* - * FIXME: Accessing the desc_struct through its fields is more elegant, - * and should be the one valid thing to do. However, a lot of open code - * still touches the a and b accessors, and doing this allow us to do it - * incrementally. We keep the signature as a struct, rather than a union, - * so we can get rid of it transparently in the future -- glommer - */ /* 8 byte segment descriptor */ struct desc_struct { - union { - struct { - unsigned int a; - unsigned int b; - }; - struct { - u16 limit0; - u16 base0; - unsigned base1: 8, type: 4, s: 1, dpl: 2, p: 1; - unsigned limit: 4, avl: 1, l: 1, d: 1, g: 1, base2: 8; - }; - }; + u16 limit0; + u16 base0; + u16 base1: 8, type: 4, s: 1, dpl: 2, p: 1; + u16 limit1: 4, avl: 1, l: 1, d: 1, g: 1, base2: 8; } __attribute__((packed)); -#define GDT_ENTRY_INIT(flags, base, limit) { { { \ - .a = ((limit) & 0xffff) | (((base) & 0xffff) << 16), \ - .b = (((base) & 0xff0000) >> 16) | (((flags) & 0xf0ff) << 8) | \ - ((limit) & 0xf0000) | ((base) & 0xff000000), \ - } } } +#define GDT_ENTRY_INIT(flags, base, limit) \ + { \ + .limit0 = (u16) (limit), \ + .limit1 = ((limit) >> 16) & 0x0F, \ + .base0 = (u16) (base), \ + .base1 = ((base) >> 16) & 0xFF, \ + .base2 = ((base) >> 24) & 0xFF, \ + .type = (flags & 0x0f), \ + .s = (flags >> 4) & 0x01, \ + .dpl = (flags >> 5) & 0x03, \ + .p = (flags >> 7) & 0x01, \ + .avl = (flags >> 12) & 0x01, \ + .l = (flags >> 13) & 0x01, \ + .d = (flags >> 14) & 0x01, \ + .g = (flags >> 15) & 0x01, \ + } enum { GATE_INTERRUPT = 0xE, diff --git a/arch/x86/math-emu/fpu_system.h b/arch/x86/math-emu/fpu_system.h index 2319a25..699f329 100644 --- a/arch/x86/math-emu/fpu_system.h +++ b/arch/x86/math-emu/fpu_system.h @@ -49,7 +49,7 @@ static inline unsigned long seg_get_base(struct desc_struct *d) static inline unsigned long seg_get_limit(struct desc_struct *d) { - return ((unsigned long)d->limit << 16) | d->limit0; + return ((unsigned long)d->limit1 << 16) | d->limit0; } static inline unsigned long seg_get_granularity(struct desc_struct *d)
next prev parent reply other threads:[~2017-08-29 11:20 UTC|newest] Thread overview: 95+ messages / expand[flat|nested] mbox.gz Atom feed top 2017-08-28 6:47 [patch V3 00/44] x86: Cleanup IDT code Thomas Gleixner 2017-08-28 6:47 ` [patch V3 01/44] x86/irq: Remove vector_used_by_percpu_irq() Thomas Gleixner 2017-08-29 11:04 ` [tip:x86/apic] " tip-bot for Thomas Gleixner 2017-08-28 6:47 ` [patch V3 02/44] x86/irq: Unexport used_vectors Thomas Gleixner 2017-08-29 11:04 ` [tip:x86/apic] x86/irq: Unexport used_vectors[] tip-bot for Thomas Gleixner 2017-08-28 6:47 ` [patch V3 03/44] x86/irq: Get rid of the first_system_vector bogisity Thomas Gleixner 2017-08-29 11:04 ` [tip:x86/apic] x86/irq: Get rid of the 'first_system_vector' indirection bogosity tip-bot for Thomas Gleixner 2017-08-28 6:47 ` [patch V3 04/44] x86/irq: Remove duplicated used_vectors definition Thomas Gleixner 2017-08-29 11:05 ` [tip:x86/apic] " tip-bot for Thomas Gleixner 2017-08-28 6:47 ` [patch V3 05/44] x86/boot: Move EISA setup to a proper place Thomas Gleixner 2017-08-29 11:05 ` [tip:x86/apic] x86/boot: Move EISA setup to a separate file tip-bot for Thomas Gleixner 2017-08-28 6:47 ` [patch V3 06/44] x86/tracing: Introduce a static key for exception tracing Thomas Gleixner 2017-08-29 11:06 ` [tip:x86/apic] " tip-bot for Thomas Gleixner 2017-08-28 6:47 ` [patch V3 07/44] x86/traps: Simplify pagefault tracing logic Thomas Gleixner 2017-08-29 11:06 ` [tip:x86/apic] " tip-bot for Thomas Gleixner 2017-08-28 6:47 ` [patch V3 08/44] x86/apic: Remove the duplicated tracing version of local_timer_interrupt Thomas Gleixner 2017-08-29 11:07 ` [tip:x86/apic] x86/apic: Remove the duplicated tracing version of local_timer_interrupt() tip-bot for Thomas Gleixner 2017-08-28 6:47 ` [patch V3 09/44] x86/apic: Use this_cpu_ptr in local_timer_interrupt Thomas Gleixner 2017-08-29 11:07 ` [tip:x86/apic] x86/apic: Use this_cpu_ptr() in local_timer_interrupt() tip-bot for Thomas Gleixner 2017-08-28 6:47 ` [patch V3 10/44] x86/irq: Get rid of duplicated trace_x86_platform_ipi() code Thomas Gleixner 2017-08-29 11:07 ` [tip:x86/apic] " tip-bot for Thomas Gleixner 2017-08-28 6:47 ` [patch V3 11/44] x86/apic: Remove the duplicated tracing versions of interrupts Thomas Gleixner 2017-08-29 11:08 ` [tip:x86/apic] " tip-bot for Thomas Gleixner 2017-08-28 6:47 ` [patch V3 12/44] x86/irqwork: Get rid of duplicated tracing interrupt code Thomas Gleixner 2017-08-29 11:08 ` [tip:x86/apic] " tip-bot for Thomas Gleixner 2017-08-28 6:47 ` [patch V3 13/44] x86/mce: Remove " Thomas Gleixner 2017-08-29 11:08 ` [tip:x86/apic] " tip-bot for Thomas Gleixner 2017-08-28 6:47 ` [patch V3 14/44] x86/smp: Remove pointless duplicated " Thomas Gleixner 2017-08-29 11:09 ` [tip:x86/apic] " tip-bot for Thomas Gleixner 2017-08-28 6:47 ` [patch V3 15/44] x86/smp: Use static key for reschedule interrupt tracing Thomas Gleixner 2017-08-29 11:09 ` [tip:x86/apic] " tip-bot for Thomas Gleixner 2017-08-28 6:47 ` [patch V3 16/44] x86/idt: Remove tracing idt completely Thomas Gleixner 2017-08-29 11:10 ` [tip:x86/apic] x86/idt: Remove the tracing IDT completely tip-bot for Thomas Gleixner 2017-08-28 6:47 ` [patch V3 17/44] x86/idt: Cleanup the i386 low level entry macros Thomas Gleixner 2017-08-29 11:10 ` [tip:x86/apic] x86/idt: Clean up " tip-bot for Thomas Gleixner 2017-08-28 6:47 ` [patch V3 18/44] x86/tracing: Disentangle pagefault and resched IPI tracing key Thomas Gleixner 2017-08-29 11:10 ` [tip:x86/apic] " tip-bot for Thomas Gleixner 2017-08-28 6:47 ` [patch V3 19/44] x86/ipi: Make platform IPI depend on APIC Thomas Gleixner 2017-08-29 11:11 ` [tip:x86/apic] " tip-bot for Thomas Gleixner 2017-08-28 6:47 ` [patch V3 20/44] x86/irq_work: Make it " Thomas Gleixner 2017-08-29 11:11 ` [tip:x86/apic] " tip-bot for Thomas Gleixner 2017-08-28 6:47 ` [patch V3 21/44] x86/tracing: Build tracepoints only when they are used Thomas Gleixner 2017-08-29 11:12 ` [tip:x86/apic] " tip-bot for Thomas Gleixner 2017-08-28 6:47 ` [patch V3 22/44] x86/idt: Unify gate_struct handling for 32/64bit Thomas Gleixner 2017-08-29 11:12 ` [tip:x86/apic] x86/idt: Unify gate_struct handling for 32/64-bit kernels tip-bot for Thomas Gleixner 2017-08-28 6:47 ` [patch V3 23/44] x86/percpu: Use static initializer for GDT entry Thomas Gleixner 2017-08-29 11:13 ` [tip:x86/apic] " tip-bot for Thomas Gleixner 2017-08-28 6:47 ` [patch V3 24/44] x86/fpu: Use bitfield accessors for desc_struct Thomas Gleixner 2017-08-29 11:13 ` [tip:x86/apic] " tip-bot for Thomas Gleixner 2017-08-28 6:47 ` [patch V3 25/44] x86: Replace access to desc_struct:a/b fields Thomas Gleixner 2017-08-29 11:13 ` [tip:x86/apic] x86/asm: " tip-bot for Thomas Gleixner 2017-08-28 6:47 ` [patch V3 26/44] x86/gdt: Use bitfields for initialization Thomas Gleixner 2017-08-29 11:14 ` tip-bot for Thomas Gleixner [this message] 2017-08-28 6:47 ` [patch V3 27/44] x86/ldttss: Cleanup 32bit descriptors Thomas Gleixner 2017-08-29 11:14 ` [tip:x86/apic] x86/ldttss: Clean up 32-bit descriptors tip-bot for Thomas Gleixner 2017-08-28 6:47 ` [patch V3 28/44] x86/idt: Create file for IDT related code Thomas Gleixner 2017-08-29 11:15 ` [tip:x86/apic] " tip-bot for Thomas Gleixner 2017-08-28 6:47 ` [patch V3 29/44] x86/idt: Move 32bit idt_descr to C code Thomas Gleixner 2017-08-29 11:15 ` [tip:x86/apic] x86/idt: Move 32-bit " tip-bot for Thomas Gleixner 2017-08-28 6:47 ` [patch V3 30/44] x86/idt: Remove unused set_trap_gate() Thomas Gleixner 2017-08-29 11:16 ` [tip:x86/apic] " tip-bot for Thomas Gleixner 2017-08-28 6:47 ` [patch V3 31/44] x86/idt: Consolidate IDT invalidation Thomas Gleixner 2017-08-29 11:16 ` [tip:x86/apic] " tip-bot for Thomas Gleixner 2017-08-28 6:47 ` [patch V3 32/44] x86/idt: Move early IDT handler setup to IDT code Thomas Gleixner 2017-08-29 11:16 ` [tip:x86/apic] " tip-bot for Thomas Gleixner 2017-08-28 6:47 ` [patch V3 33/44] x86/idt: Move early IDT setup out of 32bit asm Thomas Gleixner 2017-08-29 11:17 ` [tip:x86/apic] x86/idt: Move early IDT setup out of 32-bit asm tip-bot for Thomas Gleixner 2017-08-28 6:47 ` [patch V3 34/44] x86/idt: Prepare for table based init Thomas Gleixner 2017-08-29 11:17 ` [tip:x86/apic] " tip-bot for Thomas Gleixner 2017-08-28 6:47 ` [patch V3 35/44] x86/idt: Switch early trap init to IDT tables Thomas Gleixner 2017-08-29 11:18 ` [tip:x86/apic] " tip-bot for Thomas Gleixner 2017-08-28 6:47 ` [patch V3 36/44] x86/idt: Move debug stack init to table based Thomas Gleixner 2017-08-29 11:18 ` [tip:x86/apic] " tip-bot for Thomas Gleixner 2017-08-28 6:47 ` [patch V3 37/44] x86/idt: Move ist stack based traps to table init Thomas Gleixner 2017-08-29 11:18 ` [tip:x86/apic] x86/idt: Move IST " tip-bot for Thomas Gleixner 2017-09-01 6:28 ` Andrei Vagin 2017-09-01 8:26 ` [PATCH] x86/idt: Fix the X86_TRAP_BP gate Ingo Molnar 2017-09-01 8:59 ` Thomas Gleixner 2017-09-01 9:09 ` [tip:x86/apic] " tip-bot for Ingo Molnar 2017-09-01 14:39 ` [PATCH] " Andrei Vagin 2017-08-28 6:47 ` [patch V3 38/44] x86/idt: Move regular trap init to tables Thomas Gleixner 2017-08-29 11:19 ` [tip:x86/apic] " tip-bot for Thomas Gleixner 2017-08-28 6:47 ` [patch V3 39/44] x86/idt: Move APIC gate initialization " Thomas Gleixner 2017-08-29 11:19 ` [tip:x86/apic] " tip-bot for Thomas Gleixner 2017-08-28 6:47 ` [patch V3 40/44] x86/idt: Move interrupt gate initialization to IDT code Thomas Gleixner 2017-08-29 11:20 ` [tip:x86/apic] " tip-bot for Thomas Gleixner 2017-08-28 6:47 ` [patch V3 41/44] x86/idt: Remove unused functions/inlines Thomas Gleixner 2017-08-29 11:20 ` [tip:x86/apic] " tip-bot for Thomas Gleixner 2017-08-28 6:47 ` [patch V3 42/44] x86/idt: Deinline setup functions Thomas Gleixner 2017-08-29 11:20 ` [tip:x86/apic] " tip-bot for Thomas Gleixner 2017-08-28 6:47 ` [patch V3 43/44] x86/idt: Simplify alloc_intr_gate Thomas Gleixner 2017-08-28 14:35 ` KY Srinivasan 2017-08-29 11:21 ` [tip:x86/apic] x86/idt: Simplify alloc_intr_gate() tip-bot for Thomas Gleixner 2017-08-28 6:47 ` [patch V3 44/44] x86/idt: Hide set_intr_gate() Thomas Gleixner 2017-08-29 11:21 ` [tip:x86/apic] " tip-bot for Thomas Gleixner
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=tip-38e9e81f4c81c75799b002d5811de7241b307676@git.kernel.org \ --to=tipbot@zytor.com \ --cc=bp@alien8.de \ --cc=brgerst@gmail.com \ --cc=dvlasenk@redhat.com \ --cc=hpa@zytor.com \ --cc=jpoimboe@redhat.com \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-tip-commits@vger.kernel.org \ --cc=luto@kernel.org \ --cc=mingo@kernel.org \ --cc=peterz@infradead.org \ --cc=rostedt@goodmis.org \ --cc=tglx@linutronix.de \ --cc=torvalds@linux-foundation.org \ --subject='Re: [tip:x86/apic] x86/gdt: Use bitfields for initialization' \ /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
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.