Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 3629
b: refs/heads/master
c: ffaa8bd
h: refs/heads/master
i:
  3627: 85411f3
v: v3
  • Loading branch information
Andrea Arcangeli authored and Linus Torvalds committed Jun 27, 2005
1 parent be89303 commit e946a05
Show file tree
Hide file tree
Showing 6 changed files with 83 additions and 11 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 6ae3db110e62b0846aae1b5c6e661484ee3a5ed1
refs/heads/master: ffaa8bd6c904d1ab79b677905067349a5ff51d84
29 changes: 29 additions & 0 deletions trunk/arch/i386/kernel/process.c
Original file line number Diff line number Diff line change
Expand Up @@ -616,6 +616,33 @@ handle_io_bitmap(struct thread_struct *next, struct tss_struct *tss)
tss->io_bitmap_base = INVALID_IO_BITMAP_OFFSET_LAZY;
}

/*
* This function selects if the context switch from prev to next
* has to tweak the TSC disable bit in the cr4.
*/
static inline void disable_tsc(struct task_struct *prev_p,
struct task_struct *next_p)
{
struct thread_info *prev, *next;

/*
* gcc should eliminate the ->thread_info dereference if
* has_secure_computing returns 0 at compile time (SECCOMP=n).
*/
prev = prev_p->thread_info;
next = next_p->thread_info;

if (has_secure_computing(prev) || has_secure_computing(next)) {
/* slow path here */
if (has_secure_computing(prev) &&
!has_secure_computing(next)) {
write_cr4(read_cr4() & ~X86_CR4_TSD);
} else if (!has_secure_computing(prev) &&
has_secure_computing(next))
write_cr4(read_cr4() | X86_CR4_TSD);
}
}

/*
* switch_to(x,yn) should switch tasks from x to y.
*
Expand Down Expand Up @@ -695,6 +722,8 @@ struct task_struct fastcall * __switch_to(struct task_struct *prev_p, struct tas
if (unlikely(prev->io_bitmap_ptr || next->io_bitmap_ptr))
handle_io_bitmap(next, tss);

disable_tsc(prev_p, next_p);

return prev_p;
}

Expand Down
29 changes: 29 additions & 0 deletions trunk/arch/x86_64/kernel/process.c
Original file line number Diff line number Diff line change
Expand Up @@ -481,6 +481,33 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long rsp,
return err;
}

/*
* This function selects if the context switch from prev to next
* has to tweak the TSC disable bit in the cr4.
*/
static inline void disable_tsc(struct task_struct *prev_p,
struct task_struct *next_p)
{
struct thread_info *prev, *next;

/*
* gcc should eliminate the ->thread_info dereference if
* has_secure_computing returns 0 at compile time (SECCOMP=n).
*/
prev = prev_p->thread_info;
next = next_p->thread_info;

if (has_secure_computing(prev) || has_secure_computing(next)) {
/* slow path here */
if (has_secure_computing(prev) &&
!has_secure_computing(next)) {
write_cr4(read_cr4() & ~X86_CR4_TSD);
} else if (!has_secure_computing(prev) &&
has_secure_computing(next))
write_cr4(read_cr4() | X86_CR4_TSD);
}
}

/*
* This special macro can be used to load a debugging register
*/
Expand Down Expand Up @@ -599,6 +626,8 @@ struct task_struct *__switch_to(struct task_struct *prev_p, struct task_struct *
}
}

disable_tsc(prev_p, next_p);

return prev_p;
}

Expand Down
12 changes: 7 additions & 5 deletions trunk/include/asm-i386/tlbflush.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,18 @@
*/
#define __flush_tlb_global() \
do { \
unsigned int tmpreg; \
unsigned int tmpreg, cr4, cr4_orig; \
\
__asm__ __volatile__( \
"movl %1, %%cr4; # turn off PGE \n" \
"movl %%cr4, %2; # turn off PGE \n" \
"movl %2, %1; \n" \
"andl %3, %1; \n" \
"movl %1, %%cr4; \n" \
"movl %%cr3, %0; \n" \
"movl %0, %%cr3; # flush TLB \n" \
"movl %2, %%cr4; # turn PGE back on \n" \
: "=&r" (tmpreg) \
: "r" (mmu_cr4_features & ~X86_CR4_PGE), \
"r" (mmu_cr4_features) \
: "=&r" (tmpreg), "=&r" (cr4), "=&r" (cr4_orig) \
: "i" (~X86_CR4_PGE) \
: "memory"); \
} while (0)

Expand Down
12 changes: 7 additions & 5 deletions trunk/include/asm-x86_64/tlbflush.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,18 @@
*/
#define __flush_tlb_global() \
do { \
unsigned long tmpreg; \
unsigned long tmpreg, cr4, cr4_orig; \
\
__asm__ __volatile__( \
"movq %1, %%cr4; # turn off PGE \n" \
"movq %%cr4, %2; # turn off PGE \n" \
"movq %2, %1; \n" \
"andq %3, %1; \n" \
"movq %1, %%cr4; \n" \
"movq %%cr3, %0; # flush TLB \n" \
"movq %0, %%cr3; \n" \
"movq %2, %%cr4; # turn PGE back on \n" \
: "=&r" (tmpreg) \
: "r" (mmu_cr4_features & ~X86_CR4_PGE), \
"r" (mmu_cr4_features) \
: "=&r" (tmpreg), "=&r" (cr4), "=&r" (cr4_orig) \
: "i" (~X86_CR4_PGE) \
: "memory"); \
} while (0)

Expand Down
10 changes: 10 additions & 0 deletions trunk/include/linux/seccomp.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,11 @@ static inline void secure_computing(int this_syscall)
__secure_computing(this_syscall);
}

static inline int has_secure_computing(struct thread_info *ti)
{
return unlikely(test_ti_thread_flag(ti, TIF_SECCOMP));
}

#else /* CONFIG_SECCOMP */

#if (__GNUC__ > 2)
Expand All @@ -28,6 +33,11 @@ static inline void secure_computing(int this_syscall)
#endif

#define secure_computing(x) do { } while (0)
/* static inline to preserve typechecking */
static inline int has_secure_computing(struct thread_info *ti)
{
return 0;
}

#endif /* CONFIG_SECCOMP */

Expand Down

0 comments on commit e946a05

Please sign in to comment.