Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 80031
b: refs/heads/master
c: 1b46cbe
h: refs/heads/master
i:
  80029: ad8df38
  80027: a4bcc5c
  80023: ff2f306
  80015: 95aa07a
  79999: 44364b8
v: v3
  • Loading branch information
Glauber de Oliveira Costa authored and Ingo Molnar committed Jan 30, 2008
1 parent 3035186 commit 60dd767
Show file tree
Hide file tree
Showing 4 changed files with 90 additions and 125 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: c72dcf83ff8585c95739abffa3be7c87ca63d66b
refs/heads/master: 1b46cbe0ccaad25786526601bc54426f2e2abb20
90 changes: 89 additions & 1 deletion trunk/include/asm-x86/processor.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,97 @@ static inline void load_cr3(pgd_t *pgdir)
# include "processor_64.h"
#endif

static inline unsigned long native_get_debugreg(int regno)
{
unsigned long val = 0; /* Damn you, gcc! */

switch (regno) {
case 0:
asm("mov %%db0, %0" :"=r" (val)); break;
case 1:
asm("mov %%db1, %0" :"=r" (val)); break;
case 2:
asm("mov %%db2, %0" :"=r" (val)); break;
case 3:
asm("mov %%db3, %0" :"=r" (val)); break;
case 6:
asm("mov %%db6, %0" :"=r" (val)); break;
case 7:
asm("mov %%db7, %0" :"=r" (val)); break;
default:
BUG();
}
return val;
}

static inline void native_set_debugreg(int regno, unsigned long value)
{
switch (regno) {
case 0:
asm("mov %0,%%db0" : /* no output */ :"r" (value));
break;
case 1:
asm("mov %0,%%db1" : /* no output */ :"r" (value));
break;
case 2:
asm("mov %0,%%db2" : /* no output */ :"r" (value));
break;
case 3:
asm("mov %0,%%db3" : /* no output */ :"r" (value));
break;
case 6:
asm("mov %0,%%db6" : /* no output */ :"r" (value));
break;
case 7:
asm("mov %0,%%db7" : /* no output */ :"r" (value));
break;
default:
BUG();
}
}


#ifndef CONFIG_PARAVIRT
#define __cpuid native_cpuid
#endif
#define paravirt_enabled() 0

/*
* These special macros can be used to get or set a debugging register
*/
#define get_debugreg(var, register) \
(var) = native_get_debugreg(register)
#define set_debugreg(value, register) \
native_set_debugreg(register, value)

#endif /* CONFIG_PARAVIRT */

/*
* Save the cr4 feature set we're using (ie
* Pentium 4MB enable and PPro Global page
* enable), so that any CPU's that boot up
* after us can get the correct flags.
*/
extern unsigned long mmu_cr4_features;

static inline void set_in_cr4(unsigned long mask)
{
unsigned cr4;
mmu_cr4_features |= mask;
cr4 = read_cr4();
cr4 |= mask;
write_cr4(cr4);
}

static inline void clear_in_cr4(unsigned long mask)
{
unsigned cr4;
mmu_cr4_features &= ~mask;
cr4 = read_cr4();
cr4 &= ~mask;
write_cr4(cr4);
}



/*
* Generic CPUID function
Expand Down
87 changes: 0 additions & 87 deletions trunk/include/asm-x86/processor_32.h
Original file line number Diff line number Diff line change
Expand Up @@ -120,33 +120,6 @@ extern void detect_ht(struct cpuinfo_x86 *c);
static inline void detect_ht(struct cpuinfo_x86 *c) {}
#endif


/*
* Save the cr4 feature set we're using (ie
* Pentium 4MB enable and PPro Global page
* enable), so that any CPU's that boot up
* after us can get the correct flags.
*/
extern unsigned long mmu_cr4_features;

static inline void set_in_cr4 (unsigned long mask)
{
unsigned cr4;
mmu_cr4_features |= mask;
cr4 = read_cr4();
cr4 |= mask;
write_cr4(cr4);
}

static inline void clear_in_cr4 (unsigned long mask)
{
unsigned cr4;
mmu_cr4_features &= ~mask;
cr4 = read_cr4();
cr4 &= ~mask;
write_cr4(cr4);
}

/* Stop speculative execution */
static inline void sync_core(void)
{
Expand Down Expand Up @@ -482,57 +455,6 @@ static inline void native_load_sp0(struct tss_struct *tss, struct thread_struct
wrmsr(MSR_IA32_SYSENTER_CS, thread->sysenter_cs, 0);
}
}


static inline unsigned long native_get_debugreg(int regno)
{
unsigned long val = 0; /* Damn you, gcc! */

switch (regno) {
case 0:
asm("movl %%db0, %0" :"=r" (val)); break;
case 1:
asm("movl %%db1, %0" :"=r" (val)); break;
case 2:
asm("movl %%db2, %0" :"=r" (val)); break;
case 3:
asm("movl %%db3, %0" :"=r" (val)); break;
case 6:
asm("movl %%db6, %0" :"=r" (val)); break;
case 7:
asm("movl %%db7, %0" :"=r" (val)); break;
default:
BUG();
}
return val;
}

static inline void native_set_debugreg(int regno, unsigned long value)
{
switch (regno) {
case 0:
asm("movl %0,%%db0" : /* no output */ :"r" (value));
break;
case 1:
asm("movl %0,%%db1" : /* no output */ :"r" (value));
break;
case 2:
asm("movl %0,%%db2" : /* no output */ :"r" (value));
break;
case 3:
asm("movl %0,%%db3" : /* no output */ :"r" (value));
break;
case 6:
asm("movl %0,%%db6" : /* no output */ :"r" (value));
break;
case 7:
asm("movl %0,%%db7" : /* no output */ :"r" (value));
break;
default:
BUG();
}
}

/*
* Set IOPL bits in EFLAGS from given mask
*/
Expand All @@ -552,21 +474,12 @@ static inline void native_set_iopl_mask(unsigned mask)
#ifdef CONFIG_PARAVIRT
#include <asm/paravirt.h>
#else
#define paravirt_enabled() 0

static inline void load_sp0(struct tss_struct *tss, struct thread_struct *thread)
{
native_load_sp0(tss, thread);
}

/*
* These special macros can be used to get or set a debugging register
*/
#define get_debugreg(var, register) \
(var) = native_get_debugreg(register)
#define set_debugreg(value, register) \
native_set_debugreg(register, value)

#define set_iopl_mask native_set_iopl_mask
#endif /* CONFIG_PARAVIRT */

Expand Down
36 changes: 0 additions & 36 deletions trunk/include/asm-x86/processor_64.h
Original file line number Diff line number Diff line change
Expand Up @@ -88,34 +88,6 @@ extern void init_scattered_cpuid_features(struct cpuinfo_x86 *c);
extern unsigned int init_intel_cacheinfo(struct cpuinfo_x86 *c);
extern unsigned short num_cache_leaves;

/*
* Save the cr4 feature set we're using (ie
* Pentium 4MB enable and PPro Global page
* enable), so that any CPU's that boot up
* after us can get the correct flags.
*/
extern unsigned long mmu_cr4_features;

static inline void set_in_cr4 (unsigned long mask)
{
mmu_cr4_features |= mask;
__asm__("movq %%cr4,%%rax\n\t"
"orq %0,%%rax\n\t"
"movq %%rax,%%cr4\n"
: : "irg" (mask)
:"ax");
}

static inline void clear_in_cr4 (unsigned long mask)
{
mmu_cr4_features &= ~mask;
__asm__("movq %%cr4,%%rax\n\t"
"andq %0,%%rax\n\t"
"movq %%rax,%%cr4\n"
: : "irg" (~mask)
:"ax");
}


/*
* User space process size. 47bits minus one guard page.
Expand Down Expand Up @@ -254,14 +226,6 @@ struct thread_struct {
set_fs(USER_DS); \
} while(0)

#define get_debugreg(var, register) \
__asm__("movq %%db" #register ", %0" \
:"=r" (var))
#define set_debugreg(value, register) \
__asm__("movq %0,%%db" #register \
: /* no output */ \
:"r" (value))

struct task_struct;
struct mm_struct;

Expand Down

0 comments on commit 60dd767

Please sign in to comment.