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: Ingo Molnar <mingo@kernel.org> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
parent
ecc7e37d4d
commit
f5848e5fd2
@ -328,11 +328,11 @@ struct x86_hw_tss {
|
||||
* IO-bitmap sizes:
|
||||
*/
|
||||
#define IO_BITMAP_BITS 65536
|
||||
#define IO_BITMAP_BYTES (IO_BITMAP_BITS/8)
|
||||
#define IO_BITMAP_LONGS (IO_BITMAP_BYTES/sizeof(long))
|
||||
#define IO_BITMAP_BYTES (IO_BITMAP_BITS / BITS_PER_BYTE)
|
||||
#define IO_BITMAP_LONGS (IO_BITMAP_BYTES / sizeof(long))
|
||||
|
||||
#define IO_BITMAP_OFFSET_VALID \
|
||||
(offsetof(struct tss_struct, io_bitmap) - \
|
||||
#define IO_BITMAP_OFFSET_VALID \
|
||||
(offsetof(struct tss_struct, io_bitmap.bitmap) - \
|
||||
offsetof(struct tss_struct, x86_tss))
|
||||
|
||||
/*
|
||||
@ -356,6 +356,28 @@ struct entry_stack_page {
|
||||
struct entry_stack stack;
|
||||
} __aligned(PAGE_SIZE);
|
||||
|
||||
/*
|
||||
* All IO bitmap related data stored in the TSS:
|
||||
*/
|
||||
struct x86_io_bitmap {
|
||||
/*
|
||||
* 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
|
||||
* bitmap user will just set x86_tss.io_bitmap_base to a value
|
||||
* outside of the TSS limit. So for sane tasks there is no need to
|
||||
* actually touch the io_bitmap at all.
|
||||
*/
|
||||
unsigned int prev_max;
|
||||
|
||||
/*
|
||||
* The extra 1 is there because the CPU will access an
|
||||
* additional byte beyond the end of the IO permission
|
||||
* bitmap. The extra byte must be all 1 bits, and must
|
||||
* be within the limit.
|
||||
*/
|
||||
unsigned long bitmap[IO_BITMAP_LONGS + 1];
|
||||
};
|
||||
|
||||
struct tss_struct {
|
||||
/*
|
||||
* The fixed hardware portion. This must not cross a page boundary
|
||||
@ -364,22 +386,7 @@ struct tss_struct {
|
||||
*/
|
||||
struct x86_hw_tss x86_tss;
|
||||
|
||||
/*
|
||||
* 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
|
||||
* bitmap user will just set x86_tss.io_bitmap_base to a value
|
||||
* outside of the TSS limit. So for sane tasks there is no need to
|
||||
* actually touch the io_bitmap at all.
|
||||
*/
|
||||
unsigned int io_bitmap_prev_max;
|
||||
|
||||
/*
|
||||
* The extra 1 is there because the CPU will access an
|
||||
* additional byte beyond the end of the IO permission
|
||||
* bitmap. The extra byte must be all 1 bits, and must
|
||||
* be within the limit.
|
||||
*/
|
||||
unsigned long io_bitmap[IO_BITMAP_LONGS + 1];
|
||||
struct x86_io_bitmap io_bitmap;
|
||||
} __aligned(PAGE_SIZE);
|
||||
|
||||
DECLARE_PER_CPU_PAGE_ALIGNED(struct tss_struct, cpu_tss_rw);
|
||||
|
@ -1861,8 +1861,8 @@ void cpu_init(void)
|
||||
/* Initialize the TSS. */
|
||||
tss_setup_ist(tss);
|
||||
tss->x86_tss.io_bitmap_base = IO_BITMAP_OFFSET_INVALID;
|
||||
tss->io_bitmap_prev_max = 0;
|
||||
memset(tss->io_bitmap, 0xff, sizeof(tss->io_bitmap));
|
||||
tss->io_bitmap.prev_max = 0;
|
||||
memset(tss->io_bitmap.bitmap, 0xff, sizeof(tss->io_bitmap.bitmap));
|
||||
set_tss_desc(cpu, &get_cpu_entry_area(cpu)->tss.x86_tss);
|
||||
|
||||
load_TR_desc();
|
||||
|
@ -81,9 +81,9 @@ long ksys_ioperm(unsigned long from, unsigned long num, int turn_on)
|
||||
|
||||
/* Update the TSS */
|
||||
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 */
|
||||
tss->io_bitmap_prev_max = bytes;
|
||||
tss->io_bitmap.prev_max = bytes;
|
||||
/* Make the bitmap base in the TSS valid */
|
||||
tss->x86_tss.io_bitmap_base = IO_BITMAP_OFFSET_VALID;
|
||||
/* Make sure the TSS limit covers the I/O bitmap. */
|
||||
|
@ -374,11 +374,11 @@ static inline void switch_to_bitmap(struct thread_struct *next,
|
||||
* bits permitted, then the copy needs to cover those as
|
||||
* well so they get turned off.
|
||||
*/
|
||||
memcpy(tss->io_bitmap, next->io_bitmap_ptr,
|
||||
max(tss->io_bitmap_prev_max, next->io_bitmap_max));
|
||||
memcpy(tss->io_bitmap.bitmap, next->io_bitmap_ptr,
|
||||
max(tss->io_bitmap.prev_max, next->io_bitmap_max));
|
||||
|
||||
/* 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;
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user