Commit f5848e5f authored by Thomas Gleixner's avatar Thomas Gleixner

x86/tss: Move I/O bitmap data into a seperate struct

Move the non hardware portion of I/O bitmap data into a seperate struct for
readability sake.
Originally-by: default avatarIngo Molnar <mingo@kernel.org>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent ecc7e37d
...@@ -328,11 +328,11 @@ struct x86_hw_tss { ...@@ -328,11 +328,11 @@ struct x86_hw_tss {
* IO-bitmap sizes: * IO-bitmap sizes:
*/ */
#define IO_BITMAP_BITS 65536 #define IO_BITMAP_BITS 65536
#define IO_BITMAP_BYTES (IO_BITMAP_BITS/8) #define IO_BITMAP_BYTES (IO_BITMAP_BITS / BITS_PER_BYTE)
#define IO_BITMAP_LONGS (IO_BITMAP_BYTES/sizeof(long)) #define IO_BITMAP_LONGS (IO_BITMAP_BYTES / sizeof(long))
#define IO_BITMAP_OFFSET_VALID \ #define IO_BITMAP_OFFSET_VALID \
(offsetof(struct tss_struct, io_bitmap) - \ (offsetof(struct tss_struct, io_bitmap.bitmap) - \
offsetof(struct tss_struct, x86_tss)) offsetof(struct tss_struct, x86_tss))
/* /*
...@@ -356,14 +356,10 @@ struct entry_stack_page { ...@@ -356,14 +356,10 @@ struct entry_stack_page {
struct entry_stack stack; struct entry_stack stack;
} __aligned(PAGE_SIZE); } __aligned(PAGE_SIZE);
struct tss_struct { /*
/* * All IO bitmap related data stored in the TSS:
* The fixed hardware portion. This must not cross a page boundary */
* at risk of violating the SDM's advice and potentially triggering struct x86_io_bitmap {
* errata.
*/
struct x86_hw_tss x86_tss;
/* /*
* Store the dirty size of the last io bitmap offender. The next * Store the dirty size of the last io bitmap offender. The next
* one will have to do the cleanup as the switch out to a non io * one will have to do the cleanup as the switch out to a non io
...@@ -371,7 +367,7 @@ struct tss_struct { ...@@ -371,7 +367,7 @@ struct tss_struct {
* outside of the TSS limit. So for sane tasks there is no need to * outside of the TSS limit. So for sane tasks there is no need to
* actually touch the io_bitmap at all. * actually touch the io_bitmap at all.
*/ */
unsigned int io_bitmap_prev_max; unsigned int prev_max;
/* /*
* The extra 1 is there because the CPU will access an * The extra 1 is there because the CPU will access an
...@@ -379,7 +375,18 @@ struct tss_struct { ...@@ -379,7 +375,18 @@ struct tss_struct {
* bitmap. The extra byte must be all 1 bits, and must * bitmap. The extra byte must be all 1 bits, and must
* be within the limit. * be within the limit.
*/ */
unsigned long io_bitmap[IO_BITMAP_LONGS + 1]; unsigned long bitmap[IO_BITMAP_LONGS + 1];
};
struct tss_struct {
/*
* The fixed hardware portion. This must not cross a page boundary
* at risk of violating the SDM's advice and potentially triggering
* errata.
*/
struct x86_hw_tss x86_tss;
struct x86_io_bitmap io_bitmap;
} __aligned(PAGE_SIZE); } __aligned(PAGE_SIZE);
DECLARE_PER_CPU_PAGE_ALIGNED(struct tss_struct, cpu_tss_rw); DECLARE_PER_CPU_PAGE_ALIGNED(struct tss_struct, cpu_tss_rw);
......
...@@ -1861,8 +1861,8 @@ void cpu_init(void) ...@@ -1861,8 +1861,8 @@ void cpu_init(void)
/* Initialize the TSS. */ /* Initialize the TSS. */
tss_setup_ist(tss); tss_setup_ist(tss);
tss->x86_tss.io_bitmap_base = IO_BITMAP_OFFSET_INVALID; tss->x86_tss.io_bitmap_base = IO_BITMAP_OFFSET_INVALID;
tss->io_bitmap_prev_max = 0; tss->io_bitmap.prev_max = 0;
memset(tss->io_bitmap, 0xff, sizeof(tss->io_bitmap)); memset(tss->io_bitmap.bitmap, 0xff, sizeof(tss->io_bitmap.bitmap));
set_tss_desc(cpu, &get_cpu_entry_area(cpu)->tss.x86_tss); set_tss_desc(cpu, &get_cpu_entry_area(cpu)->tss.x86_tss);
load_TR_desc(); load_TR_desc();
......
...@@ -81,9 +81,9 @@ long ksys_ioperm(unsigned long from, unsigned long num, int turn_on) ...@@ -81,9 +81,9 @@ long ksys_ioperm(unsigned long from, unsigned long num, int turn_on)
/* Update the TSS */ /* Update the TSS */
tss = this_cpu_ptr(&cpu_tss_rw); tss = this_cpu_ptr(&cpu_tss_rw);
memcpy(tss->io_bitmap, t->io_bitmap_ptr, bytes_updated); memcpy(tss->io_bitmap.bitmap, t->io_bitmap_ptr, bytes_updated);
/* Store the new end of the zero bits */ /* Store the new end of the zero bits */
tss->io_bitmap_prev_max = bytes; tss->io_bitmap.prev_max = bytes;
/* Make the bitmap base in the TSS valid */ /* Make the bitmap base in the TSS valid */
tss->x86_tss.io_bitmap_base = IO_BITMAP_OFFSET_VALID; tss->x86_tss.io_bitmap_base = IO_BITMAP_OFFSET_VALID;
/* Make sure the TSS limit covers the I/O bitmap. */ /* Make sure the TSS limit covers the I/O bitmap. */
......
...@@ -374,11 +374,11 @@ static inline void switch_to_bitmap(struct thread_struct *next, ...@@ -374,11 +374,11 @@ static inline void switch_to_bitmap(struct thread_struct *next,
* bits permitted, then the copy needs to cover those as * bits permitted, then the copy needs to cover those as
* well so they get turned off. * well so they get turned off.
*/ */
memcpy(tss->io_bitmap, next->io_bitmap_ptr, memcpy(tss->io_bitmap.bitmap, next->io_bitmap_ptr,
max(tss->io_bitmap_prev_max, next->io_bitmap_max)); max(tss->io_bitmap.prev_max, next->io_bitmap_max));
/* Store the new max and set io_bitmap_base valid */ /* Store the new max and set io_bitmap_base valid */
tss->io_bitmap_prev_max = next->io_bitmap_max; tss->io_bitmap.prev_max = next->io_bitmap_max;
tss->x86_tss.io_bitmap_base = IO_BITMAP_OFFSET_VALID; tss->x86_tss.io_bitmap_base = IO_BITMAP_OFFSET_VALID;
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment