Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/x86/linux-2.6-x86
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/x86/linux-2.6-x86: (613 commits) x86: standalone trampoline code x86: move suspend wakeup code to C x86: coding style fixes to arch/x86/kernel/acpi/sleep.c x86: setup_trampoline() - fix section mismatch warning x86: section mismatch fixes, #1 x86: fix paranoia about using BIOS quickboot mechanism. x86: print out buggy mptable x86: use cpu_online() x86: use cpumask_of_cpu() x86: remove unnecessary tmp local variable x86: remove unnecessary memset() x86: use ioapic_read_entry() and ioapic_write_entry() x86: avoid redundant loop in io_apic_level_ack_pending() x86: remove superfluous initialisation in boot code. x86: merge mpparse_{32,64}.c x86: unify mp_register_gsi x86: unify mp_config_acpi_legacy_irqs x86: unify mp_register_ioapic x86: unify uniq_io_apic_id x86: unify smp_scan_config ...
This commit is contained in:
@@ -10,6 +10,7 @@ header-y += prctl.h
|
||||
header-y += ptrace-abi.h
|
||||
header-y += sigcontext32.h
|
||||
header-y += ucontext.h
|
||||
header-y += processor-flags.h
|
||||
|
||||
unifdef-y += e820.h
|
||||
unifdef-y += ist.h
|
||||
|
||||
@@ -29,8 +29,9 @@ static inline void aout_dump_thread(struct pt_regs *regs, struct user *dump)
|
||||
dump->magic = CMAGIC;
|
||||
dump->start_code = 0;
|
||||
dump->start_stack = regs->sp & ~(PAGE_SIZE - 1);
|
||||
dump->u_tsize = ((unsigned long) current->mm->end_code) >> PAGE_SHIFT;
|
||||
dump->u_dsize = ((unsigned long) (current->mm->brk + (PAGE_SIZE-1))) >> PAGE_SHIFT;
|
||||
dump->u_tsize = ((unsigned long)current->mm->end_code) >> PAGE_SHIFT;
|
||||
dump->u_dsize = ((unsigned long)(current->mm->brk + (PAGE_SIZE - 1)))
|
||||
>> PAGE_SHIFT;
|
||||
dump->u_dsize -= dump->u_tsize;
|
||||
dump->u_ssize = 0;
|
||||
dump->u_debugreg[0] = current->thread.debugreg0;
|
||||
@@ -43,7 +44,8 @@ static inline void aout_dump_thread(struct pt_regs *regs, struct user *dump)
|
||||
dump->u_debugreg[7] = current->thread.debugreg7;
|
||||
|
||||
if (dump->start_stack < TASK_SIZE)
|
||||
dump->u_ssize = ((unsigned long) (TASK_SIZE - dump->start_stack)) >> PAGE_SHIFT;
|
||||
dump->u_ssize = ((unsigned long)(TASK_SIZE - dump->start_stack))
|
||||
>> PAGE_SHIFT;
|
||||
|
||||
dump->regs.bx = regs->bx;
|
||||
dump->regs.cx = regs->cx;
|
||||
@@ -55,7 +57,7 @@ static inline void aout_dump_thread(struct pt_regs *regs, struct user *dump)
|
||||
dump->regs.ds = (u16)regs->ds;
|
||||
dump->regs.es = (u16)regs->es;
|
||||
dump->regs.fs = (u16)regs->fs;
|
||||
savesegment(gs,gs);
|
||||
savesegment(gs, gs);
|
||||
dump->regs.orig_ax = regs->orig_ax;
|
||||
dump->regs.ip = regs->ip;
|
||||
dump->regs.cs = (u16)regs->cs;
|
||||
@@ -63,7 +65,7 @@ static inline void aout_dump_thread(struct pt_regs *regs, struct user *dump)
|
||||
dump->regs.sp = regs->sp;
|
||||
dump->regs.ss = (u16)regs->ss;
|
||||
|
||||
dump->u_fpvalid = dump_fpu (regs, &dump->i387);
|
||||
dump->u_fpvalid = dump_fpu(regs, &dump->i387);
|
||||
}
|
||||
|
||||
#endif /* CONFIG_X86_32 */
|
||||
|
||||
@@ -67,16 +67,16 @@ int __acpi_release_global_lock(unsigned int *lock);
|
||||
*/
|
||||
#define ACPI_DIV_64_BY_32(n_hi, n_lo, d32, q32, r32) \
|
||||
asm("divl %2;" \
|
||||
:"=a"(q32), "=d"(r32) \
|
||||
:"r"(d32), \
|
||||
: "=a"(q32), "=d"(r32) \
|
||||
: "r"(d32), \
|
||||
"0"(n_lo), "1"(n_hi))
|
||||
|
||||
|
||||
#define ACPI_SHIFT_RIGHT_64(n_hi, n_lo) \
|
||||
asm("shrl $1,%2 ;" \
|
||||
"rcrl $1,%3;" \
|
||||
:"=r"(n_hi), "=r"(n_lo) \
|
||||
:"0"(n_hi), "1"(n_lo))
|
||||
: "=r"(n_hi), "=r"(n_lo) \
|
||||
: "0"(n_hi), "1"(n_lo))
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
extern int acpi_lapic;
|
||||
|
||||
@@ -66,8 +66,8 @@ extern void alternatives_smp_module_del(struct module *mod);
|
||||
extern void alternatives_smp_switch(int smp);
|
||||
#else
|
||||
static inline void alternatives_smp_module_add(struct module *mod, char *name,
|
||||
void *locks, void *locks_end,
|
||||
void *text, void *text_end) {}
|
||||
void *locks, void *locks_end,
|
||||
void *text, void *text_end) {}
|
||||
static inline void alternatives_smp_module_del(struct module *mod) {}
|
||||
static inline void alternatives_smp_switch(int smp) {}
|
||||
#endif /* CONFIG_SMP */
|
||||
@@ -148,14 +148,34 @@ struct paravirt_patch_site;
|
||||
void apply_paravirt(struct paravirt_patch_site *start,
|
||||
struct paravirt_patch_site *end);
|
||||
#else
|
||||
static inline void
|
||||
apply_paravirt(struct paravirt_patch_site *start,
|
||||
struct paravirt_patch_site *end)
|
||||
static inline void apply_paravirt(struct paravirt_patch_site *start,
|
||||
struct paravirt_patch_site *end)
|
||||
{}
|
||||
#define __parainstructions NULL
|
||||
#define __parainstructions_end NULL
|
||||
#endif
|
||||
|
||||
extern void text_poke(void *addr, unsigned char *opcode, int len);
|
||||
extern void add_nops(void *insns, unsigned int len);
|
||||
|
||||
/*
|
||||
* Clear and restore the kernel write-protection flag on the local CPU.
|
||||
* Allows the kernel to edit read-only pages.
|
||||
* Side-effect: any interrupt handler running between save and restore will have
|
||||
* the ability to write to read-only pages.
|
||||
*
|
||||
* Warning:
|
||||
* Code patching in the UP case is safe if NMIs and MCE handlers are stopped and
|
||||
* no thread can be preempted in the instructions being modified (no iret to an
|
||||
* invalid instruction possible) or if the instructions are changed from a
|
||||
* consistent state to another consistent state atomically.
|
||||
* More care must be taken when modifying code in the SMP case because of
|
||||
* Intel's errata.
|
||||
* On the local CPU you need to be protected again NMI or MCE handlers seeing an
|
||||
* inconsistent instruction while you patch.
|
||||
* The _early version expects the memory to already be RW.
|
||||
*/
|
||||
|
||||
extern void *text_poke(void *addr, const void *opcode, size_t len);
|
||||
extern void *text_poke_early(void *addr, const void *opcode, size_t len);
|
||||
|
||||
#endif /* _ASM_X86_ALTERNATIVE_H */
|
||||
|
||||
@@ -44,7 +44,6 @@ extern int apic_runs_main_timer;
|
||||
extern int ioapic_force;
|
||||
extern int disable_apic;
|
||||
extern int disable_apic_timer;
|
||||
extern unsigned boot_cpu_id;
|
||||
|
||||
/*
|
||||
* Basic functions accessing APICs.
|
||||
@@ -59,6 +58,8 @@ extern unsigned boot_cpu_id;
|
||||
#define setup_secondary_clock setup_secondary_APIC_clock
|
||||
#endif
|
||||
|
||||
extern int is_vsmp_box(void);
|
||||
|
||||
static inline void native_apic_write(unsigned long reg, u32 v)
|
||||
{
|
||||
*((volatile u32 *)(APIC_BASE + reg)) = v;
|
||||
@@ -66,7 +67,7 @@ static inline void native_apic_write(unsigned long reg, u32 v)
|
||||
|
||||
static inline void native_apic_write_atomic(unsigned long reg, u32 v)
|
||||
{
|
||||
(void) xchg((u32*)(APIC_BASE + reg), v);
|
||||
(void)xchg((u32 *)(APIC_BASE + reg), v);
|
||||
}
|
||||
|
||||
static inline u32 native_apic_read(unsigned long reg)
|
||||
@@ -123,7 +124,7 @@ extern void enable_NMI_through_LVT0(void);
|
||||
* On 32bit this is mach-xxx local
|
||||
*/
|
||||
#ifdef CONFIG_X86_64
|
||||
extern void setup_apic_routing(void);
|
||||
extern void early_init_lapic_mapping(void);
|
||||
#endif
|
||||
|
||||
extern u8 setup_APIC_eilvt_mce(u8 vector, u8 msg_type, u8 mask);
|
||||
|
||||
+35
-34
@@ -12,17 +12,15 @@
|
||||
|
||||
#define APIC_ID 0x20
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
# define APIC_ID_MASK (0xFFu<<24)
|
||||
# define GET_APIC_ID(x) (((x)>>24)&0xFFu)
|
||||
# define SET_APIC_ID(x) (((x)<<24))
|
||||
#endif
|
||||
|
||||
#define APIC_LVR 0x30
|
||||
#define APIC_LVR_MASK 0xFF00FF
|
||||
#define GET_APIC_VERSION(x) ((x)&0xFFu)
|
||||
#define GET_APIC_MAXLVT(x) (((x)>>16)&0xFFu)
|
||||
#define APIC_INTEGRATED(x) ((x)&0xF0u)
|
||||
#define GET_APIC_VERSION(x) ((x) & 0xFFu)
|
||||
#define GET_APIC_MAXLVT(x) (((x) >> 16) & 0xFFu)
|
||||
#ifdef CONFIG_X86_32
|
||||
# define APIC_INTEGRATED(x) ((x) & 0xF0u)
|
||||
#else
|
||||
# define APIC_INTEGRATED(x) (1)
|
||||
#endif
|
||||
#define APIC_XAPIC(x) ((x) >= 0x14)
|
||||
#define APIC_TASKPRI 0x80
|
||||
#define APIC_TPRI_MASK 0xFFu
|
||||
@@ -33,16 +31,16 @@
|
||||
#define APIC_EIO_ACK 0x0
|
||||
#define APIC_RRR 0xC0
|
||||
#define APIC_LDR 0xD0
|
||||
#define APIC_LDR_MASK (0xFFu<<24)
|
||||
#define GET_APIC_LOGICAL_ID(x) (((x)>>24)&0xFFu)
|
||||
#define SET_APIC_LOGICAL_ID(x) (((x)<<24))
|
||||
#define APIC_LDR_MASK (0xFFu << 24)
|
||||
#define GET_APIC_LOGICAL_ID(x) (((x) >> 24) & 0xFFu)
|
||||
#define SET_APIC_LOGICAL_ID(x) (((x) << 24))
|
||||
#define APIC_ALL_CPUS 0xFFu
|
||||
#define APIC_DFR 0xE0
|
||||
#define APIC_DFR_CLUSTER 0x0FFFFFFFul
|
||||
#define APIC_DFR_FLAT 0xFFFFFFFFul
|
||||
#define APIC_SPIV 0xF0
|
||||
#define APIC_SPIV_FOCUS_DISABLED (1<<9)
|
||||
#define APIC_SPIV_APIC_ENABLED (1<<8)
|
||||
#define APIC_SPIV_FOCUS_DISABLED (1 << 9)
|
||||
#define APIC_SPIV_APIC_ENABLED (1 << 8)
|
||||
#define APIC_ISR 0x100
|
||||
#define APIC_ISR_NR 0x8 /* Number of 32 bit ISR registers. */
|
||||
#define APIC_TMR 0x180
|
||||
@@ -78,27 +76,27 @@
|
||||
#define APIC_DM_EXTINT 0x00700
|
||||
#define APIC_VECTOR_MASK 0x000FF
|
||||
#define APIC_ICR2 0x310
|
||||
#define GET_APIC_DEST_FIELD(x) (((x)>>24)&0xFF)
|
||||
#define SET_APIC_DEST_FIELD(x) ((x)<<24)
|
||||
#define GET_APIC_DEST_FIELD(x) (((x) >> 24) & 0xFF)
|
||||
#define SET_APIC_DEST_FIELD(x) ((x) << 24)
|
||||
#define APIC_LVTT 0x320
|
||||
#define APIC_LVTTHMR 0x330
|
||||
#define APIC_LVTPC 0x340
|
||||
#define APIC_LVT0 0x350
|
||||
#define APIC_LVT_TIMER_BASE_MASK (0x3<<18)
|
||||
#define GET_APIC_TIMER_BASE(x) (((x)>>18)&0x3)
|
||||
#define SET_APIC_TIMER_BASE(x) (((x)<<18))
|
||||
#define APIC_LVT_TIMER_BASE_MASK (0x3 << 18)
|
||||
#define GET_APIC_TIMER_BASE(x) (((x) >> 18) & 0x3)
|
||||
#define SET_APIC_TIMER_BASE(x) (((x) << 18))
|
||||
#define APIC_TIMER_BASE_CLKIN 0x0
|
||||
#define APIC_TIMER_BASE_TMBASE 0x1
|
||||
#define APIC_TIMER_BASE_DIV 0x2
|
||||
#define APIC_LVT_TIMER_PERIODIC (1<<17)
|
||||
#define APIC_LVT_MASKED (1<<16)
|
||||
#define APIC_LVT_LEVEL_TRIGGER (1<<15)
|
||||
#define APIC_LVT_REMOTE_IRR (1<<14)
|
||||
#define APIC_INPUT_POLARITY (1<<13)
|
||||
#define APIC_SEND_PENDING (1<<12)
|
||||
#define APIC_LVT_TIMER_PERIODIC (1 << 17)
|
||||
#define APIC_LVT_MASKED (1 << 16)
|
||||
#define APIC_LVT_LEVEL_TRIGGER (1 << 15)
|
||||
#define APIC_LVT_REMOTE_IRR (1 << 14)
|
||||
#define APIC_INPUT_POLARITY (1 << 13)
|
||||
#define APIC_SEND_PENDING (1 << 12)
|
||||
#define APIC_MODE_MASK 0x700
|
||||
#define GET_APIC_DELIVERY_MODE(x) (((x)>>8)&0x7)
|
||||
#define SET_APIC_DELIVERY_MODE(x, y) (((x)&~0x700)|((y)<<8))
|
||||
#define GET_APIC_DELIVERY_MODE(x) (((x) >> 8) & 0x7)
|
||||
#define SET_APIC_DELIVERY_MODE(x, y) (((x) & ~0x700) | ((y) << 8))
|
||||
#define APIC_MODE_FIXED 0x0
|
||||
#define APIC_MODE_NMI 0x4
|
||||
#define APIC_MODE_EXTINT 0x7
|
||||
@@ -107,7 +105,7 @@
|
||||
#define APIC_TMICT 0x380
|
||||
#define APIC_TMCCT 0x390
|
||||
#define APIC_TDCR 0x3E0
|
||||
#define APIC_TDR_DIV_TMBASE (1<<2)
|
||||
#define APIC_TDR_DIV_TMBASE (1 << 2)
|
||||
#define APIC_TDR_DIV_1 0xB
|
||||
#define APIC_TDR_DIV_2 0x0
|
||||
#define APIC_TDR_DIV_4 0x1
|
||||
@@ -117,14 +115,14 @@
|
||||
#define APIC_TDR_DIV_64 0x9
|
||||
#define APIC_TDR_DIV_128 0xA
|
||||
#define APIC_EILVT0 0x500
|
||||
#define APIC_EILVT_NR_AMD_K8 1 /* Number of extended interrupts */
|
||||
#define APIC_EILVT_NR_AMD_K8 1 /* # of extended interrupts */
|
||||
#define APIC_EILVT_NR_AMD_10H 4
|
||||
#define APIC_EILVT_LVTOFF(x) (((x)>>4)&0xF)
|
||||
#define APIC_EILVT_LVTOFF(x) (((x) >> 4) & 0xF)
|
||||
#define APIC_EILVT_MSG_FIX 0x0
|
||||
#define APIC_EILVT_MSG_SMI 0x2
|
||||
#define APIC_EILVT_MSG_NMI 0x4
|
||||
#define APIC_EILVT_MSG_EXT 0x7
|
||||
#define APIC_EILVT_MASKED (1<<16)
|
||||
#define APIC_EILVT_MASKED (1 << 16)
|
||||
#define APIC_EILVT1 0x510
|
||||
#define APIC_EILVT2 0x520
|
||||
#define APIC_EILVT3 0x530
|
||||
@@ -135,7 +133,7 @@
|
||||
# define MAX_IO_APICS 64
|
||||
#else
|
||||
# define MAX_IO_APICS 128
|
||||
# define MAX_LOCAL_APIC 256
|
||||
# define MAX_LOCAL_APIC 32768
|
||||
#endif
|
||||
|
||||
/*
|
||||
@@ -408,6 +406,9 @@ struct local_apic {
|
||||
|
||||
#undef u32
|
||||
|
||||
#define BAD_APICID 0xFFu
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
#define BAD_APICID 0xFFu
|
||||
#else
|
||||
#define BAD_APICID 0xFFFFu
|
||||
#endif
|
||||
#endif
|
||||
|
||||
+68
-75
@@ -15,138 +15,133 @@
|
||||
* on us. We need to use _exactly_ the address the user gave us,
|
||||
* not some alias that contains the same information.
|
||||
*/
|
||||
typedef struct { int counter; } atomic_t;
|
||||
typedef struct {
|
||||
int counter;
|
||||
} atomic_t;
|
||||
|
||||
#define ATOMIC_INIT(i) { (i) }
|
||||
|
||||
/**
|
||||
* atomic_read - read atomic variable
|
||||
* @v: pointer of type atomic_t
|
||||
*
|
||||
*
|
||||
* Atomically reads the value of @v.
|
||||
*/
|
||||
*/
|
||||
#define atomic_read(v) ((v)->counter)
|
||||
|
||||
/**
|
||||
* atomic_set - set atomic variable
|
||||
* @v: pointer of type atomic_t
|
||||
* @i: required value
|
||||
*
|
||||
*
|
||||
* Atomically sets the value of @v to @i.
|
||||
*/
|
||||
#define atomic_set(v,i) (((v)->counter) = (i))
|
||||
*/
|
||||
#define atomic_set(v, i) (((v)->counter) = (i))
|
||||
|
||||
/**
|
||||
* atomic_add - add integer to atomic variable
|
||||
* @i: integer value to add
|
||||
* @v: pointer of type atomic_t
|
||||
*
|
||||
*
|
||||
* Atomically adds @i to @v.
|
||||
*/
|
||||
static __inline__ void atomic_add(int i, atomic_t *v)
|
||||
static inline void atomic_add(int i, atomic_t *v)
|
||||
{
|
||||
__asm__ __volatile__(
|
||||
LOCK_PREFIX "addl %1,%0"
|
||||
:"+m" (v->counter)
|
||||
:"ir" (i));
|
||||
asm volatile(LOCK_PREFIX "addl %1,%0"
|
||||
: "+m" (v->counter)
|
||||
: "ir" (i));
|
||||
}
|
||||
|
||||
/**
|
||||
* atomic_sub - subtract integer from atomic variable
|
||||
* @i: integer value to subtract
|
||||
* @v: pointer of type atomic_t
|
||||
*
|
||||
*
|
||||
* Atomically subtracts @i from @v.
|
||||
*/
|
||||
static __inline__ void atomic_sub(int i, atomic_t *v)
|
||||
static inline void atomic_sub(int i, atomic_t *v)
|
||||
{
|
||||
__asm__ __volatile__(
|
||||
LOCK_PREFIX "subl %1,%0"
|
||||
:"+m" (v->counter)
|
||||
:"ir" (i));
|
||||
asm volatile(LOCK_PREFIX "subl %1,%0"
|
||||
: "+m" (v->counter)
|
||||
: "ir" (i));
|
||||
}
|
||||
|
||||
/**
|
||||
* atomic_sub_and_test - subtract value from variable and test result
|
||||
* @i: integer value to subtract
|
||||
* @v: pointer of type atomic_t
|
||||
*
|
||||
*
|
||||
* Atomically subtracts @i from @v and returns
|
||||
* true if the result is zero, or false for all
|
||||
* other cases.
|
||||
*/
|
||||
static __inline__ int atomic_sub_and_test(int i, atomic_t *v)
|
||||
static inline int atomic_sub_and_test(int i, atomic_t *v)
|
||||
{
|
||||
unsigned char c;
|
||||
|
||||
__asm__ __volatile__(
|
||||
LOCK_PREFIX "subl %2,%0; sete %1"
|
||||
:"+m" (v->counter), "=qm" (c)
|
||||
:"ir" (i) : "memory");
|
||||
asm volatile(LOCK_PREFIX "subl %2,%0; sete %1"
|
||||
: "+m" (v->counter), "=qm" (c)
|
||||
: "ir" (i) : "memory");
|
||||
return c;
|
||||
}
|
||||
|
||||
/**
|
||||
* atomic_inc - increment atomic variable
|
||||
* @v: pointer of type atomic_t
|
||||
*
|
||||
*
|
||||
* Atomically increments @v by 1.
|
||||
*/
|
||||
static __inline__ void atomic_inc(atomic_t *v)
|
||||
*/
|
||||
static inline void atomic_inc(atomic_t *v)
|
||||
{
|
||||
__asm__ __volatile__(
|
||||
LOCK_PREFIX "incl %0"
|
||||
:"+m" (v->counter));
|
||||
asm volatile(LOCK_PREFIX "incl %0"
|
||||
: "+m" (v->counter));
|
||||
}
|
||||
|
||||
/**
|
||||
* atomic_dec - decrement atomic variable
|
||||
* @v: pointer of type atomic_t
|
||||
*
|
||||
*
|
||||
* Atomically decrements @v by 1.
|
||||
*/
|
||||
static __inline__ void atomic_dec(atomic_t *v)
|
||||
*/
|
||||
static inline void atomic_dec(atomic_t *v)
|
||||
{
|
||||
__asm__ __volatile__(
|
||||
LOCK_PREFIX "decl %0"
|
||||
:"+m" (v->counter));
|
||||
asm volatile(LOCK_PREFIX "decl %0"
|
||||
: "+m" (v->counter));
|
||||
}
|
||||
|
||||
/**
|
||||
* atomic_dec_and_test - decrement and test
|
||||
* @v: pointer of type atomic_t
|
||||
*
|
||||
*
|
||||
* Atomically decrements @v by 1 and
|
||||
* returns true if the result is 0, or false for all other
|
||||
* cases.
|
||||
*/
|
||||
static __inline__ int atomic_dec_and_test(atomic_t *v)
|
||||
*/
|
||||
static inline int atomic_dec_and_test(atomic_t *v)
|
||||
{
|
||||
unsigned char c;
|
||||
|
||||
__asm__ __volatile__(
|
||||
LOCK_PREFIX "decl %0; sete %1"
|
||||
:"+m" (v->counter), "=qm" (c)
|
||||
: : "memory");
|
||||
asm volatile(LOCK_PREFIX "decl %0; sete %1"
|
||||
: "+m" (v->counter), "=qm" (c)
|
||||
: : "memory");
|
||||
return c != 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* atomic_inc_and_test - increment and test
|
||||
* atomic_inc_and_test - increment and test
|
||||
* @v: pointer of type atomic_t
|
||||
*
|
||||
*
|
||||
* Atomically increments @v by 1
|
||||
* and returns true if the result is zero, or false for all
|
||||
* other cases.
|
||||
*/
|
||||
static __inline__ int atomic_inc_and_test(atomic_t *v)
|
||||
*/
|
||||
static inline int atomic_inc_and_test(atomic_t *v)
|
||||
{
|
||||
unsigned char c;
|
||||
|
||||
__asm__ __volatile__(
|
||||
LOCK_PREFIX "incl %0; sete %1"
|
||||
:"+m" (v->counter), "=qm" (c)
|
||||
: : "memory");
|
||||
asm volatile(LOCK_PREFIX "incl %0; sete %1"
|
||||
: "+m" (v->counter), "=qm" (c)
|
||||
: : "memory");
|
||||
return c != 0;
|
||||
}
|
||||
|
||||
@@ -154,19 +149,18 @@ static __inline__ int atomic_inc_and_test(atomic_t *v)
|
||||
* atomic_add_negative - add and test if negative
|
||||
* @v: pointer of type atomic_t
|
||||
* @i: integer value to add
|
||||
*
|
||||
*
|
||||
* Atomically adds @i to @v and returns true
|
||||
* if the result is negative, or false when
|
||||
* result is greater than or equal to zero.
|
||||
*/
|
||||
static __inline__ int atomic_add_negative(int i, atomic_t *v)
|
||||
*/
|
||||
static inline int atomic_add_negative(int i, atomic_t *v)
|
||||
{
|
||||
unsigned char c;
|
||||
|
||||
__asm__ __volatile__(
|
||||
LOCK_PREFIX "addl %2,%0; sets %1"
|
||||
:"+m" (v->counter), "=qm" (c)
|
||||
:"ir" (i) : "memory");
|
||||
asm volatile(LOCK_PREFIX "addl %2,%0; sets %1"
|
||||
: "+m" (v->counter), "=qm" (c)
|
||||
: "ir" (i) : "memory");
|
||||
return c;
|
||||
}
|
||||
|
||||
@@ -177,20 +171,19 @@ static __inline__ int atomic_add_negative(int i, atomic_t *v)
|
||||
*
|
||||
* Atomically adds @i to @v and returns @i + @v
|
||||
*/
|
||||
static __inline__ int atomic_add_return(int i, atomic_t *v)
|
||||
static inline int atomic_add_return(int i, atomic_t *v)
|
||||
{
|
||||
int __i;
|
||||
#ifdef CONFIG_M386
|
||||
unsigned long flags;
|
||||
if(unlikely(boot_cpu_data.x86 <= 3))
|
||||
if (unlikely(boot_cpu_data.x86 <= 3))
|
||||
goto no_xadd;
|
||||
#endif
|
||||
/* Modern 486+ processor */
|
||||
__i = i;
|
||||
__asm__ __volatile__(
|
||||
LOCK_PREFIX "xaddl %0, %1"
|
||||
:"+r" (i), "+m" (v->counter)
|
||||
: : "memory");
|
||||
asm volatile(LOCK_PREFIX "xaddl %0, %1"
|
||||
: "+r" (i), "+m" (v->counter)
|
||||
: : "memory");
|
||||
return i + __i;
|
||||
|
||||
#ifdef CONFIG_M386
|
||||
@@ -210,9 +203,9 @@ no_xadd: /* Legacy 386 processor */
|
||||
*
|
||||
* Atomically subtracts @i from @v and returns @v - @i
|
||||
*/
|
||||
static __inline__ int atomic_sub_return(int i, atomic_t *v)
|
||||
static inline int atomic_sub_return(int i, atomic_t *v)
|
||||
{
|
||||
return atomic_add_return(-i,v);
|
||||
return atomic_add_return(-i, v);
|
||||
}
|
||||
|
||||
#define atomic_cmpxchg(v, old, new) (cmpxchg(&((v)->counter), (old), (new)))
|
||||
@@ -227,7 +220,7 @@ static __inline__ int atomic_sub_return(int i, atomic_t *v)
|
||||
* Atomically adds @a to @v, so long as @v was not already @u.
|
||||
* Returns non-zero if @v was not @u, and zero otherwise.
|
||||
*/
|
||||
static __inline__ int atomic_add_unless(atomic_t *v, int a, int u)
|
||||
static inline int atomic_add_unless(atomic_t *v, int a, int u)
|
||||
{
|
||||
int c, old;
|
||||
c = atomic_read(v);
|
||||
@@ -244,17 +237,17 @@ static __inline__ int atomic_add_unless(atomic_t *v, int a, int u)
|
||||
|
||||
#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
|
||||
|
||||
#define atomic_inc_return(v) (atomic_add_return(1,v))
|
||||
#define atomic_dec_return(v) (atomic_sub_return(1,v))
|
||||
#define atomic_inc_return(v) (atomic_add_return(1, v))
|
||||
#define atomic_dec_return(v) (atomic_sub_return(1, v))
|
||||
|
||||
/* These are x86-specific, used by some header files */
|
||||
#define atomic_clear_mask(mask, addr) \
|
||||
__asm__ __volatile__(LOCK_PREFIX "andl %0,%1" \
|
||||
: : "r" (~(mask)),"m" (*addr) : "memory")
|
||||
#define atomic_clear_mask(mask, addr) \
|
||||
asm volatile(LOCK_PREFIX "andl %0,%1" \
|
||||
: : "r" (~(mask)), "m" (*(addr)) : "memory")
|
||||
|
||||
#define atomic_set_mask(mask, addr) \
|
||||
__asm__ __volatile__(LOCK_PREFIX "orl %0,%1" \
|
||||
: : "r" (mask),"m" (*(addr)) : "memory")
|
||||
#define atomic_set_mask(mask, addr) \
|
||||
asm volatile(LOCK_PREFIX "orl %0,%1" \
|
||||
: : "r" (mask), "m" (*(addr)) : "memory")
|
||||
|
||||
/* Atomic operations are already serializing on x86 */
|
||||
#define smp_mb__before_atomic_dec() barrier()
|
||||
|
||||
+118
-131
@@ -22,140 +22,135 @@
|
||||
* on us. We need to use _exactly_ the address the user gave us,
|
||||
* not some alias that contains the same information.
|
||||
*/
|
||||
typedef struct { int counter; } atomic_t;
|
||||
typedef struct {
|
||||
int counter;
|
||||
} atomic_t;
|
||||
|
||||
#define ATOMIC_INIT(i) { (i) }
|
||||
|
||||
/**
|
||||
* atomic_read - read atomic variable
|
||||
* @v: pointer of type atomic_t
|
||||
*
|
||||
*
|
||||
* Atomically reads the value of @v.
|
||||
*/
|
||||
*/
|
||||
#define atomic_read(v) ((v)->counter)
|
||||
|
||||
/**
|
||||
* atomic_set - set atomic variable
|
||||
* @v: pointer of type atomic_t
|
||||
* @i: required value
|
||||
*
|
||||
*
|
||||
* Atomically sets the value of @v to @i.
|
||||
*/
|
||||
#define atomic_set(v,i) (((v)->counter) = (i))
|
||||
*/
|
||||
#define atomic_set(v, i) (((v)->counter) = (i))
|
||||
|
||||
/**
|
||||
* atomic_add - add integer to atomic variable
|
||||
* @i: integer value to add
|
||||
* @v: pointer of type atomic_t
|
||||
*
|
||||
*
|
||||
* Atomically adds @i to @v.
|
||||
*/
|
||||
static __inline__ void atomic_add(int i, atomic_t *v)
|
||||
static inline void atomic_add(int i, atomic_t *v)
|
||||
{
|
||||
__asm__ __volatile__(
|
||||
LOCK_PREFIX "addl %1,%0"
|
||||
:"=m" (v->counter)
|
||||
:"ir" (i), "m" (v->counter));
|
||||
asm volatile(LOCK_PREFIX "addl %1,%0"
|
||||
: "=m" (v->counter)
|
||||
: "ir" (i), "m" (v->counter));
|
||||
}
|
||||
|
||||
/**
|
||||
* atomic_sub - subtract the atomic variable
|
||||
* @i: integer value to subtract
|
||||
* @v: pointer of type atomic_t
|
||||
*
|
||||
*
|
||||
* Atomically subtracts @i from @v.
|
||||
*/
|
||||
static __inline__ void atomic_sub(int i, atomic_t *v)
|
||||
static inline void atomic_sub(int i, atomic_t *v)
|
||||
{
|
||||
__asm__ __volatile__(
|
||||
LOCK_PREFIX "subl %1,%0"
|
||||
:"=m" (v->counter)
|
||||
:"ir" (i), "m" (v->counter));
|
||||
asm volatile(LOCK_PREFIX "subl %1,%0"
|
||||
: "=m" (v->counter)
|
||||
: "ir" (i), "m" (v->counter));
|
||||
}
|
||||
|
||||
/**
|
||||
* atomic_sub_and_test - subtract value from variable and test result
|
||||
* @i: integer value to subtract
|
||||
* @v: pointer of type atomic_t
|
||||
*
|
||||
*
|
||||
* Atomically subtracts @i from @v and returns
|
||||
* true if the result is zero, or false for all
|
||||
* other cases.
|
||||
*/
|
||||
static __inline__ int atomic_sub_and_test(int i, atomic_t *v)
|
||||
static inline int atomic_sub_and_test(int i, atomic_t *v)
|
||||
{
|
||||
unsigned char c;
|
||||
|
||||
__asm__ __volatile__(
|
||||
LOCK_PREFIX "subl %2,%0; sete %1"
|
||||
:"=m" (v->counter), "=qm" (c)
|
||||
:"ir" (i), "m" (v->counter) : "memory");
|
||||
asm volatile(LOCK_PREFIX "subl %2,%0; sete %1"
|
||||
: "=m" (v->counter), "=qm" (c)
|
||||
: "ir" (i), "m" (v->counter) : "memory");
|
||||
return c;
|
||||
}
|
||||
|
||||
/**
|
||||
* atomic_inc - increment atomic variable
|
||||
* @v: pointer of type atomic_t
|
||||
*
|
||||
*
|
||||
* Atomically increments @v by 1.
|
||||
*/
|
||||
static __inline__ void atomic_inc(atomic_t *v)
|
||||
*/
|
||||
static inline void atomic_inc(atomic_t *v)
|
||||
{
|
||||
__asm__ __volatile__(
|
||||
LOCK_PREFIX "incl %0"
|
||||
:"=m" (v->counter)
|
||||
:"m" (v->counter));
|
||||
asm volatile(LOCK_PREFIX "incl %0"
|
||||
: "=m" (v->counter)
|
||||
: "m" (v->counter));
|
||||
}
|
||||
|
||||
/**
|
||||
* atomic_dec - decrement atomic variable
|
||||
* @v: pointer of type atomic_t
|
||||
*
|
||||
*
|
||||
* Atomically decrements @v by 1.
|
||||
*/
|
||||
static __inline__ void atomic_dec(atomic_t *v)
|
||||
*/
|
||||
static inline void atomic_dec(atomic_t *v)
|
||||
{
|
||||
__asm__ __volatile__(
|
||||
LOCK_PREFIX "decl %0"
|
||||
:"=m" (v->counter)
|
||||
:"m" (v->counter));
|
||||
asm volatile(LOCK_PREFIX "decl %0"
|
||||
: "=m" (v->counter)
|
||||
: "m" (v->counter));
|
||||
}
|
||||
|
||||
/**
|
||||
* atomic_dec_and_test - decrement and test
|
||||
* @v: pointer of type atomic_t
|
||||
*
|
||||
*
|
||||
* Atomically decrements @v by 1 and
|
||||
* returns true if the result is 0, or false for all other
|
||||
* cases.
|
||||
*/
|
||||
static __inline__ int atomic_dec_and_test(atomic_t *v)
|
||||
*/
|
||||
static inline int atomic_dec_and_test(atomic_t *v)
|
||||
{
|
||||
unsigned char c;
|
||||
|
||||
__asm__ __volatile__(
|
||||
LOCK_PREFIX "decl %0; sete %1"
|
||||
:"=m" (v->counter), "=qm" (c)
|
||||
:"m" (v->counter) : "memory");
|
||||
asm volatile(LOCK_PREFIX "decl %0; sete %1"
|
||||
: "=m" (v->counter), "=qm" (c)
|
||||
: "m" (v->counter) : "memory");
|
||||
return c != 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* atomic_inc_and_test - increment and test
|
||||
* atomic_inc_and_test - increment and test
|
||||
* @v: pointer of type atomic_t
|
||||
*
|
||||
*
|
||||
* Atomically increments @v by 1
|
||||
* and returns true if the result is zero, or false for all
|
||||
* other cases.
|
||||
*/
|
||||
static __inline__ int atomic_inc_and_test(atomic_t *v)
|
||||
*/
|
||||
static inline int atomic_inc_and_test(atomic_t *v)
|
||||
{
|
||||
unsigned char c;
|
||||
|
||||
__asm__ __volatile__(
|
||||
LOCK_PREFIX "incl %0; sete %1"
|
||||
:"=m" (v->counter), "=qm" (c)
|
||||
:"m" (v->counter) : "memory");
|
||||
asm volatile(LOCK_PREFIX "incl %0; sete %1"
|
||||
: "=m" (v->counter), "=qm" (c)
|
||||
: "m" (v->counter) : "memory");
|
||||
return c != 0;
|
||||
}
|
||||
|
||||
@@ -163,19 +158,18 @@ static __inline__ int atomic_inc_and_test(atomic_t *v)
|
||||
* atomic_add_negative - add and test if negative
|
||||
* @i: integer value to add
|
||||
* @v: pointer of type atomic_t
|
||||
*
|
||||
*
|
||||
* Atomically adds @i to @v and returns true
|
||||
* if the result is negative, or false when
|
||||
* result is greater than or equal to zero.
|
||||
*/
|
||||
static __inline__ int atomic_add_negative(int i, atomic_t *v)
|
||||
*/
|
||||
static inline int atomic_add_negative(int i, atomic_t *v)
|
||||
{
|
||||
unsigned char c;
|
||||
|
||||
__asm__ __volatile__(
|
||||
LOCK_PREFIX "addl %2,%0; sets %1"
|
||||
:"=m" (v->counter), "=qm" (c)
|
||||
:"ir" (i), "m" (v->counter) : "memory");
|
||||
asm volatile(LOCK_PREFIX "addl %2,%0; sets %1"
|
||||
: "=m" (v->counter), "=qm" (c)
|
||||
: "ir" (i), "m" (v->counter) : "memory");
|
||||
return c;
|
||||
}
|
||||
|
||||
@@ -186,27 +180,28 @@ static __inline__ int atomic_add_negative(int i, atomic_t *v)
|
||||
*
|
||||
* Atomically adds @i to @v and returns @i + @v
|
||||
*/
|
||||
static __inline__ int atomic_add_return(int i, atomic_t *v)
|
||||
static inline int atomic_add_return(int i, atomic_t *v)
|
||||
{
|
||||
int __i = i;
|
||||
__asm__ __volatile__(
|
||||
LOCK_PREFIX "xaddl %0, %1"
|
||||
:"+r" (i), "+m" (v->counter)
|
||||
: : "memory");
|
||||
asm volatile(LOCK_PREFIX "xaddl %0, %1"
|
||||
: "+r" (i), "+m" (v->counter)
|
||||
: : "memory");
|
||||
return i + __i;
|
||||
}
|
||||
|
||||
static __inline__ int atomic_sub_return(int i, atomic_t *v)
|
||||
static inline int atomic_sub_return(int i, atomic_t *v)
|
||||
{
|
||||
return atomic_add_return(-i,v);
|
||||
return atomic_add_return(-i, v);
|
||||
}
|
||||
|
||||
#define atomic_inc_return(v) (atomic_add_return(1,v))
|
||||
#define atomic_dec_return(v) (atomic_sub_return(1,v))
|
||||
#define atomic_inc_return(v) (atomic_add_return(1, v))
|
||||
#define atomic_dec_return(v) (atomic_sub_return(1, v))
|
||||
|
||||
/* An 64bit atomic type */
|
||||
|
||||
typedef struct { long counter; } atomic64_t;
|
||||
typedef struct {
|
||||
long counter;
|
||||
} atomic64_t;
|
||||
|
||||
#define ATOMIC64_INIT(i) { (i) }
|
||||
|
||||
@@ -226,7 +221,7 @@ typedef struct { long counter; } atomic64_t;
|
||||
*
|
||||
* Atomically sets the value of @v to @i.
|
||||
*/
|
||||
#define atomic64_set(v,i) (((v)->counter) = (i))
|
||||
#define atomic64_set(v, i) (((v)->counter) = (i))
|
||||
|
||||
/**
|
||||
* atomic64_add - add integer to atomic64 variable
|
||||
@@ -235,12 +230,11 @@ typedef struct { long counter; } atomic64_t;
|
||||
*
|
||||
* Atomically adds @i to @v.
|
||||
*/
|
||||
static __inline__ void atomic64_add(long i, atomic64_t *v)
|
||||
static inline void atomic64_add(long i, atomic64_t *v)
|
||||
{
|
||||
__asm__ __volatile__(
|
||||
LOCK_PREFIX "addq %1,%0"
|
||||
:"=m" (v->counter)
|
||||
:"ir" (i), "m" (v->counter));
|
||||
asm volatile(LOCK_PREFIX "addq %1,%0"
|
||||
: "=m" (v->counter)
|
||||
: "ir" (i), "m" (v->counter));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -250,12 +244,11 @@ static __inline__ void atomic64_add(long i, atomic64_t *v)
|
||||
*
|
||||
* Atomically subtracts @i from @v.
|
||||
*/
|
||||
static __inline__ void atomic64_sub(long i, atomic64_t *v)
|
||||
static inline void atomic64_sub(long i, atomic64_t *v)
|
||||
{
|
||||
__asm__ __volatile__(
|
||||
LOCK_PREFIX "subq %1,%0"
|
||||
:"=m" (v->counter)
|
||||
:"ir" (i), "m" (v->counter));
|
||||
asm volatile(LOCK_PREFIX "subq %1,%0"
|
||||
: "=m" (v->counter)
|
||||
: "ir" (i), "m" (v->counter));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -267,14 +260,13 @@ static __inline__ void atomic64_sub(long i, atomic64_t *v)
|
||||
* true if the result is zero, or false for all
|
||||
* other cases.
|
||||
*/
|
||||
static __inline__ int atomic64_sub_and_test(long i, atomic64_t *v)
|
||||
static inline int atomic64_sub_and_test(long i, atomic64_t *v)
|
||||
{
|
||||
unsigned char c;
|
||||
|
||||
__asm__ __volatile__(
|
||||
LOCK_PREFIX "subq %2,%0; sete %1"
|
||||
:"=m" (v->counter), "=qm" (c)
|
||||
:"ir" (i), "m" (v->counter) : "memory");
|
||||
asm volatile(LOCK_PREFIX "subq %2,%0; sete %1"
|
||||
: "=m" (v->counter), "=qm" (c)
|
||||
: "ir" (i), "m" (v->counter) : "memory");
|
||||
return c;
|
||||
}
|
||||
|
||||
@@ -284,12 +276,11 @@ static __inline__ int atomic64_sub_and_test(long i, atomic64_t *v)
|
||||
*
|
||||
* Atomically increments @v by 1.
|
||||
*/
|
||||
static __inline__ void atomic64_inc(atomic64_t *v)
|
||||
static inline void atomic64_inc(atomic64_t *v)
|
||||
{
|
||||
__asm__ __volatile__(
|
||||
LOCK_PREFIX "incq %0"
|
||||
:"=m" (v->counter)
|
||||
:"m" (v->counter));
|
||||
asm volatile(LOCK_PREFIX "incq %0"
|
||||
: "=m" (v->counter)
|
||||
: "m" (v->counter));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -298,12 +289,11 @@ static __inline__ void atomic64_inc(atomic64_t *v)
|
||||
*
|
||||
* Atomically decrements @v by 1.
|
||||
*/
|
||||
static __inline__ void atomic64_dec(atomic64_t *v)
|
||||
static inline void atomic64_dec(atomic64_t *v)
|
||||
{
|
||||
__asm__ __volatile__(
|
||||
LOCK_PREFIX "decq %0"
|
||||
:"=m" (v->counter)
|
||||
:"m" (v->counter));
|
||||
asm volatile(LOCK_PREFIX "decq %0"
|
||||
: "=m" (v->counter)
|
||||
: "m" (v->counter));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -314,14 +304,13 @@ static __inline__ void atomic64_dec(atomic64_t *v)
|
||||
* returns true if the result is 0, or false for all other
|
||||
* cases.
|
||||
*/
|
||||
static __inline__ int atomic64_dec_and_test(atomic64_t *v)
|
||||
static inline int atomic64_dec_and_test(atomic64_t *v)
|
||||
{
|
||||
unsigned char c;
|
||||
|
||||
__asm__ __volatile__(
|
||||
LOCK_PREFIX "decq %0; sete %1"
|
||||
:"=m" (v->counter), "=qm" (c)
|
||||
:"m" (v->counter) : "memory");
|
||||
asm volatile(LOCK_PREFIX "decq %0; sete %1"
|
||||
: "=m" (v->counter), "=qm" (c)
|
||||
: "m" (v->counter) : "memory");
|
||||
return c != 0;
|
||||
}
|
||||
|
||||
@@ -333,14 +322,13 @@ static __inline__ int atomic64_dec_and_test(atomic64_t *v)
|
||||
* and returns true if the result is zero, or false for all
|
||||
* other cases.
|
||||
*/
|
||||
static __inline__ int atomic64_inc_and_test(atomic64_t *v)
|
||||
static inline int atomic64_inc_and_test(atomic64_t *v)
|
||||
{
|
||||
unsigned char c;
|
||||
|
||||
__asm__ __volatile__(
|
||||
LOCK_PREFIX "incq %0; sete %1"
|
||||
:"=m" (v->counter), "=qm" (c)
|
||||
:"m" (v->counter) : "memory");
|
||||
asm volatile(LOCK_PREFIX "incq %0; sete %1"
|
||||
: "=m" (v->counter), "=qm" (c)
|
||||
: "m" (v->counter) : "memory");
|
||||
return c != 0;
|
||||
}
|
||||
|
||||
@@ -353,14 +341,13 @@ static __inline__ int atomic64_inc_and_test(atomic64_t *v)
|
||||
* if the result is negative, or false when
|
||||
* result is greater than or equal to zero.
|
||||
*/
|
||||
static __inline__ int atomic64_add_negative(long i, atomic64_t *v)
|
||||
static inline int atomic64_add_negative(long i, atomic64_t *v)
|
||||
{
|
||||
unsigned char c;
|
||||
|
||||
__asm__ __volatile__(
|
||||
LOCK_PREFIX "addq %2,%0; sets %1"
|
||||
:"=m" (v->counter), "=qm" (c)
|
||||
:"ir" (i), "m" (v->counter) : "memory");
|
||||
asm volatile(LOCK_PREFIX "addq %2,%0; sets %1"
|
||||
: "=m" (v->counter), "=qm" (c)
|
||||
: "ir" (i), "m" (v->counter) : "memory");
|
||||
return c;
|
||||
}
|
||||
|
||||
@@ -371,29 +358,28 @@ static __inline__ int atomic64_add_negative(long i, atomic64_t *v)
|
||||
*
|
||||
* Atomically adds @i to @v and returns @i + @v
|
||||
*/
|
||||
static __inline__ long atomic64_add_return(long i, atomic64_t *v)
|
||||
static inline long atomic64_add_return(long i, atomic64_t *v)
|
||||
{
|
||||
long __i = i;
|
||||
__asm__ __volatile__(
|
||||
LOCK_PREFIX "xaddq %0, %1;"
|
||||
:"+r" (i), "+m" (v->counter)
|
||||
: : "memory");
|
||||
asm volatile(LOCK_PREFIX "xaddq %0, %1;"
|
||||
: "+r" (i), "+m" (v->counter)
|
||||
: : "memory");
|
||||
return i + __i;
|
||||
}
|
||||
|
||||
static __inline__ long atomic64_sub_return(long i, atomic64_t *v)
|
||||
static inline long atomic64_sub_return(long i, atomic64_t *v)
|
||||
{
|
||||
return atomic64_add_return(-i,v);
|
||||
return atomic64_add_return(-i, v);
|
||||
}
|
||||
|
||||
#define atomic64_inc_return(v) (atomic64_add_return(1,v))
|
||||
#define atomic64_dec_return(v) (atomic64_sub_return(1,v))
|
||||
#define atomic64_inc_return(v) (atomic64_add_return(1, (v)))
|
||||
#define atomic64_dec_return(v) (atomic64_sub_return(1, (v)))
|
||||
|
||||
#define atomic64_cmpxchg(v, old, new) (cmpxchg(&((v)->counter), old, new))
|
||||
#define atomic64_cmpxchg(v, old, new) (cmpxchg(&((v)->counter), (old), (new)))
|
||||
#define atomic64_xchg(v, new) (xchg(&((v)->counter), new))
|
||||
|
||||
#define atomic_cmpxchg(v, old, new) (cmpxchg(&((v)->counter), old, new))
|
||||
#define atomic_xchg(v, new) (xchg(&((v)->counter), new))
|
||||
#define atomic_cmpxchg(v, old, new) (cmpxchg(&((v)->counter), (old), (new)))
|
||||
#define atomic_xchg(v, new) (xchg(&((v)->counter), (new)))
|
||||
|
||||
/**
|
||||
* atomic_add_unless - add unless the number is a given value
|
||||
@@ -404,7 +390,7 @@ static __inline__ long atomic64_sub_return(long i, atomic64_t *v)
|
||||
* Atomically adds @a to @v, so long as it was not @u.
|
||||
* Returns non-zero if @v was not @u, and zero otherwise.
|
||||
*/
|
||||
static __inline__ int atomic_add_unless(atomic_t *v, int a, int u)
|
||||
static inline int atomic_add_unless(atomic_t *v, int a, int u)
|
||||
{
|
||||
int c, old;
|
||||
c = atomic_read(v);
|
||||
@@ -430,7 +416,7 @@ static __inline__ int atomic_add_unless(atomic_t *v, int a, int u)
|
||||
* Atomically adds @a to @v, so long as it was not @u.
|
||||
* Returns non-zero if @v was not @u, and zero otherwise.
|
||||
*/
|
||||
static __inline__ int atomic64_add_unless(atomic64_t *v, long a, long u)
|
||||
static inline int atomic64_add_unless(atomic64_t *v, long a, long u)
|
||||
{
|
||||
long c, old;
|
||||
c = atomic64_read(v);
|
||||
@@ -448,13 +434,14 @@ static __inline__ int atomic64_add_unless(atomic64_t *v, long a, long u)
|
||||
#define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0)
|
||||
|
||||
/* These are x86-specific, used by some header files */
|
||||
#define atomic_clear_mask(mask, addr) \
|
||||
__asm__ __volatile__(LOCK_PREFIX "andl %0,%1" \
|
||||
: : "r" (~(mask)),"m" (*addr) : "memory")
|
||||
#define atomic_clear_mask(mask, addr) \
|
||||
asm volatile(LOCK_PREFIX "andl %0,%1" \
|
||||
: : "r" (~(mask)), "m" (*(addr)) : "memory")
|
||||
|
||||
#define atomic_set_mask(mask, addr) \
|
||||
__asm__ __volatile__(LOCK_PREFIX "orl %0,%1" \
|
||||
: : "r" ((unsigned)mask),"m" (*(addr)) : "memory")
|
||||
#define atomic_set_mask(mask, addr) \
|
||||
asm volatile(LOCK_PREFIX "orl %0,%1" \
|
||||
: : "r" ((unsigned)(mask)), "m" (*(addr)) \
|
||||
: "memory")
|
||||
|
||||
/* Atomic operations are already serializing on x86 */
|
||||
#define smp_mb__before_atomic_dec() barrier()
|
||||
|
||||
+24
-30
@@ -23,10 +23,13 @@
|
||||
#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 1)
|
||||
/* Technically wrong, but this avoids compilation errors on some gcc
|
||||
versions. */
|
||||
#define ADDR "=m" (*(volatile long *) addr)
|
||||
#define ADDR "=m" (*(volatile long *)addr)
|
||||
#define BIT_ADDR "=m" (((volatile int *)addr)[nr >> 5])
|
||||
#else
|
||||
#define ADDR "+m" (*(volatile long *) addr)
|
||||
#define BIT_ADDR "+m" (((volatile int *)addr)[nr >> 5])
|
||||
#endif
|
||||
#define BASE_ADDR "m" (*(volatile int *)addr)
|
||||
|
||||
/**
|
||||
* set_bit - Atomically set a bit in memory
|
||||
@@ -45,9 +48,7 @@
|
||||
*/
|
||||
static inline void set_bit(int nr, volatile void *addr)
|
||||
{
|
||||
asm volatile(LOCK_PREFIX "bts %1,%0"
|
||||
: ADDR
|
||||
: "Ir" (nr) : "memory");
|
||||
asm volatile(LOCK_PREFIX "bts %1,%0" : ADDR : "Ir" (nr) : "memory");
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -79,9 +80,7 @@ static inline void __set_bit(int nr, volatile void *addr)
|
||||
*/
|
||||
static inline void clear_bit(int nr, volatile void *addr)
|
||||
{
|
||||
asm volatile(LOCK_PREFIX "btr %1,%0"
|
||||
: ADDR
|
||||
: "Ir" (nr));
|
||||
asm volatile(LOCK_PREFIX "btr %1,%2" : BIT_ADDR : "Ir" (nr), BASE_ADDR);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -100,7 +99,7 @@ static inline void clear_bit_unlock(unsigned nr, volatile void *addr)
|
||||
|
||||
static inline void __clear_bit(int nr, volatile void *addr)
|
||||
{
|
||||
asm volatile("btr %1,%0" : ADDR : "Ir" (nr));
|
||||
asm volatile("btr %1,%2" : BIT_ADDR : "Ir" (nr), BASE_ADDR);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -135,7 +134,7 @@ static inline void __clear_bit_unlock(unsigned nr, volatile void *addr)
|
||||
*/
|
||||
static inline void __change_bit(int nr, volatile void *addr)
|
||||
{
|
||||
asm volatile("btc %1,%0" : ADDR : "Ir" (nr));
|
||||
asm volatile("btc %1,%2" : BIT_ADDR : "Ir" (nr), BASE_ADDR);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -149,8 +148,7 @@ static inline void __change_bit(int nr, volatile void *addr)
|
||||
*/
|
||||
static inline void change_bit(int nr, volatile void *addr)
|
||||
{
|
||||
asm volatile(LOCK_PREFIX "btc %1,%0"
|
||||
: ADDR : "Ir" (nr));
|
||||
asm volatile(LOCK_PREFIX "btc %1,%2" : BIT_ADDR : "Ir" (nr), BASE_ADDR);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -166,9 +164,7 @@ static inline int test_and_set_bit(int nr, volatile void *addr)
|
||||
int oldbit;
|
||||
|
||||
asm volatile(LOCK_PREFIX "bts %2,%1\n\t"
|
||||
"sbb %0,%0"
|
||||
: "=r" (oldbit), ADDR
|
||||
: "Ir" (nr) : "memory");
|
||||
"sbb %0,%0" : "=r" (oldbit), ADDR : "Ir" (nr) : "memory");
|
||||
|
||||
return oldbit;
|
||||
}
|
||||
@@ -198,10 +194,9 @@ static inline int __test_and_set_bit(int nr, volatile void *addr)
|
||||
{
|
||||
int oldbit;
|
||||
|
||||
asm("bts %2,%1\n\t"
|
||||
"sbb %0,%0"
|
||||
: "=r" (oldbit), ADDR
|
||||
: "Ir" (nr));
|
||||
asm volatile("bts %2,%3\n\t"
|
||||
"sbb %0,%0"
|
||||
: "=r" (oldbit), BIT_ADDR : "Ir" (nr), BASE_ADDR);
|
||||
return oldbit;
|
||||
}
|
||||
|
||||
@@ -219,8 +214,7 @@ static inline int test_and_clear_bit(int nr, volatile void *addr)
|
||||
|
||||
asm volatile(LOCK_PREFIX "btr %2,%1\n\t"
|
||||
"sbb %0,%0"
|
||||
: "=r" (oldbit), ADDR
|
||||
: "Ir" (nr) : "memory");
|
||||
: "=r" (oldbit), ADDR : "Ir" (nr) : "memory");
|
||||
|
||||
return oldbit;
|
||||
}
|
||||
@@ -238,10 +232,9 @@ static inline int __test_and_clear_bit(int nr, volatile void *addr)
|
||||
{
|
||||
int oldbit;
|
||||
|
||||
asm volatile("btr %2,%1\n\t"
|
||||
asm volatile("btr %2,%3\n\t"
|
||||
"sbb %0,%0"
|
||||
: "=r" (oldbit), ADDR
|
||||
: "Ir" (nr));
|
||||
: "=r" (oldbit), BIT_ADDR : "Ir" (nr), BASE_ADDR);
|
||||
return oldbit;
|
||||
}
|
||||
|
||||
@@ -250,10 +243,9 @@ static inline int __test_and_change_bit(int nr, volatile void *addr)
|
||||
{
|
||||
int oldbit;
|
||||
|
||||
asm volatile("btc %2,%1\n\t"
|
||||
asm volatile("btc %2,%3\n\t"
|
||||
"sbb %0,%0"
|
||||
: "=r" (oldbit), ADDR
|
||||
: "Ir" (nr) : "memory");
|
||||
: "=r" (oldbit), BIT_ADDR : "Ir" (nr), BASE_ADDR);
|
||||
|
||||
return oldbit;
|
||||
}
|
||||
@@ -272,8 +264,7 @@ static inline int test_and_change_bit(int nr, volatile void *addr)
|
||||
|
||||
asm volatile(LOCK_PREFIX "btc %2,%1\n\t"
|
||||
"sbb %0,%0"
|
||||
: "=r" (oldbit), ADDR
|
||||
: "Ir" (nr) : "memory");
|
||||
: "=r" (oldbit), ADDR : "Ir" (nr) : "memory");
|
||||
|
||||
return oldbit;
|
||||
}
|
||||
@@ -288,10 +279,11 @@ static inline int variable_test_bit(int nr, volatile const void *addr)
|
||||
{
|
||||
int oldbit;
|
||||
|
||||
asm volatile("bt %2,%1\n\t"
|
||||
asm volatile("bt %2,%3\n\t"
|
||||
"sbb %0,%0"
|
||||
: "=r" (oldbit)
|
||||
: "m" (*(unsigned long *)addr), "Ir" (nr));
|
||||
: "m" (((volatile const int *)addr)[nr >> 5]),
|
||||
"Ir" (nr), BASE_ADDR);
|
||||
|
||||
return oldbit;
|
||||
}
|
||||
@@ -310,6 +302,8 @@ static int test_bit(int nr, const volatile unsigned long *addr);
|
||||
constant_test_bit((nr),(addr)) : \
|
||||
variable_test_bit((nr),(addr)))
|
||||
|
||||
#undef BASE_ADDR
|
||||
#undef BIT_ADDR
|
||||
#undef ADDR
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
|
||||
+21
-19
@@ -20,20 +20,22 @@ static inline int find_first_zero_bit(const unsigned long *addr, unsigned size)
|
||||
|
||||
if (!size)
|
||||
return 0;
|
||||
/* This looks at memory. Mark it volatile to tell gcc not to move it around */
|
||||
__asm__ __volatile__(
|
||||
"movl $-1,%%eax\n\t"
|
||||
"xorl %%edx,%%edx\n\t"
|
||||
"repe; scasl\n\t"
|
||||
"je 1f\n\t"
|
||||
"xorl -4(%%edi),%%eax\n\t"
|
||||
"subl $4,%%edi\n\t"
|
||||
"bsfl %%eax,%%edx\n"
|
||||
"1:\tsubl %%ebx,%%edi\n\t"
|
||||
"shll $3,%%edi\n\t"
|
||||
"addl %%edi,%%edx"
|
||||
:"=d" (res), "=&c" (d0), "=&D" (d1), "=&a" (d2)
|
||||
:"1" ((size + 31) >> 5), "2" (addr), "b" (addr) : "memory");
|
||||
/* This looks at memory.
|
||||
* Mark it volatile to tell gcc not to move it around
|
||||
*/
|
||||
asm volatile("movl $-1,%%eax\n\t"
|
||||
"xorl %%edx,%%edx\n\t"
|
||||
"repe; scasl\n\t"
|
||||
"je 1f\n\t"
|
||||
"xorl -4(%%edi),%%eax\n\t"
|
||||
"subl $4,%%edi\n\t"
|
||||
"bsfl %%eax,%%edx\n"
|
||||
"1:\tsubl %%ebx,%%edi\n\t"
|
||||
"shll $3,%%edi\n\t"
|
||||
"addl %%edi,%%edx"
|
||||
: "=d" (res), "=&c" (d0), "=&D" (d1), "=&a" (d2)
|
||||
: "1" ((size + 31) >> 5), "2" (addr),
|
||||
"b" (addr) : "memory");
|
||||
return res;
|
||||
}
|
||||
|
||||
@@ -75,7 +77,7 @@ static inline unsigned find_first_bit(const unsigned long *addr, unsigned size)
|
||||
unsigned long val = *addr++;
|
||||
if (val)
|
||||
return __ffs(val) + x;
|
||||
x += (sizeof(*addr)<<3);
|
||||
x += sizeof(*addr) << 3;
|
||||
}
|
||||
return x;
|
||||
}
|
||||
@@ -152,10 +154,10 @@ static inline int fls(int x)
|
||||
|
||||
#include <asm-generic/bitops/ext2-non-atomic.h>
|
||||
|
||||
#define ext2_set_bit_atomic(lock, nr, addr) \
|
||||
test_and_set_bit((nr), (unsigned long *)addr)
|
||||
#define ext2_clear_bit_atomic(lock, nr, addr) \
|
||||
test_and_clear_bit((nr), (unsigned long *)addr)
|
||||
#define ext2_set_bit_atomic(lock, nr, addr) \
|
||||
test_and_set_bit((nr), (unsigned long *)(addr))
|
||||
#define ext2_clear_bit_atomic(lock, nr, addr) \
|
||||
test_and_clear_bit((nr), (unsigned long *)(addr))
|
||||
|
||||
#include <asm-generic/bitops/minix.h>
|
||||
|
||||
|
||||
+20
-20
@@ -17,35 +17,35 @@ static inline long __scanbit(unsigned long val, unsigned long max)
|
||||
return val;
|
||||
}
|
||||
|
||||
#define find_first_bit(addr,size) \
|
||||
((__builtin_constant_p(size) && (size) <= BITS_PER_LONG ? \
|
||||
(__scanbit(*(unsigned long *)addr,(size))) : \
|
||||
find_first_bit(addr,size)))
|
||||
|
||||
#define find_next_bit(addr,size,off) \
|
||||
((__builtin_constant_p(size) && (size) <= BITS_PER_LONG ? \
|
||||
((off) + (__scanbit((*(unsigned long *)addr) >> (off),(size)-(off)))) : \
|
||||
find_next_bit(addr,size,off)))
|
||||
|
||||
#define find_first_zero_bit(addr,size) \
|
||||
((__builtin_constant_p(size) && (size) <= BITS_PER_LONG ? \
|
||||
(__scanbit(~*(unsigned long *)addr,(size))) : \
|
||||
find_first_zero_bit(addr,size)))
|
||||
|
||||
#define find_next_zero_bit(addr,size,off) \
|
||||
((__builtin_constant_p(size) && (size) <= BITS_PER_LONG ? \
|
||||
((off)+(__scanbit(~(((*(unsigned long *)addr)) >> (off)),(size)-(off)))) : \
|
||||
find_next_zero_bit(addr,size,off)))
|
||||
|
||||
static inline void set_bit_string(unsigned long *bitmap, unsigned long i,
|
||||
int len)
|
||||
{
|
||||
unsigned long end = i + len;
|
||||
#define find_first_bit(addr, size) \
|
||||
((__builtin_constant_p((size)) && (size) <= BITS_PER_LONG \
|
||||
? (__scanbit(*(unsigned long *)(addr), (size))) \
|
||||
: find_first_bit((addr), (size))))
|
||||
|
||||
#define find_first_zero_bit(addr, size) \
|
||||
((__builtin_constant_p((size)) && (size) <= BITS_PER_LONG \
|
||||
? (__scanbit(~*(unsigned long *)(addr), (size))) \
|
||||
: find_first_zero_bit((addr), (size))))
|
||||
|
||||
static inline void set_bit_string(unsigned long *bitmap, unsigned long i,
|
||||
int len)
|
||||
{
|
||||
unsigned long end = i + len;
|
||||
while (i < end) {
|
||||
__set_bit(i, bitmap);
|
||||
__set_bit(i, bitmap);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* ffz - find first zero in word.
|
||||
@@ -150,10 +150,10 @@ static inline int fls(int x)
|
||||
|
||||
#include <asm-generic/bitops/ext2-non-atomic.h>
|
||||
|
||||
#define ext2_set_bit_atomic(lock,nr,addr) \
|
||||
test_and_set_bit((nr),(unsigned long*)addr)
|
||||
#define ext2_clear_bit_atomic(lock,nr,addr) \
|
||||
test_and_clear_bit((nr),(unsigned long*)addr)
|
||||
#define ext2_set_bit_atomic(lock, nr, addr) \
|
||||
test_and_set_bit((nr), (unsigned long *)(addr))
|
||||
#define ext2_clear_bit_atomic(lock, nr, addr) \
|
||||
test_and_clear_bit((nr), (unsigned long *)(addr))
|
||||
|
||||
#include <asm-generic/bitops/minix.h>
|
||||
|
||||
|
||||
+17
-17
@@ -12,25 +12,25 @@
|
||||
# define __BUG_C0 "2:\t.quad 1b, %c0\n"
|
||||
#endif
|
||||
|
||||
#define BUG() \
|
||||
do { \
|
||||
asm volatile("1:\tud2\n" \
|
||||
".pushsection __bug_table,\"a\"\n" \
|
||||
__BUG_C0 \
|
||||
"\t.word %c1, 0\n" \
|
||||
"\t.org 2b+%c2\n" \
|
||||
".popsection" \
|
||||
: : "i" (__FILE__), "i" (__LINE__), \
|
||||
"i" (sizeof(struct bug_entry))); \
|
||||
for(;;) ; \
|
||||
} while(0)
|
||||
#define BUG() \
|
||||
do { \
|
||||
asm volatile("1:\tud2\n" \
|
||||
".pushsection __bug_table,\"a\"\n" \
|
||||
__BUG_C0 \
|
||||
"\t.word %c1, 0\n" \
|
||||
"\t.org 2b+%c2\n" \
|
||||
".popsection" \
|
||||
: : "i" (__FILE__), "i" (__LINE__), \
|
||||
"i" (sizeof(struct bug_entry))); \
|
||||
for (;;) ; \
|
||||
} while (0)
|
||||
|
||||
#else
|
||||
#define BUG() \
|
||||
do { \
|
||||
asm volatile("ud2"); \
|
||||
for(;;) ; \
|
||||
} while(0)
|
||||
#define BUG() \
|
||||
do { \
|
||||
asm volatile("ud2"); \
|
||||
for (;;) ; \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
#endif /* !CONFIG_BUG */
|
||||
|
||||
+24
-15
@@ -8,50 +8,59 @@
|
||||
|
||||
#ifdef __i386__
|
||||
|
||||
static __inline__ __attribute_const__ __u32 ___arch__swab32(__u32 x)
|
||||
static inline __attribute_const__ __u32 ___arch__swab32(__u32 x)
|
||||
{
|
||||
#ifdef CONFIG_X86_BSWAP
|
||||
__asm__("bswap %0" : "=r" (x) : "0" (x));
|
||||
asm("bswap %0" : "=r" (x) : "0" (x));
|
||||
#else
|
||||
__asm__("xchgb %b0,%h0\n\t" /* swap lower bytes */
|
||||
"rorl $16,%0\n\t" /* swap words */
|
||||
"xchgb %b0,%h0" /* swap higher bytes */
|
||||
:"=q" (x)
|
||||
: "0" (x));
|
||||
asm("xchgb %b0,%h0\n\t" /* swap lower bytes */
|
||||
"rorl $16,%0\n\t" /* swap words */
|
||||
"xchgb %b0,%h0" /* swap higher bytes */
|
||||
: "=q" (x)
|
||||
: "0" (x));
|
||||
#endif
|
||||
return x;
|
||||
}
|
||||
|
||||
static __inline__ __attribute_const__ __u64 ___arch__swab64(__u64 val)
|
||||
static inline __attribute_const__ __u64 ___arch__swab64(__u64 val)
|
||||
{
|
||||
union {
|
||||
struct { __u32 a,b; } s;
|
||||
struct {
|
||||
__u32 a;
|
||||
__u32 b;
|
||||
} s;
|
||||
__u64 u;
|
||||
} v;
|
||||
v.u = val;
|
||||
#ifdef CONFIG_X86_BSWAP
|
||||
__asm__("bswapl %0 ; bswapl %1 ; xchgl %0,%1"
|
||||
asm("bswapl %0 ; bswapl %1 ; xchgl %0,%1"
|
||||
: "=r" (v.s.a), "=r" (v.s.b)
|
||||
: "0" (v.s.a), "1" (v.s.b));
|
||||
#else
|
||||
v.s.a = ___arch__swab32(v.s.a);
|
||||
v.s.b = ___arch__swab32(v.s.b);
|
||||
__asm__("xchgl %0,%1" : "=r" (v.s.a), "=r" (v.s.b) : "0" (v.s.a), "1" (v.s.b));
|
||||
asm("xchgl %0,%1"
|
||||
: "=r" (v.s.a), "=r" (v.s.b)
|
||||
: "0" (v.s.a), "1" (v.s.b));
|
||||
#endif
|
||||
return v.u;
|
||||
}
|
||||
|
||||
#else /* __i386__ */
|
||||
|
||||
static __inline__ __attribute_const__ __u64 ___arch__swab64(__u64 x)
|
||||
static inline __attribute_const__ __u64 ___arch__swab64(__u64 x)
|
||||
{
|
||||
__asm__("bswapq %0" : "=r" (x) : "0" (x));
|
||||
asm("bswapq %0"
|
||||
: "=r" (x)
|
||||
: "0" (x));
|
||||
return x;
|
||||
}
|
||||
|
||||
static __inline__ __attribute_const__ __u32 ___arch__swab32(__u32 x)
|
||||
static inline __attribute_const__ __u32 ___arch__swab32(__u32 x)
|
||||
{
|
||||
__asm__("bswapl %0" : "=r" (x) : "0" (x));
|
||||
asm("bswapl %0"
|
||||
: "=r" (x)
|
||||
: "0" (x));
|
||||
return x;
|
||||
}
|
||||
|
||||
|
||||
@@ -14,18 +14,77 @@
|
||||
#define flush_dcache_mmap_lock(mapping) do { } while (0)
|
||||
#define flush_dcache_mmap_unlock(mapping) do { } while (0)
|
||||
#define flush_icache_range(start, end) do { } while (0)
|
||||
#define flush_icache_page(vma,pg) do { } while (0)
|
||||
#define flush_icache_user_range(vma,pg,adr,len) do { } while (0)
|
||||
#define flush_icache_page(vma, pg) do { } while (0)
|
||||
#define flush_icache_user_range(vma, pg, adr, len) do { } while (0)
|
||||
#define flush_cache_vmap(start, end) do { } while (0)
|
||||
#define flush_cache_vunmap(start, end) do { } while (0)
|
||||
|
||||
#define copy_to_user_page(vma, page, vaddr, dst, src, len) \
|
||||
memcpy(dst, src, len)
|
||||
#define copy_from_user_page(vma, page, vaddr, dst, src, len) \
|
||||
memcpy(dst, src, len)
|
||||
#define copy_to_user_page(vma, page, vaddr, dst, src, len) \
|
||||
memcpy((dst), (src), (len))
|
||||
#define copy_from_user_page(vma, page, vaddr, dst, src, len) \
|
||||
memcpy((dst), (src), (len))
|
||||
|
||||
int __deprecated_for_modules change_page_attr(struct page *page, int numpages,
|
||||
pgprot_t prot);
|
||||
|
||||
/*
|
||||
* The set_memory_* API can be used to change various attributes of a virtual
|
||||
* address range. The attributes include:
|
||||
* Cachability : UnCached, WriteCombining, WriteBack
|
||||
* Executability : eXeutable, NoteXecutable
|
||||
* Read/Write : ReadOnly, ReadWrite
|
||||
* Presence : NotPresent
|
||||
*
|
||||
* Within a catagory, the attributes are mutually exclusive.
|
||||
*
|
||||
* The implementation of this API will take care of various aspects that
|
||||
* are associated with changing such attributes, such as:
|
||||
* - Flushing TLBs
|
||||
* - Flushing CPU caches
|
||||
* - Making sure aliases of the memory behind the mapping don't violate
|
||||
* coherency rules as defined by the CPU in the system.
|
||||
*
|
||||
* What this API does not do:
|
||||
* - Provide exclusion between various callers - including callers that
|
||||
* operation on other mappings of the same physical page
|
||||
* - Restore default attributes when a page is freed
|
||||
* - Guarantee that mappings other than the requested one are
|
||||
* in any state, other than that these do not violate rules for
|
||||
* the CPU you have. Do not depend on any effects on other mappings,
|
||||
* CPUs other than the one you have may have more relaxed rules.
|
||||
* The caller is required to take care of these.
|
||||
*/
|
||||
|
||||
int _set_memory_uc(unsigned long addr, int numpages);
|
||||
int _set_memory_wc(unsigned long addr, int numpages);
|
||||
int _set_memory_wb(unsigned long addr, int numpages);
|
||||
int set_memory_uc(unsigned long addr, int numpages);
|
||||
int set_memory_wc(unsigned long addr, int numpages);
|
||||
int set_memory_wb(unsigned long addr, int numpages);
|
||||
int set_memory_x(unsigned long addr, int numpages);
|
||||
int set_memory_nx(unsigned long addr, int numpages);
|
||||
int set_memory_ro(unsigned long addr, int numpages);
|
||||
int set_memory_rw(unsigned long addr, int numpages);
|
||||
int set_memory_np(unsigned long addr, int numpages);
|
||||
int set_memory_4k(unsigned long addr, int numpages);
|
||||
|
||||
/*
|
||||
* For legacy compatibility with the old APIs, a few functions
|
||||
* are provided that work on a "struct page".
|
||||
* These functions operate ONLY on the 1:1 kernel mapping of the
|
||||
* memory that the struct page represents, and internally just
|
||||
* call the set_memory_* function. See the description of the
|
||||
* set_memory_* function for more details on conventions.
|
||||
*
|
||||
* These APIs should be considered *deprecated* and are likely going to
|
||||
* be removed in the future.
|
||||
* The reason for this is the implicit operation on the 1:1 mapping only,
|
||||
* making this not a generally useful API.
|
||||
*
|
||||
* Specifically, many users of the old APIs had a virtual address,
|
||||
* called virt_to_page() or vmalloc_to_page() on that address to
|
||||
* get a struct page* that the old API required.
|
||||
* To convert these cases, use set_memory_*() on the original
|
||||
* virtual address, do not use these functions.
|
||||
*/
|
||||
|
||||
int set_pages_uc(struct page *page, int numpages);
|
||||
int set_pages_wb(struct page *page, int numpages);
|
||||
@@ -34,13 +93,6 @@ int set_pages_nx(struct page *page, int numpages);
|
||||
int set_pages_ro(struct page *page, int numpages);
|
||||
int set_pages_rw(struct page *page, int numpages);
|
||||
|
||||
int set_memory_uc(unsigned long addr, int numpages);
|
||||
int set_memory_wb(unsigned long addr, int numpages);
|
||||
int set_memory_x(unsigned long addr, int numpages);
|
||||
int set_memory_nx(unsigned long addr, int numpages);
|
||||
int set_memory_ro(unsigned long addr, int numpages);
|
||||
int set_memory_rw(unsigned long addr, int numpages);
|
||||
int set_memory_np(unsigned long addr, int numpages);
|
||||
|
||||
void clflush_cache_range(void *addr, unsigned int size);
|
||||
|
||||
|
||||
@@ -28,7 +28,8 @@ asmlinkage __wsum csum_partial(const void *buff, int len, __wsum sum);
|
||||
*/
|
||||
|
||||
asmlinkage __wsum csum_partial_copy_generic(const void *src, void *dst,
|
||||
int len, __wsum sum, int *src_err_ptr, int *dst_err_ptr);
|
||||
int len, __wsum sum,
|
||||
int *src_err_ptr, int *dst_err_ptr);
|
||||
|
||||
/*
|
||||
* Note: when you get a NULL pointer exception here this means someone
|
||||
@@ -37,20 +38,20 @@ asmlinkage __wsum csum_partial_copy_generic(const void *src, void *dst,
|
||||
* If you use these functions directly please don't forget the
|
||||
* access_ok().
|
||||
*/
|
||||
static __inline__
|
||||
__wsum csum_partial_copy_nocheck (const void *src, void *dst,
|
||||
int len, __wsum sum)
|
||||
static inline __wsum csum_partial_copy_nocheck(const void *src, void *dst,
|
||||
int len, __wsum sum)
|
||||
{
|
||||
return csum_partial_copy_generic ( src, dst, len, sum, NULL, NULL);
|
||||
return csum_partial_copy_generic(src, dst, len, sum, NULL, NULL);
|
||||
}
|
||||
|
||||
static __inline__
|
||||
__wsum csum_partial_copy_from_user(const void __user *src, void *dst,
|
||||
int len, __wsum sum, int *err_ptr)
|
||||
static inline __wsum csum_partial_copy_from_user(const void __user *src,
|
||||
void *dst,
|
||||
int len, __wsum sum,
|
||||
int *err_ptr)
|
||||
{
|
||||
might_sleep();
|
||||
return csum_partial_copy_generic((__force void *)src, dst,
|
||||
len, sum, err_ptr, NULL);
|
||||
len, sum, err_ptr, NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -64,30 +65,29 @@ static inline __sum16 ip_fast_csum(const void *iph, unsigned int ihl)
|
||||
{
|
||||
unsigned int sum;
|
||||
|
||||
__asm__ __volatile__(
|
||||
"movl (%1), %0 ;\n"
|
||||
"subl $4, %2 ;\n"
|
||||
"jbe 2f ;\n"
|
||||
"addl 4(%1), %0 ;\n"
|
||||
"adcl 8(%1), %0 ;\n"
|
||||
"adcl 12(%1), %0 ;\n"
|
||||
"1: adcl 16(%1), %0 ;\n"
|
||||
"lea 4(%1), %1 ;\n"
|
||||
"decl %2 ;\n"
|
||||
"jne 1b ;\n"
|
||||
"adcl $0, %0 ;\n"
|
||||
"movl %0, %2 ;\n"
|
||||
"shrl $16, %0 ;\n"
|
||||
"addw %w2, %w0 ;\n"
|
||||
"adcl $0, %0 ;\n"
|
||||
"notl %0 ;\n"
|
||||
"2: ;\n"
|
||||
asm volatile("movl (%1), %0 ;\n"
|
||||
"subl $4, %2 ;\n"
|
||||
"jbe 2f ;\n"
|
||||
"addl 4(%1), %0 ;\n"
|
||||
"adcl 8(%1), %0 ;\n"
|
||||
"adcl 12(%1), %0;\n"
|
||||
"1: adcl 16(%1), %0 ;\n"
|
||||
"lea 4(%1), %1 ;\n"
|
||||
"decl %2 ;\n"
|
||||
"jne 1b ;\n"
|
||||
"adcl $0, %0 ;\n"
|
||||
"movl %0, %2 ;\n"
|
||||
"shrl $16, %0 ;\n"
|
||||
"addw %w2, %w0 ;\n"
|
||||
"adcl $0, %0 ;\n"
|
||||
"notl %0 ;\n"
|
||||
"2: ;\n"
|
||||
/* Since the input registers which are loaded with iph and ihl
|
||||
are modified, we must also specify them as outputs, or gcc
|
||||
will assume they contain their original values. */
|
||||
: "=r" (sum), "=r" (iph), "=r" (ihl)
|
||||
: "1" (iph), "2" (ihl)
|
||||
: "memory");
|
||||
: "=r" (sum), "=r" (iph), "=r" (ihl)
|
||||
: "1" (iph), "2" (ihl)
|
||||
: "memory");
|
||||
return (__force __sum16)sum;
|
||||
}
|
||||
|
||||
@@ -97,29 +97,27 @@ static inline __sum16 ip_fast_csum(const void *iph, unsigned int ihl)
|
||||
|
||||
static inline __sum16 csum_fold(__wsum sum)
|
||||
{
|
||||
__asm__(
|
||||
"addl %1, %0 ;\n"
|
||||
"adcl $0xffff, %0 ;\n"
|
||||
: "=r" (sum)
|
||||
: "r" ((__force u32)sum << 16),
|
||||
"0" ((__force u32)sum & 0xffff0000)
|
||||
);
|
||||
asm("addl %1, %0 ;\n"
|
||||
"adcl $0xffff, %0 ;\n"
|
||||
: "=r" (sum)
|
||||
: "r" ((__force u32)sum << 16),
|
||||
"0" ((__force u32)sum & 0xffff0000));
|
||||
return (__force __sum16)(~(__force u32)sum >> 16);
|
||||
}
|
||||
|
||||
static inline __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr,
|
||||
unsigned short len,
|
||||
unsigned short proto,
|
||||
__wsum sum)
|
||||
unsigned short len,
|
||||
unsigned short proto,
|
||||
__wsum sum)
|
||||
{
|
||||
__asm__(
|
||||
"addl %1, %0 ;\n"
|
||||
"adcl %2, %0 ;\n"
|
||||
"adcl %3, %0 ;\n"
|
||||
"adcl $0, %0 ;\n"
|
||||
: "=r" (sum)
|
||||
: "g" (daddr), "g"(saddr), "g"((len + proto) << 8), "0"(sum));
|
||||
return sum;
|
||||
asm("addl %1, %0 ;\n"
|
||||
"adcl %2, %0 ;\n"
|
||||
"adcl %3, %0 ;\n"
|
||||
"adcl $0, %0 ;\n"
|
||||
: "=r" (sum)
|
||||
: "g" (daddr), "g"(saddr),
|
||||
"g" ((len + proto) << 8), "0" (sum));
|
||||
return sum;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -127,11 +125,11 @@ static inline __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr,
|
||||
* returns a 16-bit checksum, already complemented
|
||||
*/
|
||||
static inline __sum16 csum_tcpudp_magic(__be32 saddr, __be32 daddr,
|
||||
unsigned short len,
|
||||
unsigned short proto,
|
||||
__wsum sum)
|
||||
unsigned short len,
|
||||
unsigned short proto,
|
||||
__wsum sum)
|
||||
{
|
||||
return csum_fold(csum_tcpudp_nofold(saddr,daddr,len,proto,sum));
|
||||
return csum_fold(csum_tcpudp_nofold(saddr, daddr, len, proto, sum));
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -141,30 +139,29 @@ static inline __sum16 csum_tcpudp_magic(__be32 saddr, __be32 daddr,
|
||||
|
||||
static inline __sum16 ip_compute_csum(const void *buff, int len)
|
||||
{
|
||||
return csum_fold (csum_partial(buff, len, 0));
|
||||
return csum_fold(csum_partial(buff, len, 0));
|
||||
}
|
||||
|
||||
#define _HAVE_ARCH_IPV6_CSUM
|
||||
static __inline__ __sum16 csum_ipv6_magic(const struct in6_addr *saddr,
|
||||
const struct in6_addr *daddr,
|
||||
__u32 len, unsigned short proto,
|
||||
__wsum sum)
|
||||
static inline __sum16 csum_ipv6_magic(const struct in6_addr *saddr,
|
||||
const struct in6_addr *daddr,
|
||||
__u32 len, unsigned short proto,
|
||||
__wsum sum)
|
||||
{
|
||||
__asm__(
|
||||
"addl 0(%1), %0 ;\n"
|
||||
"adcl 4(%1), %0 ;\n"
|
||||
"adcl 8(%1), %0 ;\n"
|
||||
"adcl 12(%1), %0 ;\n"
|
||||
"adcl 0(%2), %0 ;\n"
|
||||
"adcl 4(%2), %0 ;\n"
|
||||
"adcl 8(%2), %0 ;\n"
|
||||
"adcl 12(%2), %0 ;\n"
|
||||
"adcl %3, %0 ;\n"
|
||||
"adcl %4, %0 ;\n"
|
||||
"adcl $0, %0 ;\n"
|
||||
: "=&r" (sum)
|
||||
: "r" (saddr), "r" (daddr),
|
||||
"r"(htonl(len)), "r"(htonl(proto)), "0"(sum));
|
||||
asm("addl 0(%1), %0 ;\n"
|
||||
"adcl 4(%1), %0 ;\n"
|
||||
"adcl 8(%1), %0 ;\n"
|
||||
"adcl 12(%1), %0 ;\n"
|
||||
"adcl 0(%2), %0 ;\n"
|
||||
"adcl 4(%2), %0 ;\n"
|
||||
"adcl 8(%2), %0 ;\n"
|
||||
"adcl 12(%2), %0 ;\n"
|
||||
"adcl %3, %0 ;\n"
|
||||
"adcl %4, %0 ;\n"
|
||||
"adcl $0, %0 ;\n"
|
||||
: "=&r" (sum)
|
||||
: "r" (saddr), "r" (daddr),
|
||||
"r" (htonl(len)), "r" (htonl(proto)), "0" (sum));
|
||||
|
||||
return csum_fold(sum);
|
||||
}
|
||||
@@ -173,14 +170,15 @@ static __inline__ __sum16 csum_ipv6_magic(const struct in6_addr *saddr,
|
||||
* Copy and checksum to user
|
||||
*/
|
||||
#define HAVE_CSUM_COPY_USER
|
||||
static __inline__ __wsum csum_and_copy_to_user(const void *src,
|
||||
void __user *dst,
|
||||
int len, __wsum sum,
|
||||
int *err_ptr)
|
||||
static inline __wsum csum_and_copy_to_user(const void *src,
|
||||
void __user *dst,
|
||||
int len, __wsum sum,
|
||||
int *err_ptr)
|
||||
{
|
||||
might_sleep();
|
||||
if (access_ok(VERIFY_WRITE, dst, len))
|
||||
return csum_partial_copy_generic(src, (__force void *)dst, len, sum, NULL, err_ptr);
|
||||
return csum_partial_copy_generic(src, (__force void *)dst,
|
||||
len, sum, NULL, err_ptr);
|
||||
|
||||
if (len)
|
||||
*err_ptr = -EFAULT;
|
||||
|
||||
@@ -1,33 +1,31 @@
|
||||
#ifndef _X86_64_CHECKSUM_H
|
||||
#define _X86_64_CHECKSUM_H
|
||||
|
||||
/*
|
||||
* Checksums for x86-64
|
||||
* Copyright 2002 by Andi Kleen, SuSE Labs
|
||||
/*
|
||||
* Checksums for x86-64
|
||||
* Copyright 2002 by Andi Kleen, SuSE Labs
|
||||
* with some code from asm-x86/checksum.h
|
||||
*/
|
||||
*/
|
||||
|
||||
#include <linux/compiler.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/byteorder.h>
|
||||
|
||||
/**
|
||||
/**
|
||||
* csum_fold - Fold and invert a 32bit checksum.
|
||||
* sum: 32bit unfolded sum
|
||||
*
|
||||
*
|
||||
* Fold a 32bit running checksum to 16bit and invert it. This is usually
|
||||
* the last step before putting a checksum into a packet.
|
||||
* Make sure not to mix with 64bit checksums.
|
||||
*/
|
||||
static inline __sum16 csum_fold(__wsum sum)
|
||||
{
|
||||
__asm__(
|
||||
" addl %1,%0\n"
|
||||
" adcl $0xffff,%0"
|
||||
: "=r" (sum)
|
||||
: "r" ((__force u32)sum << 16),
|
||||
"0" ((__force u32)sum & 0xffff0000)
|
||||
);
|
||||
asm(" addl %1,%0\n"
|
||||
" adcl $0xffff,%0"
|
||||
: "=r" (sum)
|
||||
: "r" ((__force u32)sum << 16),
|
||||
"0" ((__force u32)sum & 0xffff0000));
|
||||
return (__force __sum16)(~(__force u32)sum >> 16);
|
||||
}
|
||||
|
||||
@@ -43,46 +41,46 @@ static inline __sum16 csum_fold(__wsum sum)
|
||||
* ip_fast_csum - Compute the IPv4 header checksum efficiently.
|
||||
* iph: ipv4 header
|
||||
* ihl: length of header / 4
|
||||
*/
|
||||
*/
|
||||
static inline __sum16 ip_fast_csum(const void *iph, unsigned int ihl)
|
||||
{
|
||||
unsigned int sum;
|
||||
|
||||
asm( " movl (%1), %0\n"
|
||||
" subl $4, %2\n"
|
||||
" jbe 2f\n"
|
||||
" addl 4(%1), %0\n"
|
||||
" adcl 8(%1), %0\n"
|
||||
" adcl 12(%1), %0\n"
|
||||
"1: adcl 16(%1), %0\n"
|
||||
" lea 4(%1), %1\n"
|
||||
" decl %2\n"
|
||||
" jne 1b\n"
|
||||
" adcl $0, %0\n"
|
||||
" movl %0, %2\n"
|
||||
" shrl $16, %0\n"
|
||||
" addw %w2, %w0\n"
|
||||
" adcl $0, %0\n"
|
||||
" notl %0\n"
|
||||
"2:"
|
||||
asm(" movl (%1), %0\n"
|
||||
" subl $4, %2\n"
|
||||
" jbe 2f\n"
|
||||
" addl 4(%1), %0\n"
|
||||
" adcl 8(%1), %0\n"
|
||||
" adcl 12(%1), %0\n"
|
||||
"1: adcl 16(%1), %0\n"
|
||||
" lea 4(%1), %1\n"
|
||||
" decl %2\n"
|
||||
" jne 1b\n"
|
||||
" adcl $0, %0\n"
|
||||
" movl %0, %2\n"
|
||||
" shrl $16, %0\n"
|
||||
" addw %w2, %w0\n"
|
||||
" adcl $0, %0\n"
|
||||
" notl %0\n"
|
||||
"2:"
|
||||
/* Since the input registers which are loaded with iph and ihl
|
||||
are modified, we must also specify them as outputs, or gcc
|
||||
will assume they contain their original values. */
|
||||
: "=r" (sum), "=r" (iph), "=r" (ihl)
|
||||
: "1" (iph), "2" (ihl)
|
||||
: "memory");
|
||||
: "=r" (sum), "=r" (iph), "=r" (ihl)
|
||||
: "1" (iph), "2" (ihl)
|
||||
: "memory");
|
||||
return (__force __sum16)sum;
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* csum_tcpup_nofold - Compute an IPv4 pseudo header checksum.
|
||||
* @saddr: source address
|
||||
* @daddr: destination address
|
||||
* @len: length of packet
|
||||
* @proto: ip protocol of packet
|
||||
* @sum: initial sum to be added in (32bit unfolded)
|
||||
*
|
||||
* Returns the pseudo header checksum the input data. Result is
|
||||
* @sum: initial sum to be added in (32bit unfolded)
|
||||
*
|
||||
* Returns the pseudo header checksum the input data. Result is
|
||||
* 32bit unfolded.
|
||||
*/
|
||||
static inline __wsum
|
||||
@@ -93,32 +91,32 @@ csum_tcpudp_nofold(__be32 saddr, __be32 daddr, unsigned short len,
|
||||
" adcl %2, %0\n"
|
||||
" adcl %3, %0\n"
|
||||
" adcl $0, %0\n"
|
||||
: "=r" (sum)
|
||||
: "=r" (sum)
|
||||
: "g" (daddr), "g" (saddr),
|
||||
"g" ((len + proto)<<8), "0" (sum));
|
||||
return sum;
|
||||
return sum;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
/**
|
||||
* csum_tcpup_magic - Compute an IPv4 pseudo header checksum.
|
||||
* @saddr: source address
|
||||
* @daddr: destination address
|
||||
* @len: length of packet
|
||||
* @proto: ip protocol of packet
|
||||
* @sum: initial sum to be added in (32bit unfolded)
|
||||
*
|
||||
* @sum: initial sum to be added in (32bit unfolded)
|
||||
*
|
||||
* Returns the 16bit pseudo header checksum the input data already
|
||||
* complemented and ready to be filled in.
|
||||
*/
|
||||
static inline __sum16
|
||||
csum_tcpudp_magic(__be32 saddr, __be32 daddr,
|
||||
unsigned short len, unsigned short proto, __wsum sum)
|
||||
static inline __sum16 csum_tcpudp_magic(__be32 saddr, __be32 daddr,
|
||||
unsigned short len,
|
||||
unsigned short proto, __wsum sum)
|
||||
{
|
||||
return csum_fold(csum_tcpudp_nofold(saddr,daddr,len,proto,sum));
|
||||
return csum_fold(csum_tcpudp_nofold(saddr, daddr, len, proto, sum));
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* csum_partial - Compute an internet checksum.
|
||||
* @buff: buffer to be checksummed
|
||||
* @len: length of buffer.
|
||||
@@ -127,7 +125,7 @@ csum_tcpudp_magic(__be32 saddr, __be32 daddr,
|
||||
* Returns the 32bit unfolded internet checksum of the buffer.
|
||||
* Before filling it in it needs to be csum_fold()'ed.
|
||||
* buff should be aligned to a 64bit boundary if possible.
|
||||
*/
|
||||
*/
|
||||
extern __wsum csum_partial(const void *buff, int len, __wsum sum);
|
||||
|
||||
#define _HAVE_ARCH_COPY_AND_CSUM_FROM_USER 1
|
||||
@@ -136,23 +134,22 @@ extern __wsum csum_partial(const void *buff, int len, __wsum sum);
|
||||
|
||||
/* Do not call this directly. Use the wrappers below */
|
||||
extern __wsum csum_partial_copy_generic(const void *src, const void *dst,
|
||||
int len,
|
||||
__wsum sum,
|
||||
int *src_err_ptr, int *dst_err_ptr);
|
||||
int len, __wsum sum,
|
||||
int *src_err_ptr, int *dst_err_ptr);
|
||||
|
||||
|
||||
extern __wsum csum_partial_copy_from_user(const void __user *src, void *dst,
|
||||
int len, __wsum isum, int *errp);
|
||||
int len, __wsum isum, int *errp);
|
||||
extern __wsum csum_partial_copy_to_user(const void *src, void __user *dst,
|
||||
int len, __wsum isum, int *errp);
|
||||
extern __wsum csum_partial_copy_nocheck(const void *src, void *dst, int len,
|
||||
__wsum sum);
|
||||
int len, __wsum isum, int *errp);
|
||||
extern __wsum csum_partial_copy_nocheck(const void *src, void *dst,
|
||||
int len, __wsum sum);
|
||||
|
||||
/* Old names. To be removed. */
|
||||
#define csum_and_copy_to_user csum_partial_copy_to_user
|
||||
#define csum_and_copy_from_user csum_partial_copy_from_user
|
||||
|
||||
/**
|
||||
/**
|
||||
* ip_compute_csum - Compute an 16bit IP checksum.
|
||||
* @buff: buffer address.
|
||||
* @len: length of buffer.
|
||||
@@ -170,7 +167,7 @@ extern __sum16 ip_compute_csum(const void *buff, int len);
|
||||
* @proto: protocol of packet
|
||||
* @sum: initial sum (32bit unfolded) to be added in
|
||||
*
|
||||
* Computes an IPv6 pseudo header checksum. This sum is added the checksum
|
||||
* Computes an IPv6 pseudo header checksum. This sum is added the checksum
|
||||
* into UDP/TCP packets and contains some link layer information.
|
||||
* Returns the unfolded 32bit checksum.
|
||||
*/
|
||||
@@ -185,11 +182,10 @@ csum_ipv6_magic(const struct in6_addr *saddr, const struct in6_addr *daddr,
|
||||
static inline unsigned add32_with_carry(unsigned a, unsigned b)
|
||||
{
|
||||
asm("addl %2,%0\n\t"
|
||||
"adcl $0,%0"
|
||||
: "=r" (a)
|
||||
"adcl $0,%0"
|
||||
: "=r" (a)
|
||||
: "0" (a), "r" (b));
|
||||
return a;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
+135
-124
@@ -8,9 +8,12 @@
|
||||
* you need to test for the feature in boot_cpu_data.
|
||||
*/
|
||||
|
||||
#define xchg(ptr,v) ((__typeof__(*(ptr)))__xchg((unsigned long)(v),(ptr),sizeof(*(ptr))))
|
||||
#define xchg(ptr, v) \
|
||||
((__typeof__(*(ptr)))__xchg((unsigned long)(v), (ptr), sizeof(*(ptr))))
|
||||
|
||||
struct __xchg_dummy { unsigned long a[100]; };
|
||||
struct __xchg_dummy {
|
||||
unsigned long a[100];
|
||||
};
|
||||
#define __xg(x) ((struct __xchg_dummy *)(x))
|
||||
|
||||
/*
|
||||
@@ -27,72 +30,74 @@ struct __xchg_dummy { unsigned long a[100]; };
|
||||
* of the instruction set reference 24319102.pdf. We need
|
||||
* the reader side to see the coherent 64bit value.
|
||||
*/
|
||||
static inline void __set_64bit (unsigned long long * ptr,
|
||||
unsigned int low, unsigned int high)
|
||||
static inline void __set_64bit(unsigned long long *ptr,
|
||||
unsigned int low, unsigned int high)
|
||||
{
|
||||
__asm__ __volatile__ (
|
||||
"\n1:\t"
|
||||
"movl (%0), %%eax\n\t"
|
||||
"movl 4(%0), %%edx\n\t"
|
||||
LOCK_PREFIX "cmpxchg8b (%0)\n\t"
|
||||
"jnz 1b"
|
||||
: /* no outputs */
|
||||
: "D"(ptr),
|
||||
"b"(low),
|
||||
"c"(high)
|
||||
: "ax","dx","memory");
|
||||
asm volatile("\n1:\t"
|
||||
"movl (%0), %%eax\n\t"
|
||||
"movl 4(%0), %%edx\n\t"
|
||||
LOCK_PREFIX "cmpxchg8b (%0)\n\t"
|
||||
"jnz 1b"
|
||||
: /* no outputs */
|
||||
: "D"(ptr),
|
||||
"b"(low),
|
||||
"c"(high)
|
||||
: "ax", "dx", "memory");
|
||||
}
|
||||
|
||||
static inline void __set_64bit_constant (unsigned long long *ptr,
|
||||
unsigned long long value)
|
||||
static inline void __set_64bit_constant(unsigned long long *ptr,
|
||||
unsigned long long value)
|
||||
{
|
||||
__set_64bit(ptr,(unsigned int)(value), (unsigned int)((value)>>32ULL));
|
||||
}
|
||||
#define ll_low(x) *(((unsigned int*)&(x))+0)
|
||||
#define ll_high(x) *(((unsigned int*)&(x))+1)
|
||||
|
||||
static inline void __set_64bit_var (unsigned long long *ptr,
|
||||
unsigned long long value)
|
||||
{
|
||||
__set_64bit(ptr,ll_low(value), ll_high(value));
|
||||
__set_64bit(ptr, (unsigned int)value, (unsigned int)(value >> 32));
|
||||
}
|
||||
|
||||
#define set_64bit(ptr,value) \
|
||||
(__builtin_constant_p(value) ? \
|
||||
__set_64bit_constant(ptr, value) : \
|
||||
__set_64bit_var(ptr, value) )
|
||||
#define ll_low(x) *(((unsigned int *)&(x)) + 0)
|
||||
#define ll_high(x) *(((unsigned int *)&(x)) + 1)
|
||||
|
||||
#define _set_64bit(ptr,value) \
|
||||
(__builtin_constant_p(value) ? \
|
||||
__set_64bit(ptr, (unsigned int)(value), (unsigned int)((value)>>32ULL) ) : \
|
||||
__set_64bit(ptr, ll_low(value), ll_high(value)) )
|
||||
static inline void __set_64bit_var(unsigned long long *ptr,
|
||||
unsigned long long value)
|
||||
{
|
||||
__set_64bit(ptr, ll_low(value), ll_high(value));
|
||||
}
|
||||
|
||||
#define set_64bit(ptr, value) \
|
||||
(__builtin_constant_p((value)) \
|
||||
? __set_64bit_constant((ptr), (value)) \
|
||||
: __set_64bit_var((ptr), (value)))
|
||||
|
||||
#define _set_64bit(ptr, value) \
|
||||
(__builtin_constant_p(value) \
|
||||
? __set_64bit(ptr, (unsigned int)(value), \
|
||||
(unsigned int)((value) >> 32)) \
|
||||
: __set_64bit(ptr, ll_low((value)), ll_high((value))))
|
||||
|
||||
/*
|
||||
* Note: no "lock" prefix even on SMP: xchg always implies lock anyway
|
||||
* Note 2: xchg has side effect, so that attribute volatile is necessary,
|
||||
* but generally the primitive is invalid, *ptr is output argument. --ANK
|
||||
*/
|
||||
static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int size)
|
||||
static inline unsigned long __xchg(unsigned long x, volatile void *ptr,
|
||||
int size)
|
||||
{
|
||||
switch (size) {
|
||||
case 1:
|
||||
__asm__ __volatile__("xchgb %b0,%1"
|
||||
:"=q" (x)
|
||||
:"m" (*__xg(ptr)), "0" (x)
|
||||
:"memory");
|
||||
break;
|
||||
case 2:
|
||||
__asm__ __volatile__("xchgw %w0,%1"
|
||||
:"=r" (x)
|
||||
:"m" (*__xg(ptr)), "0" (x)
|
||||
:"memory");
|
||||
break;
|
||||
case 4:
|
||||
__asm__ __volatile__("xchgl %0,%1"
|
||||
:"=r" (x)
|
||||
:"m" (*__xg(ptr)), "0" (x)
|
||||
:"memory");
|
||||
break;
|
||||
case 1:
|
||||
asm volatile("xchgb %b0,%1"
|
||||
: "=q" (x)
|
||||
: "m" (*__xg(ptr)), "0" (x)
|
||||
: "memory");
|
||||
break;
|
||||
case 2:
|
||||
asm volatile("xchgw %w0,%1"
|
||||
: "=r" (x)
|
||||
: "m" (*__xg(ptr)), "0" (x)
|
||||
: "memory");
|
||||
break;
|
||||
case 4:
|
||||
asm volatile("xchgl %0,%1"
|
||||
: "=r" (x)
|
||||
: "m" (*__xg(ptr)), "0" (x)
|
||||
: "memory");
|
||||
break;
|
||||
}
|
||||
return x;
|
||||
}
|
||||
@@ -105,24 +110,27 @@ static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int siz
|
||||
|
||||
#ifdef CONFIG_X86_CMPXCHG
|
||||
#define __HAVE_ARCH_CMPXCHG 1
|
||||
#define cmpxchg(ptr, o, n) \
|
||||
((__typeof__(*(ptr)))__cmpxchg((ptr), (unsigned long)(o), \
|
||||
(unsigned long)(n), sizeof(*(ptr))))
|
||||
#define sync_cmpxchg(ptr, o, n) \
|
||||
((__typeof__(*(ptr)))__sync_cmpxchg((ptr), (unsigned long)(o), \
|
||||
(unsigned long)(n), sizeof(*(ptr))))
|
||||
#define cmpxchg_local(ptr, o, n) \
|
||||
((__typeof__(*(ptr)))__cmpxchg_local((ptr), (unsigned long)(o), \
|
||||
(unsigned long)(n), sizeof(*(ptr))))
|
||||
#define cmpxchg(ptr, o, n) \
|
||||
((__typeof__(*(ptr)))__cmpxchg((ptr), (unsigned long)(o), \
|
||||
(unsigned long)(n), \
|
||||
sizeof(*(ptr))))
|
||||
#define sync_cmpxchg(ptr, o, n) \
|
||||
((__typeof__(*(ptr)))__sync_cmpxchg((ptr), (unsigned long)(o), \
|
||||
(unsigned long)(n), \
|
||||
sizeof(*(ptr))))
|
||||
#define cmpxchg_local(ptr, o, n) \
|
||||
((__typeof__(*(ptr)))__cmpxchg_local((ptr), (unsigned long)(o), \
|
||||
(unsigned long)(n), \
|
||||
sizeof(*(ptr))))
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_X86_CMPXCHG64
|
||||
#define cmpxchg64(ptr, o, n) \
|
||||
((__typeof__(*(ptr)))__cmpxchg64((ptr), (unsigned long long)(o), \
|
||||
(unsigned long long)(n)))
|
||||
#define cmpxchg64_local(ptr, o, n) \
|
||||
((__typeof__(*(ptr)))__cmpxchg64_local((ptr), (unsigned long long)(o),\
|
||||
(unsigned long long)(n)))
|
||||
#define cmpxchg64(ptr, o, n) \
|
||||
((__typeof__(*(ptr)))__cmpxchg64((ptr), (unsigned long long)(o), \
|
||||
(unsigned long long)(n)))
|
||||
#define cmpxchg64_local(ptr, o, n) \
|
||||
((__typeof__(*(ptr)))__cmpxchg64_local((ptr), (unsigned long long)(o), \
|
||||
(unsigned long long)(n)))
|
||||
#endif
|
||||
|
||||
static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old,
|
||||
@@ -131,22 +139,22 @@ static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old,
|
||||
unsigned long prev;
|
||||
switch (size) {
|
||||
case 1:
|
||||
__asm__ __volatile__(LOCK_PREFIX "cmpxchgb %b1,%2"
|
||||
: "=a"(prev)
|
||||
: "q"(new), "m"(*__xg(ptr)), "0"(old)
|
||||
: "memory");
|
||||
asm volatile(LOCK_PREFIX "cmpxchgb %b1,%2"
|
||||
: "=a"(prev)
|
||||
: "q"(new), "m"(*__xg(ptr)), "0"(old)
|
||||
: "memory");
|
||||
return prev;
|
||||
case 2:
|
||||
__asm__ __volatile__(LOCK_PREFIX "cmpxchgw %w1,%2"
|
||||
: "=a"(prev)
|
||||
: "r"(new), "m"(*__xg(ptr)), "0"(old)
|
||||
: "memory");
|
||||
asm volatile(LOCK_PREFIX "cmpxchgw %w1,%2"
|
||||
: "=a"(prev)
|
||||
: "r"(new), "m"(*__xg(ptr)), "0"(old)
|
||||
: "memory");
|
||||
return prev;
|
||||
case 4:
|
||||
__asm__ __volatile__(LOCK_PREFIX "cmpxchgl %1,%2"
|
||||
: "=a"(prev)
|
||||
: "r"(new), "m"(*__xg(ptr)), "0"(old)
|
||||
: "memory");
|
||||
asm volatile(LOCK_PREFIX "cmpxchgl %1,%2"
|
||||
: "=a"(prev)
|
||||
: "r"(new), "m"(*__xg(ptr)), "0"(old)
|
||||
: "memory");
|
||||
return prev;
|
||||
}
|
||||
return old;
|
||||
@@ -158,85 +166,88 @@ static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old,
|
||||
* isn't.
|
||||
*/
|
||||
static inline unsigned long __sync_cmpxchg(volatile void *ptr,
|
||||
unsigned long old,
|
||||
unsigned long new, int size)
|
||||
unsigned long old,
|
||||
unsigned long new, int size)
|
||||
{
|
||||
unsigned long prev;
|
||||
switch (size) {
|
||||
case 1:
|
||||
__asm__ __volatile__("lock; cmpxchgb %b1,%2"
|
||||
: "=a"(prev)
|
||||
: "q"(new), "m"(*__xg(ptr)), "0"(old)
|
||||
: "memory");
|
||||
asm volatile("lock; cmpxchgb %b1,%2"
|
||||
: "=a"(prev)
|
||||
: "q"(new), "m"(*__xg(ptr)), "0"(old)
|
||||
: "memory");
|
||||
return prev;
|
||||
case 2:
|
||||
__asm__ __volatile__("lock; cmpxchgw %w1,%2"
|
||||
: "=a"(prev)
|
||||
: "r"(new), "m"(*__xg(ptr)), "0"(old)
|
||||
: "memory");
|
||||
asm volatile("lock; cmpxchgw %w1,%2"
|
||||
: "=a"(prev)
|
||||
: "r"(new), "m"(*__xg(ptr)), "0"(old)
|
||||
: "memory");
|
||||
return prev;
|
||||
case 4:
|
||||
__asm__ __volatile__("lock; cmpxchgl %1,%2"
|
||||
: "=a"(prev)
|
||||
: "r"(new), "m"(*__xg(ptr)), "0"(old)
|
||||
: "memory");
|
||||
asm volatile("lock; cmpxchgl %1,%2"
|
||||
: "=a"(prev)
|
||||
: "r"(new), "m"(*__xg(ptr)), "0"(old)
|
||||
: "memory");
|
||||
return prev;
|
||||
}
|
||||
return old;
|
||||
}
|
||||
|
||||
static inline unsigned long __cmpxchg_local(volatile void *ptr,
|
||||
unsigned long old, unsigned long new, int size)
|
||||
unsigned long old,
|
||||
unsigned long new, int size)
|
||||
{
|
||||
unsigned long prev;
|
||||
switch (size) {
|
||||
case 1:
|
||||
__asm__ __volatile__("cmpxchgb %b1,%2"
|
||||
: "=a"(prev)
|
||||
: "q"(new), "m"(*__xg(ptr)), "0"(old)
|
||||
: "memory");
|
||||
asm volatile("cmpxchgb %b1,%2"
|
||||
: "=a"(prev)
|
||||
: "q"(new), "m"(*__xg(ptr)), "0"(old)
|
||||
: "memory");
|
||||
return prev;
|
||||
case 2:
|
||||
__asm__ __volatile__("cmpxchgw %w1,%2"
|
||||
: "=a"(prev)
|
||||
: "r"(new), "m"(*__xg(ptr)), "0"(old)
|
||||
: "memory");
|
||||
asm volatile("cmpxchgw %w1,%2"
|
||||
: "=a"(prev)
|
||||
: "r"(new), "m"(*__xg(ptr)), "0"(old)
|
||||
: "memory");
|
||||
return prev;
|
||||
case 4:
|
||||
__asm__ __volatile__("cmpxchgl %1,%2"
|
||||
: "=a"(prev)
|
||||
: "r"(new), "m"(*__xg(ptr)), "0"(old)
|
||||
: "memory");
|
||||
asm volatile("cmpxchgl %1,%2"
|
||||
: "=a"(prev)
|
||||
: "r"(new), "m"(*__xg(ptr)), "0"(old)
|
||||
: "memory");
|
||||
return prev;
|
||||
}
|
||||
return old;
|
||||
}
|
||||
|
||||
static inline unsigned long long __cmpxchg64(volatile void *ptr,
|
||||
unsigned long long old, unsigned long long new)
|
||||
unsigned long long old,
|
||||
unsigned long long new)
|
||||
{
|
||||
unsigned long long prev;
|
||||
__asm__ __volatile__(LOCK_PREFIX "cmpxchg8b %3"
|
||||
: "=A"(prev)
|
||||
: "b"((unsigned long)new),
|
||||
"c"((unsigned long)(new >> 32)),
|
||||
"m"(*__xg(ptr)),
|
||||
"0"(old)
|
||||
: "memory");
|
||||
asm volatile(LOCK_PREFIX "cmpxchg8b %3"
|
||||
: "=A"(prev)
|
||||
: "b"((unsigned long)new),
|
||||
"c"((unsigned long)(new >> 32)),
|
||||
"m"(*__xg(ptr)),
|
||||
"0"(old)
|
||||
: "memory");
|
||||
return prev;
|
||||
}
|
||||
|
||||
static inline unsigned long long __cmpxchg64_local(volatile void *ptr,
|
||||
unsigned long long old, unsigned long long new)
|
||||
unsigned long long old,
|
||||
unsigned long long new)
|
||||
{
|
||||
unsigned long long prev;
|
||||
__asm__ __volatile__("cmpxchg8b %3"
|
||||
: "=A"(prev)
|
||||
: "b"((unsigned long)new),
|
||||
"c"((unsigned long)(new >> 32)),
|
||||
"m"(*__xg(ptr)),
|
||||
"0"(old)
|
||||
: "memory");
|
||||
asm volatile("cmpxchg8b %3"
|
||||
: "=A"(prev)
|
||||
: "b"((unsigned long)new),
|
||||
"c"((unsigned long)(new >> 32)),
|
||||
"m"(*__xg(ptr)),
|
||||
"0"(old)
|
||||
: "memory");
|
||||
return prev;
|
||||
}
|
||||
|
||||
@@ -252,7 +263,7 @@ extern unsigned long cmpxchg_386_u16(volatile void *, u16, u16);
|
||||
extern unsigned long cmpxchg_386_u32(volatile void *, u32, u32);
|
||||
|
||||
static inline unsigned long cmpxchg_386(volatile void *ptr, unsigned long old,
|
||||
unsigned long new, int size)
|
||||
unsigned long new, int size)
|
||||
{
|
||||
switch (size) {
|
||||
case 1:
|
||||
|
||||
@@ -3,7 +3,8 @@
|
||||
|
||||
#include <asm/alternative.h> /* Provides LOCK_PREFIX */
|
||||
|
||||
#define xchg(ptr,v) ((__typeof__(*(ptr)))__xchg((unsigned long)(v),(ptr),sizeof(*(ptr))))
|
||||
#define xchg(ptr, v) ((__typeof__(*(ptr)))__xchg((unsigned long)(v), \
|
||||
(ptr), sizeof(*(ptr))))
|
||||
|
||||
#define __xg(x) ((volatile long *)(x))
|
||||
|
||||
@@ -19,33 +20,34 @@ static inline void set_64bit(volatile unsigned long *ptr, unsigned long val)
|
||||
* Note 2: xchg has side effect, so that attribute volatile is necessary,
|
||||
* but generally the primitive is invalid, *ptr is output argument. --ANK
|
||||
*/
|
||||
static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int size)
|
||||
static inline unsigned long __xchg(unsigned long x, volatile void *ptr,
|
||||
int size)
|
||||
{
|
||||
switch (size) {
|
||||
case 1:
|
||||
__asm__ __volatile__("xchgb %b0,%1"
|
||||
:"=q" (x)
|
||||
:"m" (*__xg(ptr)), "0" (x)
|
||||
:"memory");
|
||||
break;
|
||||
case 2:
|
||||
__asm__ __volatile__("xchgw %w0,%1"
|
||||
:"=r" (x)
|
||||
:"m" (*__xg(ptr)), "0" (x)
|
||||
:"memory");
|
||||
break;
|
||||
case 4:
|
||||
__asm__ __volatile__("xchgl %k0,%1"
|
||||
:"=r" (x)
|
||||
:"m" (*__xg(ptr)), "0" (x)
|
||||
:"memory");
|
||||
break;
|
||||
case 8:
|
||||
__asm__ __volatile__("xchgq %0,%1"
|
||||
:"=r" (x)
|
||||
:"m" (*__xg(ptr)), "0" (x)
|
||||
:"memory");
|
||||
break;
|
||||
case 1:
|
||||
asm volatile("xchgb %b0,%1"
|
||||
: "=q" (x)
|
||||
: "m" (*__xg(ptr)), "0" (x)
|
||||
: "memory");
|
||||
break;
|
||||
case 2:
|
||||
asm volatile("xchgw %w0,%1"
|
||||
: "=r" (x)
|
||||
: "m" (*__xg(ptr)), "0" (x)
|
||||
: "memory");
|
||||
break;
|
||||
case 4:
|
||||
asm volatile("xchgl %k0,%1"
|
||||
: "=r" (x)
|
||||
: "m" (*__xg(ptr)), "0" (x)
|
||||
: "memory");
|
||||
break;
|
||||
case 8:
|
||||
asm volatile("xchgq %0,%1"
|
||||
: "=r" (x)
|
||||
: "m" (*__xg(ptr)), "0" (x)
|
||||
: "memory");
|
||||
break;
|
||||
}
|
||||
return x;
|
||||
}
|
||||
@@ -64,61 +66,62 @@ static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old,
|
||||
unsigned long prev;
|
||||
switch (size) {
|
||||
case 1:
|
||||
__asm__ __volatile__(LOCK_PREFIX "cmpxchgb %b1,%2"
|
||||
: "=a"(prev)
|
||||
: "q"(new), "m"(*__xg(ptr)), "0"(old)
|
||||
: "memory");
|
||||
asm volatile(LOCK_PREFIX "cmpxchgb %b1,%2"
|
||||
: "=a"(prev)
|
||||
: "q"(new), "m"(*__xg(ptr)), "0"(old)
|
||||
: "memory");
|
||||
return prev;
|
||||
case 2:
|
||||
__asm__ __volatile__(LOCK_PREFIX "cmpxchgw %w1,%2"
|
||||
: "=a"(prev)
|
||||
: "r"(new), "m"(*__xg(ptr)), "0"(old)
|
||||
: "memory");
|
||||
asm volatile(LOCK_PREFIX "cmpxchgw %w1,%2"
|
||||
: "=a"(prev)
|
||||
: "r"(new), "m"(*__xg(ptr)), "0"(old)
|
||||
: "memory");
|
||||
return prev;
|
||||
case 4:
|
||||
__asm__ __volatile__(LOCK_PREFIX "cmpxchgl %k1,%2"
|
||||
: "=a"(prev)
|
||||
: "r"(new), "m"(*__xg(ptr)), "0"(old)
|
||||
: "memory");
|
||||
asm volatile(LOCK_PREFIX "cmpxchgl %k1,%2"
|
||||
: "=a"(prev)
|
||||
: "r"(new), "m"(*__xg(ptr)), "0"(old)
|
||||
: "memory");
|
||||
return prev;
|
||||
case 8:
|
||||
__asm__ __volatile__(LOCK_PREFIX "cmpxchgq %1,%2"
|
||||
: "=a"(prev)
|
||||
: "r"(new), "m"(*__xg(ptr)), "0"(old)
|
||||
: "memory");
|
||||
asm volatile(LOCK_PREFIX "cmpxchgq %1,%2"
|
||||
: "=a"(prev)
|
||||
: "r"(new), "m"(*__xg(ptr)), "0"(old)
|
||||
: "memory");
|
||||
return prev;
|
||||
}
|
||||
return old;
|
||||
}
|
||||
|
||||
static inline unsigned long __cmpxchg_local(volatile void *ptr,
|
||||
unsigned long old, unsigned long new, int size)
|
||||
unsigned long old,
|
||||
unsigned long new, int size)
|
||||
{
|
||||
unsigned long prev;
|
||||
switch (size) {
|
||||
case 1:
|
||||
__asm__ __volatile__("cmpxchgb %b1,%2"
|
||||
: "=a"(prev)
|
||||
: "q"(new), "m"(*__xg(ptr)), "0"(old)
|
||||
: "memory");
|
||||
asm volatile("cmpxchgb %b1,%2"
|
||||
: "=a"(prev)
|
||||
: "q"(new), "m"(*__xg(ptr)), "0"(old)
|
||||
: "memory");
|
||||
return prev;
|
||||
case 2:
|
||||
__asm__ __volatile__("cmpxchgw %w1,%2"
|
||||
: "=a"(prev)
|
||||
: "r"(new), "m"(*__xg(ptr)), "0"(old)
|
||||
: "memory");
|
||||
asm volatile("cmpxchgw %w1,%2"
|
||||
: "=a"(prev)
|
||||
: "r"(new), "m"(*__xg(ptr)), "0"(old)
|
||||
: "memory");
|
||||
return prev;
|
||||
case 4:
|
||||
__asm__ __volatile__("cmpxchgl %k1,%2"
|
||||
: "=a"(prev)
|
||||
: "r"(new), "m"(*__xg(ptr)), "0"(old)
|
||||
: "memory");
|
||||
asm volatile("cmpxchgl %k1,%2"
|
||||
: "=a"(prev)
|
||||
: "r"(new), "m"(*__xg(ptr)), "0"(old)
|
||||
: "memory");
|
||||
return prev;
|
||||
case 8:
|
||||
__asm__ __volatile__("cmpxchgq %1,%2"
|
||||
: "=a"(prev)
|
||||
: "r"(new), "m"(*__xg(ptr)), "0"(old)
|
||||
: "memory");
|
||||
asm volatile("cmpxchgq %1,%2"
|
||||
: "=a"(prev)
|
||||
: "r"(new), "m"(*__xg(ptr)), "0"(old)
|
||||
: "memory");
|
||||
return prev;
|
||||
}
|
||||
return old;
|
||||
@@ -126,19 +129,20 @@ static inline unsigned long __cmpxchg_local(volatile void *ptr,
|
||||
|
||||
#define cmpxchg(ptr, o, n) \
|
||||
((__typeof__(*(ptr)))__cmpxchg((ptr), (unsigned long)(o), \
|
||||
(unsigned long)(n), sizeof(*(ptr))))
|
||||
(unsigned long)(n), sizeof(*(ptr))))
|
||||
#define cmpxchg64(ptr, o, n) \
|
||||
({ \
|
||||
({ \
|
||||
BUILD_BUG_ON(sizeof(*(ptr)) != 8); \
|
||||
cmpxchg((ptr), (o), (n)); \
|
||||
})
|
||||
})
|
||||
#define cmpxchg_local(ptr, o, n) \
|
||||
((__typeof__(*(ptr)))__cmpxchg_local((ptr), (unsigned long)(o), \
|
||||
(unsigned long)(n), sizeof(*(ptr))))
|
||||
(unsigned long)(n), \
|
||||
sizeof(*(ptr))))
|
||||
#define cmpxchg64_local(ptr, o, n) \
|
||||
({ \
|
||||
({ \
|
||||
BUILD_BUG_ON(sizeof(*(ptr)) != 8); \
|
||||
cmpxchg_local((ptr), (o), (n)); \
|
||||
})
|
||||
})
|
||||
|
||||
#endif
|
||||
|
||||
@@ -204,7 +204,7 @@ static inline compat_uptr_t ptr_to_compat(void __user *uptr)
|
||||
return (u32)(unsigned long)uptr;
|
||||
}
|
||||
|
||||
static __inline__ void __user *compat_alloc_user_space(long len)
|
||||
static inline void __user *compat_alloc_user_space(long len)
|
||||
{
|
||||
struct pt_regs *regs = task_pt_regs(current);
|
||||
return (void __user *)regs->sp - len;
|
||||
|
||||
@@ -120,6 +120,9 @@
|
||||
extern const char * const x86_cap_flags[NCAPINTS*32];
|
||||
extern const char * const x86_power_flags[32];
|
||||
|
||||
#define test_cpu_cap(c, bit) \
|
||||
test_bit(bit, (unsigned long *)((c)->x86_capability))
|
||||
|
||||
#define cpu_has(c, bit) \
|
||||
(__builtin_constant_p(bit) && \
|
||||
( (((bit)>>5)==0 && (1UL<<((bit)&31) & REQUIRED_MASK0)) || \
|
||||
@@ -131,7 +134,8 @@ extern const char * const x86_power_flags[32];
|
||||
(((bit)>>5)==6 && (1UL<<((bit)&31) & REQUIRED_MASK6)) || \
|
||||
(((bit)>>5)==7 && (1UL<<((bit)&31) & REQUIRED_MASK7)) ) \
|
||||
? 1 : \
|
||||
test_bit(bit, (unsigned long *)((c)->x86_capability)))
|
||||
test_cpu_cap(c, bit))
|
||||
|
||||
#define boot_cpu_has(bit) cpu_has(&boot_cpu_data, bit)
|
||||
|
||||
#define set_cpu_cap(c, bit) set_bit(bit, (unsigned long *)((c)->x86_capability))
|
||||
@@ -181,6 +185,8 @@ extern const char * const x86_power_flags[32];
|
||||
#define cpu_has_clflush boot_cpu_has(X86_FEATURE_CLFLSH)
|
||||
#define cpu_has_bts boot_cpu_has(X86_FEATURE_BTS)
|
||||
#define cpu_has_gbpages boot_cpu_has(X86_FEATURE_GBPAGES)
|
||||
#define cpu_has_arch_perfmon boot_cpu_has(X86_FEATURE_ARCH_PERFMON)
|
||||
#define cpu_has_pat boot_cpu_has(X86_FEATURE_PAT)
|
||||
|
||||
#if defined(CONFIG_X86_INVLPG) || defined(CONFIG_X86_64)
|
||||
# define cpu_has_invlpg 1
|
||||
|
||||
@@ -11,7 +11,7 @@ static __always_inline struct task_struct *get_current(void)
|
||||
{
|
||||
return x86_read_percpu(current_task);
|
||||
}
|
||||
|
||||
|
||||
#define current get_current()
|
||||
|
||||
#endif /* !(_I386_CURRENT_H) */
|
||||
|
||||
@@ -1,23 +1,23 @@
|
||||
#ifndef _X86_64_CURRENT_H
|
||||
#define _X86_64_CURRENT_H
|
||||
|
||||
#if !defined(__ASSEMBLY__)
|
||||
#if !defined(__ASSEMBLY__)
|
||||
struct task_struct;
|
||||
|
||||
#include <asm/pda.h>
|
||||
|
||||
static inline struct task_struct *get_current(void)
|
||||
{
|
||||
struct task_struct *t = read_pda(pcurrent);
|
||||
static inline struct task_struct *get_current(void)
|
||||
{
|
||||
struct task_struct *t = read_pda(pcurrent);
|
||||
return t;
|
||||
}
|
||||
}
|
||||
|
||||
#define current get_current()
|
||||
|
||||
#else
|
||||
|
||||
#ifndef ASM_OFFSET_H
|
||||
#include <asm/asm-offsets.h>
|
||||
#include <asm/asm-offsets.h>
|
||||
#endif
|
||||
|
||||
#define GET_CURRENT(reg) movq %gs:(pda_pcurrent),reg
|
||||
|
||||
+31
-30
@@ -62,8 +62,8 @@ static inline struct desc_struct *get_cpu_gdt_table(unsigned int cpu)
|
||||
}
|
||||
|
||||
static inline void pack_gate(gate_desc *gate, unsigned char type,
|
||||
unsigned long base, unsigned dpl, unsigned flags, unsigned short seg)
|
||||
|
||||
unsigned long base, unsigned dpl, unsigned flags,
|
||||
unsigned short seg)
|
||||
{
|
||||
gate->a = (seg << 16) | (base & 0xffff);
|
||||
gate->b = (base & 0xffff0000) |
|
||||
@@ -84,22 +84,23 @@ static inline int desc_empty(const void *ptr)
|
||||
#define load_TR_desc() native_load_tr_desc()
|
||||
#define load_gdt(dtr) native_load_gdt(dtr)
|
||||
#define load_idt(dtr) native_load_idt(dtr)
|
||||
#define load_tr(tr) __asm__ __volatile("ltr %0"::"m" (tr))
|
||||
#define load_ldt(ldt) __asm__ __volatile("lldt %0"::"m" (ldt))
|
||||
#define load_tr(tr) asm volatile("ltr %0"::"m" (tr))
|
||||
#define load_ldt(ldt) asm volatile("lldt %0"::"m" (ldt))
|
||||
|
||||
#define store_gdt(dtr) native_store_gdt(dtr)
|
||||
#define store_idt(dtr) native_store_idt(dtr)
|
||||
#define store_tr(tr) (tr = native_store_tr())
|
||||
#define store_ldt(ldt) __asm__ ("sldt %0":"=m" (ldt))
|
||||
#define store_ldt(ldt) asm("sldt %0":"=m" (ldt))
|
||||
|
||||
#define load_TLS(t, cpu) native_load_tls(t, cpu)
|
||||
#define set_ldt native_set_ldt
|
||||
|
||||
#define write_ldt_entry(dt, entry, desc) \
|
||||
native_write_ldt_entry(dt, entry, desc)
|
||||
#define write_gdt_entry(dt, entry, desc, type) \
|
||||
native_write_gdt_entry(dt, entry, desc, type)
|
||||
#define write_idt_entry(dt, entry, g) native_write_idt_entry(dt, entry, g)
|
||||
#define write_ldt_entry(dt, entry, desc) \
|
||||
native_write_ldt_entry(dt, entry, desc)
|
||||
#define write_gdt_entry(dt, entry, desc, type) \
|
||||
native_write_gdt_entry(dt, entry, desc, type)
|
||||
#define write_idt_entry(dt, entry, g) \
|
||||
native_write_idt_entry(dt, entry, g)
|
||||
#endif
|
||||
|
||||
static inline void native_write_idt_entry(gate_desc *idt, int entry,
|
||||
@@ -138,8 +139,8 @@ static inline void pack_descriptor(struct desc_struct *desc, unsigned long base,
|
||||
{
|
||||
desc->a = ((base & 0xffff) << 16) | (limit & 0xffff);
|
||||
desc->b = (base & 0xff000000) | ((base & 0xff0000) >> 16) |
|
||||
(limit & 0x000f0000) | ((type & 0xff) << 8) |
|
||||
((flags & 0xf) << 20);
|
||||
(limit & 0x000f0000) | ((type & 0xff) << 8) |
|
||||
((flags & 0xf) << 20);
|
||||
desc->p = 1;
|
||||
}
|
||||
|
||||
@@ -159,7 +160,6 @@ static inline void set_tssldt_descriptor(void *d, unsigned long addr,
|
||||
desc->base2 = (PTR_MIDDLE(addr) >> 8) & 0xFF;
|
||||
desc->base3 = PTR_HIGH(addr);
|
||||
#else
|
||||
|
||||
pack_descriptor((struct desc_struct *)d, addr, size, 0x80 | type, 0);
|
||||
#endif
|
||||
}
|
||||
@@ -177,7 +177,8 @@ static inline void __set_tss_desc(unsigned cpu, unsigned int entry, void *addr)
|
||||
* last valid byte
|
||||
*/
|
||||
set_tssldt_descriptor(&tss, (unsigned long)addr, DESC_TSS,
|
||||
IO_BITMAP_OFFSET + IO_BITMAP_BYTES + sizeof(unsigned long) - 1);
|
||||
IO_BITMAP_OFFSET + IO_BITMAP_BYTES +
|
||||
sizeof(unsigned long) - 1);
|
||||
write_gdt_entry(d, entry, &tss, DESC_TSS);
|
||||
}
|
||||
|
||||
@@ -186,7 +187,7 @@ static inline void __set_tss_desc(unsigned cpu, unsigned int entry, void *addr)
|
||||
static inline void native_set_ldt(const void *addr, unsigned int entries)
|
||||
{
|
||||
if (likely(entries == 0))
|
||||
__asm__ __volatile__("lldt %w0"::"q" (0));
|
||||
asm volatile("lldt %w0"::"q" (0));
|
||||
else {
|
||||
unsigned cpu = smp_processor_id();
|
||||
ldt_desc ldt;
|
||||
@@ -195,7 +196,7 @@ static inline void native_set_ldt(const void *addr, unsigned int entries)
|
||||
DESC_LDT, entries * sizeof(ldt) - 1);
|
||||
write_gdt_entry(get_cpu_gdt_table(cpu), GDT_ENTRY_LDT,
|
||||
&ldt, DESC_LDT);
|
||||
__asm__ __volatile__("lldt %w0"::"q" (GDT_ENTRY_LDT*8));
|
||||
asm volatile("lldt %w0"::"q" (GDT_ENTRY_LDT*8));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -240,15 +241,15 @@ static inline void native_load_tls(struct thread_struct *t, unsigned int cpu)
|
||||
gdt[GDT_ENTRY_TLS_MIN + i] = t->tls_array[i];
|
||||
}
|
||||
|
||||
#define _LDT_empty(info) (\
|
||||
(info)->base_addr == 0 && \
|
||||
(info)->limit == 0 && \
|
||||
(info)->contents == 0 && \
|
||||
(info)->read_exec_only == 1 && \
|
||||
(info)->seg_32bit == 0 && \
|
||||
(info)->limit_in_pages == 0 && \
|
||||
(info)->seg_not_present == 1 && \
|
||||
(info)->useable == 0)
|
||||
#define _LDT_empty(info) \
|
||||
((info)->base_addr == 0 && \
|
||||
(info)->limit == 0 && \
|
||||
(info)->contents == 0 && \
|
||||
(info)->read_exec_only == 1 && \
|
||||
(info)->seg_32bit == 0 && \
|
||||
(info)->limit_in_pages == 0 && \
|
||||
(info)->seg_not_present == 1 && \
|
||||
(info)->useable == 0)
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
#define LDT_empty(info) (_LDT_empty(info) && ((info)->lm == 0))
|
||||
@@ -287,7 +288,7 @@ static inline unsigned long get_desc_limit(const struct desc_struct *desc)
|
||||
}
|
||||
|
||||
static inline void _set_gate(int gate, unsigned type, void *addr,
|
||||
unsigned dpl, unsigned ist, unsigned seg)
|
||||
unsigned dpl, unsigned ist, unsigned seg)
|
||||
{
|
||||
gate_desc s;
|
||||
pack_gate(&s, type, (unsigned long)addr, dpl, ist, seg);
|
||||
@@ -370,10 +371,10 @@ static inline void set_system_gate_ist(int n, void *addr, unsigned ist)
|
||||
* Will read the base address of GDT_ENTRY_ESPFIX_SS and put it into %eax.
|
||||
*/
|
||||
#define GET_DESC_BASE(idx, gdt, base, lo_w, lo_b, hi_b) \
|
||||
movb idx*8+4(gdt), lo_b; \
|
||||
movb idx*8+7(gdt), hi_b; \
|
||||
shll $16, base; \
|
||||
movw idx*8+2(gdt), lo_w;
|
||||
movb idx * 8 + 4(gdt), lo_b; \
|
||||
movb idx * 8 + 7(gdt), hi_b; \
|
||||
shll $16, base; \
|
||||
movw idx * 8 + 2(gdt), lo_w;
|
||||
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
@@ -18,17 +18,19 @@
|
||||
* incrementally. We keep the signature as a struct, rather than an union,
|
||||
* so we can get rid of it transparently in the future -- glommer
|
||||
*/
|
||||
// 8 byte segment descriptor
|
||||
/* 8 byte segment descriptor */
|
||||
struct desc_struct {
|
||||
union {
|
||||
struct { unsigned int a, b; };
|
||||
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;
|
||||
};
|
||||
|
||||
};
|
||||
} __attribute__((packed));
|
||||
|
||||
@@ -39,7 +41,7 @@ enum {
|
||||
GATE_TASK = 0x5,
|
||||
};
|
||||
|
||||
// 16byte gate
|
||||
/* 16byte gate */
|
||||
struct gate_struct64 {
|
||||
u16 offset_low;
|
||||
u16 segment;
|
||||
@@ -56,10 +58,10 @@ struct gate_struct64 {
|
||||
enum {
|
||||
DESC_TSS = 0x9,
|
||||
DESC_LDT = 0x2,
|
||||
DESCTYPE_S = 0x10, /* !system */
|
||||
DESCTYPE_S = 0x10, /* !system */
|
||||
};
|
||||
|
||||
// LDT or TSS descriptor in the GDT. 16 bytes.
|
||||
/* LDT or TSS descriptor in the GDT. 16 bytes. */
|
||||
struct ldttss_desc64 {
|
||||
u16 limit0;
|
||||
u16 base0;
|
||||
@@ -84,7 +86,6 @@ struct desc_ptr {
|
||||
unsigned long address;
|
||||
} __attribute__((packed)) ;
|
||||
|
||||
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
|
||||
#endif
|
||||
|
||||
+18
-17
@@ -17,18 +17,20 @@
|
||||
* This ends up being the most efficient "calling
|
||||
* convention" on x86.
|
||||
*/
|
||||
#define do_div(n,base) ({ \
|
||||
unsigned long __upper, __low, __high, __mod, __base; \
|
||||
__base = (base); \
|
||||
asm("":"=a" (__low), "=d" (__high):"A" (n)); \
|
||||
__upper = __high; \
|
||||
if (__high) { \
|
||||
__upper = __high % (__base); \
|
||||
__high = __high / (__base); \
|
||||
} \
|
||||
asm("divl %2":"=a" (__low), "=d" (__mod):"rm" (__base), "0" (__low), "1" (__upper)); \
|
||||
asm("":"=A" (n):"a" (__low),"d" (__high)); \
|
||||
__mod; \
|
||||
#define do_div(n, base) \
|
||||
({ \
|
||||
unsigned long __upper, __low, __high, __mod, __base; \
|
||||
__base = (base); \
|
||||
asm("":"=a" (__low), "=d" (__high) : "A" (n)); \
|
||||
__upper = __high; \
|
||||
if (__high) { \
|
||||
__upper = __high % (__base); \
|
||||
__high = __high / (__base); \
|
||||
} \
|
||||
asm("divl %2":"=a" (__low), "=d" (__mod) \
|
||||
: "rm" (__base), "0" (__low), "1" (__upper)); \
|
||||
asm("":"=A" (n) : "a" (__low), "d" (__high)); \
|
||||
__mod; \
|
||||
})
|
||||
|
||||
/*
|
||||
@@ -37,14 +39,13 @@
|
||||
*
|
||||
* Warning, this will do an exception if X overflows.
|
||||
*/
|
||||
#define div_long_long_rem(a,b,c) div_ll_X_l_rem(a,b,c)
|
||||
#define div_long_long_rem(a, b, c) div_ll_X_l_rem(a, b, c)
|
||||
|
||||
static inline long
|
||||
div_ll_X_l_rem(long long divs, long div, long *rem)
|
||||
static inline long div_ll_X_l_rem(long long divs, long div, long *rem)
|
||||
{
|
||||
long dum2;
|
||||
__asm__("divl %2":"=a"(dum2), "=d"(*rem)
|
||||
: "rm"(div), "A"(divs));
|
||||
asm("divl %2":"=a"(dum2), "=d"(*rem)
|
||||
: "rm"(div), "A"(divs));
|
||||
|
||||
return dum2;
|
||||
|
||||
|
||||
+22
-23
@@ -12,7 +12,6 @@
|
||||
#include <asm/io.h> /* need byte IO */
|
||||
#include <linux/delay.h>
|
||||
|
||||
|
||||
#ifdef HAVE_REALLY_SLOW_DMA_CONTROLLER
|
||||
#define dma_outb outb_p
|
||||
#else
|
||||
@@ -74,15 +73,15 @@
|
||||
#ifdef CONFIG_X86_32
|
||||
|
||||
/* The maximum address that we can perform a DMA transfer to on this platform */
|
||||
#define MAX_DMA_ADDRESS (PAGE_OFFSET+0x1000000)
|
||||
#define MAX_DMA_ADDRESS (PAGE_OFFSET + 0x1000000)
|
||||
|
||||
#else
|
||||
|
||||
/* 16MB ISA DMA zone */
|
||||
#define MAX_DMA_PFN ((16*1024*1024) >> PAGE_SHIFT)
|
||||
#define MAX_DMA_PFN ((16 * 1024 * 1024) >> PAGE_SHIFT)
|
||||
|
||||
/* 4GB broken PCI/AGP hardware bus master zone */
|
||||
#define MAX_DMA32_PFN ((4UL*1024*1024*1024) >> PAGE_SHIFT)
|
||||
#define MAX_DMA32_PFN ((4UL * 1024 * 1024 * 1024) >> PAGE_SHIFT)
|
||||
|
||||
/* Compat define for old dma zone */
|
||||
#define MAX_DMA_ADDRESS ((unsigned long)__va(MAX_DMA_PFN << PAGE_SHIFT))
|
||||
@@ -154,20 +153,20 @@
|
||||
|
||||
extern spinlock_t dma_spin_lock;
|
||||
|
||||
static __inline__ unsigned long claim_dma_lock(void)
|
||||
static inline unsigned long claim_dma_lock(void)
|
||||
{
|
||||
unsigned long flags;
|
||||
spin_lock_irqsave(&dma_spin_lock, flags);
|
||||
return flags;
|
||||
}
|
||||
|
||||
static __inline__ void release_dma_lock(unsigned long flags)
|
||||
static inline void release_dma_lock(unsigned long flags)
|
||||
{
|
||||
spin_unlock_irqrestore(&dma_spin_lock, flags);
|
||||
}
|
||||
|
||||
/* enable/disable a specific DMA channel */
|
||||
static __inline__ void enable_dma(unsigned int dmanr)
|
||||
static inline void enable_dma(unsigned int dmanr)
|
||||
{
|
||||
if (dmanr <= 3)
|
||||
dma_outb(dmanr, DMA1_MASK_REG);
|
||||
@@ -175,7 +174,7 @@ static __inline__ void enable_dma(unsigned int dmanr)
|
||||
dma_outb(dmanr & 3, DMA2_MASK_REG);
|
||||
}
|
||||
|
||||
static __inline__ void disable_dma(unsigned int dmanr)
|
||||
static inline void disable_dma(unsigned int dmanr)
|
||||
{
|
||||
if (dmanr <= 3)
|
||||
dma_outb(dmanr | 4, DMA1_MASK_REG);
|
||||
@@ -190,7 +189,7 @@ static __inline__ void disable_dma(unsigned int dmanr)
|
||||
* --- In order to do that, the DMA routines below should ---
|
||||
* --- only be used while holding the DMA lock ! ---
|
||||
*/
|
||||
static __inline__ void clear_dma_ff(unsigned int dmanr)
|
||||
static inline void clear_dma_ff(unsigned int dmanr)
|
||||
{
|
||||
if (dmanr <= 3)
|
||||
dma_outb(0, DMA1_CLEAR_FF_REG);
|
||||
@@ -199,7 +198,7 @@ static __inline__ void clear_dma_ff(unsigned int dmanr)
|
||||
}
|
||||
|
||||
/* set mode (above) for a specific DMA channel */
|
||||
static __inline__ void set_dma_mode(unsigned int dmanr, char mode)
|
||||
static inline void set_dma_mode(unsigned int dmanr, char mode)
|
||||
{
|
||||
if (dmanr <= 3)
|
||||
dma_outb(mode | dmanr, DMA1_MODE_REG);
|
||||
@@ -212,7 +211,7 @@ static __inline__ void set_dma_mode(unsigned int dmanr, char mode)
|
||||
* the lower 16 bits of the DMA current address register, but a 64k boundary
|
||||
* may have been crossed.
|
||||
*/
|
||||
static __inline__ void set_dma_page(unsigned int dmanr, char pagenr)
|
||||
static inline void set_dma_page(unsigned int dmanr, char pagenr)
|
||||
{
|
||||
switch (dmanr) {
|
||||
case 0:
|
||||
@@ -243,15 +242,15 @@ static __inline__ void set_dma_page(unsigned int dmanr, char pagenr)
|
||||
/* Set transfer address & page bits for specific DMA channel.
|
||||
* Assumes dma flipflop is clear.
|
||||
*/
|
||||
static __inline__ void set_dma_addr(unsigned int dmanr, unsigned int a)
|
||||
static inline void set_dma_addr(unsigned int dmanr, unsigned int a)
|
||||
{
|
||||
set_dma_page(dmanr, a>>16);
|
||||
if (dmanr <= 3) {
|
||||
dma_outb(a & 0xff, ((dmanr & 3) << 1) + IO_DMA1_BASE);
|
||||
dma_outb((a >> 8) & 0xff, ((dmanr & 3) << 1) + IO_DMA1_BASE);
|
||||
} else {
|
||||
dma_outb((a >> 1) & 0xff, ((dmanr & 3) << 2) + IO_DMA2_BASE);
|
||||
dma_outb((a >> 9) & 0xff, ((dmanr & 3) << 2) + IO_DMA2_BASE);
|
||||
dma_outb((a >> 1) & 0xff, ((dmanr & 3) << 2) + IO_DMA2_BASE);
|
||||
dma_outb((a >> 9) & 0xff, ((dmanr & 3) << 2) + IO_DMA2_BASE);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -264,18 +263,18 @@ static __inline__ void set_dma_addr(unsigned int dmanr, unsigned int a)
|
||||
* Assumes dma flip-flop is clear.
|
||||
* NOTE 2: "count" represents _bytes_ and must be even for channels 5-7.
|
||||
*/
|
||||
static __inline__ void set_dma_count(unsigned int dmanr, unsigned int count)
|
||||
static inline void set_dma_count(unsigned int dmanr, unsigned int count)
|
||||
{
|
||||
count--;
|
||||
if (dmanr <= 3) {
|
||||
dma_outb(count & 0xff, ((dmanr & 3) << 1) + 1 + IO_DMA1_BASE);
|
||||
dma_outb((count >> 8) & 0xff,
|
||||
((dmanr & 3) << 1) + 1 + IO_DMA1_BASE);
|
||||
dma_outb(count & 0xff, ((dmanr & 3) << 1) + 1 + IO_DMA1_BASE);
|
||||
dma_outb((count >> 8) & 0xff,
|
||||
((dmanr & 3) << 1) + 1 + IO_DMA1_BASE);
|
||||
} else {
|
||||
dma_outb((count >> 1) & 0xff,
|
||||
((dmanr & 3) << 2) + 2 + IO_DMA2_BASE);
|
||||
dma_outb((count >> 9) & 0xff,
|
||||
((dmanr & 3) << 2) + 2 + IO_DMA2_BASE);
|
||||
dma_outb((count >> 1) & 0xff,
|
||||
((dmanr & 3) << 2) + 2 + IO_DMA2_BASE);
|
||||
dma_outb((count >> 9) & 0xff,
|
||||
((dmanr & 3) << 2) + 2 + IO_DMA2_BASE);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -288,7 +287,7 @@ static __inline__ void set_dma_count(unsigned int dmanr, unsigned int count)
|
||||
*
|
||||
* Assumes DMA flip-flop is clear.
|
||||
*/
|
||||
static __inline__ int get_dma_residue(unsigned int dmanr)
|
||||
static inline int get_dma_residue(unsigned int dmanr)
|
||||
{
|
||||
unsigned int io_port;
|
||||
/* using short to get 16-bit wrap around */
|
||||
|
||||
@@ -1,16 +1,15 @@
|
||||
#ifndef _DWARF2_H
|
||||
#define _DWARF2_H 1
|
||||
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#warning "asm/dwarf2.h should be only included in pure assembly files"
|
||||
#endif
|
||||
|
||||
/*
|
||||
/*
|
||||
Macros for dwarf2 CFI unwind table entries.
|
||||
See "as.info" for details on these pseudo ops. Unfortunately
|
||||
they are only supported in very new binutils, so define them
|
||||
away for older version.
|
||||
See "as.info" for details on these pseudo ops. Unfortunately
|
||||
they are only supported in very new binutils, so define them
|
||||
away for older version.
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_AS_CFI
|
||||
|
||||
@@ -34,8 +34,8 @@ extern void e820_register_memory(void);
|
||||
extern void limit_regions(unsigned long long size);
|
||||
extern void print_memory_map(char *who);
|
||||
extern void init_iomem_resources(struct resource *code_resource,
|
||||
struct resource *data_resource,
|
||||
struct resource *bss_resource);
|
||||
struct resource *data_resource,
|
||||
struct resource *bss_resource);
|
||||
|
||||
#if defined(CONFIG_PM) && defined(CONFIG_HIBERNATION)
|
||||
extern void e820_mark_nosave_regions(void);
|
||||
|
||||
+14
-10
@@ -14,20 +14,24 @@
|
||||
#include <linux/ioport.h>
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
extern unsigned long find_e820_area(unsigned long start, unsigned long end,
|
||||
unsigned size, unsigned long align);
|
||||
extern void add_memory_region(unsigned long start, unsigned long size,
|
||||
extern unsigned long find_e820_area(unsigned long start, unsigned long end,
|
||||
unsigned long size, unsigned long align);
|
||||
extern unsigned long find_e820_area_size(unsigned long start,
|
||||
unsigned long *sizep,
|
||||
unsigned long align);
|
||||
extern void add_memory_region(unsigned long start, unsigned long size,
|
||||
int type);
|
||||
extern void update_memory_range(u64 start, u64 size, unsigned old_type,
|
||||
unsigned new_type);
|
||||
extern void setup_memory_region(void);
|
||||
extern void contig_e820_setup(void);
|
||||
extern void contig_e820_setup(void);
|
||||
extern unsigned long e820_end_of_ram(void);
|
||||
extern void e820_reserve_resources(struct resource *code_resource,
|
||||
struct resource *data_resource, struct resource *bss_resource);
|
||||
extern void e820_reserve_resources(void);
|
||||
extern void e820_mark_nosave_regions(void);
|
||||
extern int e820_any_mapped(unsigned long start, unsigned long end, unsigned type);
|
||||
extern int e820_all_mapped(unsigned long start, unsigned long end, unsigned type);
|
||||
extern int e820_any_mapped(unsigned long start, unsigned long end,
|
||||
unsigned type);
|
||||
extern int e820_all_mapped(unsigned long start, unsigned long end,
|
||||
unsigned type);
|
||||
extern int e820_any_non_reserved(unsigned long start, unsigned long end);
|
||||
extern int is_memory_any_valid(unsigned long start, unsigned long end);
|
||||
extern int e820_all_non_reserved(unsigned long start, unsigned long end);
|
||||
@@ -35,8 +39,8 @@ extern int is_memory_all_valid(unsigned long start, unsigned long end);
|
||||
extern unsigned long e820_hole_size(unsigned long start, unsigned long end);
|
||||
|
||||
extern void e820_setup_gap(void);
|
||||
extern void e820_register_active_regions(int nid,
|
||||
unsigned long start_pfn, unsigned long end_pfn);
|
||||
extern void e820_register_active_regions(int nid, unsigned long start_pfn,
|
||||
unsigned long end_pfn);
|
||||
|
||||
extern void finish_e820_parsing(void);
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
/* ECC atomic, DMA, SMP and interrupt safe scrub function */
|
||||
|
||||
static __inline__ void atomic_scrub(void *va, u32 size)
|
||||
static inline void atomic_scrub(void *va, u32 size)
|
||||
{
|
||||
u32 i, *virt_addr = va;
|
||||
|
||||
@@ -12,7 +12,7 @@ static __inline__ void atomic_scrub(void *va, u32 size)
|
||||
* are interrupt, DMA and SMP safe.
|
||||
*/
|
||||
for (i = 0; i < size / 4; i++, virt_addr++)
|
||||
__asm__ __volatile__("lock; addl $0, %0"::"m"(*virt_addr));
|
||||
asm volatile("lock; addl $0, %0"::"m" (*virt_addr));
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -20,7 +20,7 @@ extern unsigned long asmlinkage efi_call_phys(void *, ...);
|
||||
*/
|
||||
|
||||
#define efi_call_virt(f, args...) \
|
||||
((efi_##f##_t __attribute__((regparm(0)))*)efi.systab->runtime->f)(args)
|
||||
((efi_##f##_t __attribute__((regparm(0)))*)efi.systab->runtime->f)(args)
|
||||
|
||||
#define efi_call_virt0(f) efi_call_virt(f)
|
||||
#define efi_call_virt1(f, a1) efi_call_virt(f, a1)
|
||||
|
||||
+62
-50
@@ -11,7 +11,7 @@
|
||||
|
||||
typedef unsigned long elf_greg_t;
|
||||
|
||||
#define ELF_NGREG (sizeof (struct user_regs_struct) / sizeof(elf_greg_t))
|
||||
#define ELF_NGREG (sizeof(struct user_regs_struct) / sizeof(elf_greg_t))
|
||||
typedef elf_greg_t elf_gregset_t[ELF_NGREG];
|
||||
|
||||
typedef struct user_i387_struct elf_fpregset_t;
|
||||
@@ -82,8 +82,9 @@ extern unsigned int vdso_enabled;
|
||||
#define elf_check_arch_ia32(x) \
|
||||
(((x)->e_machine == EM_386) || ((x)->e_machine == EM_486))
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
#include <asm/processor.h>
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
#include <asm/system.h> /* for savesegment */
|
||||
#include <asm/desc.h>
|
||||
|
||||
@@ -99,10 +100,11 @@ extern unsigned int vdso_enabled;
|
||||
We might as well make sure everything else is cleared too (except for %esp),
|
||||
just to make things more deterministic.
|
||||
*/
|
||||
#define ELF_PLAT_INIT(_r, load_addr) do { \
|
||||
_r->bx = 0; _r->cx = 0; _r->dx = 0; \
|
||||
_r->si = 0; _r->di = 0; _r->bp = 0; \
|
||||
_r->ax = 0; \
|
||||
#define ELF_PLAT_INIT(_r, load_addr) \
|
||||
do { \
|
||||
_r->bx = 0; _r->cx = 0; _r->dx = 0; \
|
||||
_r->si = 0; _r->di = 0; _r->bp = 0; \
|
||||
_r->ax = 0; \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
@@ -110,24 +112,25 @@ extern unsigned int vdso_enabled;
|
||||
* now struct_user_regs, they are different)
|
||||
*/
|
||||
|
||||
#define ELF_CORE_COPY_REGS(pr_reg, regs) do { \
|
||||
pr_reg[0] = regs->bx; \
|
||||
pr_reg[1] = regs->cx; \
|
||||
pr_reg[2] = regs->dx; \
|
||||
pr_reg[3] = regs->si; \
|
||||
pr_reg[4] = regs->di; \
|
||||
pr_reg[5] = regs->bp; \
|
||||
pr_reg[6] = regs->ax; \
|
||||
pr_reg[7] = regs->ds & 0xffff; \
|
||||
pr_reg[8] = regs->es & 0xffff; \
|
||||
pr_reg[9] = regs->fs & 0xffff; \
|
||||
savesegment(gs, pr_reg[10]); \
|
||||
pr_reg[11] = regs->orig_ax; \
|
||||
pr_reg[12] = regs->ip; \
|
||||
pr_reg[13] = regs->cs & 0xffff; \
|
||||
pr_reg[14] = regs->flags; \
|
||||
pr_reg[15] = regs->sp; \
|
||||
pr_reg[16] = regs->ss & 0xffff; \
|
||||
#define ELF_CORE_COPY_REGS(pr_reg, regs) \
|
||||
do { \
|
||||
pr_reg[0] = regs->bx; \
|
||||
pr_reg[1] = regs->cx; \
|
||||
pr_reg[2] = regs->dx; \
|
||||
pr_reg[3] = regs->si; \
|
||||
pr_reg[4] = regs->di; \
|
||||
pr_reg[5] = regs->bp; \
|
||||
pr_reg[6] = regs->ax; \
|
||||
pr_reg[7] = regs->ds & 0xffff; \
|
||||
pr_reg[8] = regs->es & 0xffff; \
|
||||
pr_reg[9] = regs->fs & 0xffff; \
|
||||
savesegment(gs, pr_reg[10]); \
|
||||
pr_reg[11] = regs->orig_ax; \
|
||||
pr_reg[12] = regs->ip; \
|
||||
pr_reg[13] = regs->cs & 0xffff; \
|
||||
pr_reg[14] = regs->flags; \
|
||||
pr_reg[15] = regs->sp; \
|
||||
pr_reg[16] = regs->ss & 0xffff; \
|
||||
} while (0);
|
||||
|
||||
#define ELF_PLATFORM (utsname()->machine)
|
||||
@@ -135,12 +138,10 @@ extern unsigned int vdso_enabled;
|
||||
|
||||
#else /* CONFIG_X86_32 */
|
||||
|
||||
#include <asm/processor.h>
|
||||
|
||||
/*
|
||||
* This is used to ensure we don't load something for the wrong architecture.
|
||||
*/
|
||||
#define elf_check_arch(x) \
|
||||
#define elf_check_arch(x) \
|
||||
((x)->e_machine == EM_X86_64)
|
||||
|
||||
#define compat_elf_check_arch(x) elf_check_arch_ia32(x)
|
||||
@@ -169,24 +170,30 @@ static inline void elf_common_init(struct thread_struct *t,
|
||||
t->ds = t->es = ds;
|
||||
}
|
||||
|
||||
#define ELF_PLAT_INIT(_r, load_addr) do { \
|
||||
elf_common_init(¤t->thread, _r, 0); \
|
||||
clear_thread_flag(TIF_IA32); \
|
||||
#define ELF_PLAT_INIT(_r, load_addr) \
|
||||
do { \
|
||||
elf_common_init(¤t->thread, _r, 0); \
|
||||
clear_thread_flag(TIF_IA32); \
|
||||
} while (0)
|
||||
|
||||
#define COMPAT_ELF_PLAT_INIT(regs, load_addr) \
|
||||
#define COMPAT_ELF_PLAT_INIT(regs, load_addr) \
|
||||
elf_common_init(¤t->thread, regs, __USER_DS)
|
||||
#define compat_start_thread(regs, ip, sp) do { \
|
||||
start_ia32_thread(regs, ip, sp); \
|
||||
set_fs(USER_DS); \
|
||||
} while (0)
|
||||
#define COMPAT_SET_PERSONALITY(ex, ibcs2) do { \
|
||||
if (test_thread_flag(TIF_IA32)) \
|
||||
clear_thread_flag(TIF_ABI_PENDING); \
|
||||
else \
|
||||
set_thread_flag(TIF_ABI_PENDING); \
|
||||
current->personality |= force_personality32; \
|
||||
} while (0)
|
||||
|
||||
#define compat_start_thread(regs, ip, sp) \
|
||||
do { \
|
||||
start_ia32_thread(regs, ip, sp); \
|
||||
set_fs(USER_DS); \
|
||||
} while (0)
|
||||
|
||||
#define COMPAT_SET_PERSONALITY(ex, ibcs2) \
|
||||
do { \
|
||||
if (test_thread_flag(TIF_IA32)) \
|
||||
clear_thread_flag(TIF_ABI_PENDING); \
|
||||
else \
|
||||
set_thread_flag(TIF_ABI_PENDING); \
|
||||
current->personality |= force_personality32; \
|
||||
} while (0)
|
||||
|
||||
#define COMPAT_ELF_PLATFORM ("i686")
|
||||
|
||||
/*
|
||||
@@ -195,7 +202,8 @@ static inline void elf_common_init(struct thread_struct *t,
|
||||
* getting dumped.
|
||||
*/
|
||||
|
||||
#define ELF_CORE_COPY_REGS(pr_reg, regs) do { \
|
||||
#define ELF_CORE_COPY_REGS(pr_reg, regs) \
|
||||
do { \
|
||||
unsigned v; \
|
||||
(pr_reg)[0] = (regs)->r15; \
|
||||
(pr_reg)[1] = (regs)->r14; \
|
||||
@@ -269,10 +277,12 @@ extern int force_personality32;
|
||||
|
||||
struct task_struct;
|
||||
|
||||
#define ARCH_DLINFO_IA32(vdso_enabled) \
|
||||
do if (vdso_enabled) { \
|
||||
#define ARCH_DLINFO_IA32(vdso_enabled) \
|
||||
do { \
|
||||
if (vdso_enabled) { \
|
||||
NEW_AUX_ENT(AT_SYSINFO, VDSO_ENTRY); \
|
||||
NEW_AUX_ENT(AT_SYSINFO_EHDR, VDSO_CURRENT_BASE); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
@@ -290,9 +300,11 @@ do if (vdso_enabled) { \
|
||||
/* 1GB for 64bit, 8MB for 32bit */
|
||||
#define STACK_RND_MASK (test_thread_flag(TIF_IA32) ? 0x7ff : 0x3fffff)
|
||||
|
||||
#define ARCH_DLINFO \
|
||||
do if (vdso_enabled) { \
|
||||
NEW_AUX_ENT(AT_SYSINFO_EHDR,(unsigned long)current->mm->context.vdso);\
|
||||
#define ARCH_DLINFO \
|
||||
do { \
|
||||
if (vdso_enabled) \
|
||||
NEW_AUX_ENT(AT_SYSINFO_EHDR, \
|
||||
(unsigned long)current->mm->context.vdso); \
|
||||
} while (0)
|
||||
|
||||
#define AT_SYSINFO 32
|
||||
@@ -305,8 +317,8 @@ do if (vdso_enabled) { \
|
||||
|
||||
#define VDSO_CURRENT_BASE ((unsigned long)current->mm->context.vdso)
|
||||
|
||||
#define VDSO_ENTRY \
|
||||
((unsigned long) VDSO32_SYMBOL(VDSO_CURRENT_BASE, vsyscall))
|
||||
#define VDSO_ENTRY \
|
||||
((unsigned long)VDSO32_SYMBOL(VDSO_CURRENT_BASE, vsyscall))
|
||||
|
||||
struct linux_binprm;
|
||||
|
||||
|
||||
+10
-11
@@ -99,8 +99,7 @@ enum fixed_addresses {
|
||||
*/
|
||||
#define NR_FIX_BTMAPS 64
|
||||
#define FIX_BTMAPS_NESTING 4
|
||||
FIX_BTMAP_END =
|
||||
__end_of_permanent_fixed_addresses + 512 -
|
||||
FIX_BTMAP_END = __end_of_permanent_fixed_addresses + 512 -
|
||||
(__end_of_permanent_fixed_addresses & 511),
|
||||
FIX_BTMAP_BEGIN = FIX_BTMAP_END + NR_FIX_BTMAPS*FIX_BTMAPS_NESTING - 1,
|
||||
FIX_WP_TEST,
|
||||
@@ -110,20 +109,20 @@ enum fixed_addresses {
|
||||
__end_of_fixed_addresses
|
||||
};
|
||||
|
||||
extern void __set_fixmap (enum fixed_addresses idx,
|
||||
unsigned long phys, pgprot_t flags);
|
||||
extern void __set_fixmap(enum fixed_addresses idx,
|
||||
unsigned long phys, pgprot_t flags);
|
||||
extern void reserve_top_address(unsigned long reserve);
|
||||
|
||||
#define set_fixmap(idx, phys) \
|
||||
__set_fixmap(idx, phys, PAGE_KERNEL)
|
||||
#define set_fixmap(idx, phys) \
|
||||
__set_fixmap(idx, phys, PAGE_KERNEL)
|
||||
/*
|
||||
* Some hardware wants to get fixmapped without caching.
|
||||
*/
|
||||
#define set_fixmap_nocache(idx, phys) \
|
||||
__set_fixmap(idx, phys, PAGE_KERNEL_NOCACHE)
|
||||
#define set_fixmap_nocache(idx, phys) \
|
||||
__set_fixmap(idx, phys, PAGE_KERNEL_NOCACHE)
|
||||
|
||||
#define clear_fixmap(idx) \
|
||||
__set_fixmap(idx, 0, __pgprot(0))
|
||||
#define clear_fixmap(idx) \
|
||||
__set_fixmap(idx, 0, __pgprot(0))
|
||||
|
||||
#define FIXADDR_TOP ((unsigned long)__FIXADDR_TOP)
|
||||
|
||||
@@ -156,7 +155,7 @@ static __always_inline unsigned long fix_to_virt(const unsigned int idx)
|
||||
if (idx >= __end_of_fixed_addresses)
|
||||
__this_fixmap_does_not_exist();
|
||||
|
||||
return __fix_to_virt(idx);
|
||||
return __fix_to_virt(idx);
|
||||
}
|
||||
|
||||
static inline unsigned long virt_to_fix(const unsigned long vaddr)
|
||||
|
||||
@@ -34,32 +34,34 @@
|
||||
|
||||
enum fixed_addresses {
|
||||
VSYSCALL_LAST_PAGE,
|
||||
VSYSCALL_FIRST_PAGE = VSYSCALL_LAST_PAGE + ((VSYSCALL_END-VSYSCALL_START) >> PAGE_SHIFT) - 1,
|
||||
VSYSCALL_FIRST_PAGE = VSYSCALL_LAST_PAGE
|
||||
+ ((VSYSCALL_END-VSYSCALL_START) >> PAGE_SHIFT) - 1,
|
||||
VSYSCALL_HPET,
|
||||
FIX_DBGP_BASE,
|
||||
FIX_EARLYCON_MEM_BASE,
|
||||
FIX_HPET_BASE,
|
||||
FIX_APIC_BASE, /* local (CPU) APIC) -- required for SMP or not */
|
||||
FIX_IO_APIC_BASE_0,
|
||||
FIX_IO_APIC_BASE_END = FIX_IO_APIC_BASE_0 + MAX_IO_APICS-1,
|
||||
FIX_IO_APIC_BASE_END = FIX_IO_APIC_BASE_0 + MAX_IO_APICS - 1,
|
||||
FIX_EFI_IO_MAP_LAST_PAGE,
|
||||
FIX_EFI_IO_MAP_FIRST_PAGE = FIX_EFI_IO_MAP_LAST_PAGE+MAX_EFI_IO_PAGES-1,
|
||||
FIX_EFI_IO_MAP_FIRST_PAGE = FIX_EFI_IO_MAP_LAST_PAGE
|
||||
+ MAX_EFI_IO_PAGES - 1,
|
||||
#ifdef CONFIG_PROVIDE_OHCI1394_DMA_INIT
|
||||
FIX_OHCI1394_BASE,
|
||||
#endif
|
||||
__end_of_fixed_addresses
|
||||
};
|
||||
|
||||
extern void __set_fixmap (enum fixed_addresses idx,
|
||||
unsigned long phys, pgprot_t flags);
|
||||
extern void __set_fixmap(enum fixed_addresses idx,
|
||||
unsigned long phys, pgprot_t flags);
|
||||
|
||||
#define set_fixmap(idx, phys) \
|
||||
__set_fixmap(idx, phys, PAGE_KERNEL)
|
||||
#define set_fixmap(idx, phys) \
|
||||
__set_fixmap(idx, phys, PAGE_KERNEL)
|
||||
/*
|
||||
* Some hardware wants to get fixmapped without caching.
|
||||
*/
|
||||
#define set_fixmap_nocache(idx, phys) \
|
||||
__set_fixmap(idx, phys, PAGE_KERNEL_NOCACHE)
|
||||
#define set_fixmap_nocache(idx, phys) \
|
||||
__set_fixmap(idx, phys, PAGE_KERNEL_NOCACHE)
|
||||
|
||||
#define FIXADDR_TOP (VSYSCALL_END-PAGE_SIZE)
|
||||
#define FIXADDR_SIZE (__end_of_fixed_addresses << PAGE_SHIFT)
|
||||
|
||||
+48
-45
@@ -20,20 +20,21 @@
|
||||
* driver otherwise. It doesn't matter much for performance anyway, as most
|
||||
* floppy accesses go through the track buffer.
|
||||
*/
|
||||
#define _CROSS_64KB(a,s,vdma) \
|
||||
(!(vdma) && ((unsigned long)(a)/K_64 != ((unsigned long)(a) + (s) - 1) / K_64))
|
||||
#define _CROSS_64KB(a, s, vdma) \
|
||||
(!(vdma) && \
|
||||
((unsigned long)(a)/K_64 != ((unsigned long)(a) + (s) - 1) / K_64))
|
||||
|
||||
#define CROSS_64KB(a,s) _CROSS_64KB(a,s,use_virtual_dma & 1)
|
||||
#define CROSS_64KB(a, s) _CROSS_64KB(a, s, use_virtual_dma & 1)
|
||||
|
||||
|
||||
#define SW fd_routine[use_virtual_dma&1]
|
||||
#define SW fd_routine[use_virtual_dma & 1]
|
||||
#define CSW fd_routine[can_use_virtual_dma & 1]
|
||||
|
||||
|
||||
#define fd_inb(port) inb_p(port)
|
||||
#define fd_outb(value,port) outb_p(value,port)
|
||||
#define fd_outb(value, port) outb_p(value, port)
|
||||
|
||||
#define fd_request_dma() CSW._request_dma(FLOPPY_DMA,"floppy")
|
||||
#define fd_request_dma() CSW._request_dma(FLOPPY_DMA, "floppy")
|
||||
#define fd_free_dma() CSW._free_dma(FLOPPY_DMA)
|
||||
#define fd_enable_irq() enable_irq(FLOPPY_IRQ)
|
||||
#define fd_disable_irq() disable_irq(FLOPPY_IRQ)
|
||||
@@ -52,64 +53,64 @@ static int doing_pdma;
|
||||
|
||||
static irqreturn_t floppy_hardint(int irq, void *dev_id)
|
||||
{
|
||||
register unsigned char st;
|
||||
unsigned char st;
|
||||
|
||||
#undef TRACE_FLPY_INT
|
||||
|
||||
#ifdef TRACE_FLPY_INT
|
||||
static int calls=0;
|
||||
static int bytes=0;
|
||||
static int dma_wait=0;
|
||||
static int calls;
|
||||
static int bytes;
|
||||
static int dma_wait;
|
||||
#endif
|
||||
if (!doing_pdma)
|
||||
return floppy_interrupt(irq, dev_id);
|
||||
|
||||
#ifdef TRACE_FLPY_INT
|
||||
if(!calls)
|
||||
if (!calls)
|
||||
bytes = virtual_dma_count;
|
||||
#endif
|
||||
|
||||
{
|
||||
register int lcount;
|
||||
register char *lptr;
|
||||
int lcount;
|
||||
char *lptr;
|
||||
|
||||
st = 1;
|
||||
for(lcount=virtual_dma_count, lptr=virtual_dma_addr;
|
||||
lcount; lcount--, lptr++) {
|
||||
st=inb(virtual_dma_port+4) & 0xa0 ;
|
||||
if(st != 0xa0)
|
||||
for (lcount = virtual_dma_count, lptr = virtual_dma_addr;
|
||||
lcount; lcount--, lptr++) {
|
||||
st = inb(virtual_dma_port + 4) & 0xa0;
|
||||
if (st != 0xa0)
|
||||
break;
|
||||
if(virtual_dma_mode)
|
||||
outb_p(*lptr, virtual_dma_port+5);
|
||||
if (virtual_dma_mode)
|
||||
outb_p(*lptr, virtual_dma_port + 5);
|
||||
else
|
||||
*lptr = inb_p(virtual_dma_port+5);
|
||||
*lptr = inb_p(virtual_dma_port + 5);
|
||||
}
|
||||
virtual_dma_count = lcount;
|
||||
virtual_dma_addr = lptr;
|
||||
st = inb(virtual_dma_port+4);
|
||||
st = inb(virtual_dma_port + 4);
|
||||
}
|
||||
|
||||
#ifdef TRACE_FLPY_INT
|
||||
calls++;
|
||||
#endif
|
||||
if(st == 0x20)
|
||||
if (st == 0x20)
|
||||
return IRQ_HANDLED;
|
||||
if(!(st & 0x20)) {
|
||||
if (!(st & 0x20)) {
|
||||
virtual_dma_residue += virtual_dma_count;
|
||||
virtual_dma_count=0;
|
||||
virtual_dma_count = 0;
|
||||
#ifdef TRACE_FLPY_INT
|
||||
printk("count=%x, residue=%x calls=%d bytes=%d dma_wait=%d\n",
|
||||
virtual_dma_count, virtual_dma_residue, calls, bytes,
|
||||
dma_wait);
|
||||
calls = 0;
|
||||
dma_wait=0;
|
||||
dma_wait = 0;
|
||||
#endif
|
||||
doing_pdma = 0;
|
||||
floppy_interrupt(irq, dev_id);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
#ifdef TRACE_FLPY_INT
|
||||
if(!virtual_dma_count)
|
||||
if (!virtual_dma_count)
|
||||
dma_wait++;
|
||||
#endif
|
||||
return IRQ_HANDLED;
|
||||
@@ -117,14 +118,14 @@ static irqreturn_t floppy_hardint(int irq, void *dev_id)
|
||||
|
||||
static void fd_disable_dma(void)
|
||||
{
|
||||
if(! (can_use_virtual_dma & 1))
|
||||
if (!(can_use_virtual_dma & 1))
|
||||
disable_dma(FLOPPY_DMA);
|
||||
doing_pdma = 0;
|
||||
virtual_dma_residue += virtual_dma_count;
|
||||
virtual_dma_count=0;
|
||||
virtual_dma_count = 0;
|
||||
}
|
||||
|
||||
static int vdma_request_dma(unsigned int dmanr, const char * device_id)
|
||||
static int vdma_request_dma(unsigned int dmanr, const char *device_id)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
@@ -142,7 +143,7 @@ static int vdma_get_dma_residue(unsigned int dummy)
|
||||
|
||||
static int fd_request_irq(void)
|
||||
{
|
||||
if(can_use_virtual_dma)
|
||||
if (can_use_virtual_dma)
|
||||
return request_irq(FLOPPY_IRQ, floppy_hardint,
|
||||
IRQF_DISABLED, "floppy", NULL);
|
||||
else
|
||||
@@ -152,13 +153,13 @@ static int fd_request_irq(void)
|
||||
|
||||
static unsigned long dma_mem_alloc(unsigned long size)
|
||||
{
|
||||
return __get_dma_pages(GFP_KERNEL|__GFP_NORETRY,get_order(size));
|
||||
return __get_dma_pages(GFP_KERNEL|__GFP_NORETRY, get_order(size));
|
||||
}
|
||||
|
||||
|
||||
static unsigned long vdma_mem_alloc(unsigned long size)
|
||||
{
|
||||
return (unsigned long) vmalloc(size);
|
||||
return (unsigned long)vmalloc(size);
|
||||
|
||||
}
|
||||
|
||||
@@ -166,7 +167,7 @@ static unsigned long vdma_mem_alloc(unsigned long size)
|
||||
|
||||
static void _fd_dma_mem_free(unsigned long addr, unsigned long size)
|
||||
{
|
||||
if((unsigned long) addr >= (unsigned long) high_memory)
|
||||
if ((unsigned long)addr >= (unsigned long)high_memory)
|
||||
vfree((void *)addr);
|
||||
else
|
||||
free_pages(addr, get_order(size));
|
||||
@@ -176,10 +177,10 @@ static void _fd_dma_mem_free(unsigned long addr, unsigned long size)
|
||||
|
||||
static void _fd_chose_dma_mode(char *addr, unsigned long size)
|
||||
{
|
||||
if(can_use_virtual_dma == 2) {
|
||||
if((unsigned long) addr >= (unsigned long) high_memory ||
|
||||
isa_virt_to_bus(addr) >= 0x1000000 ||
|
||||
_CROSS_64KB(addr, size, 0))
|
||||
if (can_use_virtual_dma == 2) {
|
||||
if ((unsigned long)addr >= (unsigned long)high_memory ||
|
||||
isa_virt_to_bus(addr) >= 0x1000000 ||
|
||||
_CROSS_64KB(addr, size, 0))
|
||||
use_virtual_dma = 1;
|
||||
else
|
||||
use_virtual_dma = 0;
|
||||
@@ -195,7 +196,7 @@ static int vdma_dma_setup(char *addr, unsigned long size, int mode, int io)
|
||||
{
|
||||
doing_pdma = 1;
|
||||
virtual_dma_port = io;
|
||||
virtual_dma_mode = (mode == DMA_MODE_WRITE);
|
||||
virtual_dma_mode = (mode == DMA_MODE_WRITE);
|
||||
virtual_dma_addr = addr;
|
||||
virtual_dma_count = size;
|
||||
virtual_dma_residue = 0;
|
||||
@@ -213,18 +214,18 @@ static int hard_dma_setup(char *addr, unsigned long size, int mode, int io)
|
||||
/* actual, physical DMA */
|
||||
doing_pdma = 0;
|
||||
clear_dma_ff(FLOPPY_DMA);
|
||||
set_dma_mode(FLOPPY_DMA,mode);
|
||||
set_dma_addr(FLOPPY_DMA,isa_virt_to_bus(addr));
|
||||
set_dma_count(FLOPPY_DMA,size);
|
||||
set_dma_mode(FLOPPY_DMA, mode);
|
||||
set_dma_addr(FLOPPY_DMA, isa_virt_to_bus(addr));
|
||||
set_dma_count(FLOPPY_DMA, size);
|
||||
enable_dma(FLOPPY_DMA);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct fd_routine_l {
|
||||
int (*_request_dma)(unsigned int dmanr, const char * device_id);
|
||||
int (*_request_dma)(unsigned int dmanr, const char *device_id);
|
||||
void (*_free_dma)(unsigned int dmanr);
|
||||
int (*_get_dma_residue)(unsigned int dummy);
|
||||
unsigned long (*_dma_mem_alloc) (unsigned long size);
|
||||
unsigned long (*_dma_mem_alloc)(unsigned long size);
|
||||
int (*_dma_setup)(char *addr, unsigned long size, int mode, int io);
|
||||
} fd_routine[] = {
|
||||
{
|
||||
@@ -252,7 +253,8 @@ static int FDC2 = -1;
|
||||
* is needed to prevent corrupted CMOS RAM in case "insmod floppy"
|
||||
* coincides with another rtc CMOS user. Paul G.
|
||||
*/
|
||||
#define FLOPPY0_TYPE ({ \
|
||||
#define FLOPPY0_TYPE \
|
||||
({ \
|
||||
unsigned long flags; \
|
||||
unsigned char val; \
|
||||
spin_lock_irqsave(&rtc_lock, flags); \
|
||||
@@ -261,7 +263,8 @@ static int FDC2 = -1;
|
||||
val; \
|
||||
})
|
||||
|
||||
#define FLOPPY1_TYPE ({ \
|
||||
#define FLOPPY1_TYPE \
|
||||
({ \
|
||||
unsigned long flags; \
|
||||
unsigned char val; \
|
||||
spin_lock_irqsave(&rtc_lock, flags); \
|
||||
|
||||
+54
-45
@@ -12,35 +12,32 @@
|
||||
#include <asm/uaccess.h>
|
||||
|
||||
#define __futex_atomic_op1(insn, ret, oldval, uaddr, oparg) \
|
||||
__asm__ __volatile( \
|
||||
"1: " insn "\n" \
|
||||
"2: .section .fixup,\"ax\"\n \
|
||||
3: mov %3, %1\n \
|
||||
jmp 2b\n \
|
||||
.previous\n" \
|
||||
_ASM_EXTABLE(1b,3b) \
|
||||
: "=r" (oldval), "=r" (ret), "+m" (*uaddr) \
|
||||
: "i" (-EFAULT), "0" (oparg), "1" (0))
|
||||
asm volatile("1:\t" insn "\n" \
|
||||
"2:\t.section .fixup,\"ax\"\n" \
|
||||
"3:\tmov\t%3, %1\n" \
|
||||
"\tjmp\t2b\n" \
|
||||
"\t.previous\n" \
|
||||
_ASM_EXTABLE(1b, 3b) \
|
||||
: "=r" (oldval), "=r" (ret), "+m" (*uaddr) \
|
||||
: "i" (-EFAULT), "0" (oparg), "1" (0))
|
||||
|
||||
#define __futex_atomic_op2(insn, ret, oldval, uaddr, oparg) \
|
||||
__asm__ __volatile( \
|
||||
"1: movl %2, %0\n \
|
||||
movl %0, %3\n" \
|
||||
insn "\n" \
|
||||
"2: lock; cmpxchgl %3, %2\n \
|
||||
jnz 1b\n \
|
||||
3: .section .fixup,\"ax\"\n \
|
||||
4: mov %5, %1\n \
|
||||
jmp 3b\n \
|
||||
.previous\n" \
|
||||
_ASM_EXTABLE(1b,4b) \
|
||||
_ASM_EXTABLE(2b,4b) \
|
||||
: "=&a" (oldval), "=&r" (ret), "+m" (*uaddr), \
|
||||
"=&r" (tem) \
|
||||
: "r" (oparg), "i" (-EFAULT), "1" (0))
|
||||
asm volatile("1:\tmovl %2, %0\n" \
|
||||
"\tmovl\t%0, %3\n" \
|
||||
"\t" insn "\n" \
|
||||
"2:\tlock; cmpxchgl %3, %2\n" \
|
||||
"\tjnz\t1b\n" \
|
||||
"3:\t.section .fixup,\"ax\"\n" \
|
||||
"4:\tmov\t%5, %1\n" \
|
||||
"\tjmp\t3b\n" \
|
||||
"\t.previous\n" \
|
||||
_ASM_EXTABLE(1b, 4b) \
|
||||
_ASM_EXTABLE(2b, 4b) \
|
||||
: "=&a" (oldval), "=&r" (ret), \
|
||||
"+m" (*uaddr), "=&r" (tem) \
|
||||
: "r" (oparg), "i" (-EFAULT), "1" (0))
|
||||
|
||||
static inline int
|
||||
futex_atomic_op_inuser(int encoded_op, int __user *uaddr)
|
||||
static inline int futex_atomic_op_inuser(int encoded_op, int __user *uaddr)
|
||||
{
|
||||
int op = (encoded_op >> 28) & 7;
|
||||
int cmp = (encoded_op >> 24) & 15;
|
||||
@@ -87,20 +84,33 @@ futex_atomic_op_inuser(int encoded_op, int __user *uaddr)
|
||||
|
||||
if (!ret) {
|
||||
switch (cmp) {
|
||||
case FUTEX_OP_CMP_EQ: ret = (oldval == cmparg); break;
|
||||
case FUTEX_OP_CMP_NE: ret = (oldval != cmparg); break;
|
||||
case FUTEX_OP_CMP_LT: ret = (oldval < cmparg); break;
|
||||
case FUTEX_OP_CMP_GE: ret = (oldval >= cmparg); break;
|
||||
case FUTEX_OP_CMP_LE: ret = (oldval <= cmparg); break;
|
||||
case FUTEX_OP_CMP_GT: ret = (oldval > cmparg); break;
|
||||
default: ret = -ENOSYS;
|
||||
case FUTEX_OP_CMP_EQ:
|
||||
ret = (oldval == cmparg);
|
||||
break;
|
||||
case FUTEX_OP_CMP_NE:
|
||||
ret = (oldval != cmparg);
|
||||
break;
|
||||
case FUTEX_OP_CMP_LT:
|
||||
ret = (oldval < cmparg);
|
||||
break;
|
||||
case FUTEX_OP_CMP_GE:
|
||||
ret = (oldval >= cmparg);
|
||||
break;
|
||||
case FUTEX_OP_CMP_LE:
|
||||
ret = (oldval <= cmparg);
|
||||
break;
|
||||
case FUTEX_OP_CMP_GT:
|
||||
ret = (oldval > cmparg);
|
||||
break;
|
||||
default:
|
||||
ret = -ENOSYS;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline int
|
||||
futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval)
|
||||
static inline int futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval,
|
||||
int newval)
|
||||
{
|
||||
|
||||
#if defined(CONFIG_X86_32) && !defined(CONFIG_X86_BSWAP)
|
||||
@@ -112,16 +122,15 @@ futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval)
|
||||
if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int)))
|
||||
return -EFAULT;
|
||||
|
||||
__asm__ __volatile__(
|
||||
"1: lock; cmpxchgl %3, %1 \n"
|
||||
"2: .section .fixup, \"ax\" \n"
|
||||
"3: mov %2, %0 \n"
|
||||
" jmp 2b \n"
|
||||
" .previous \n"
|
||||
_ASM_EXTABLE(1b,3b)
|
||||
: "=a" (oldval), "+m" (*uaddr)
|
||||
: "i" (-EFAULT), "r" (newval), "0" (oldval)
|
||||
: "memory"
|
||||
asm volatile("1:\tlock; cmpxchgl %3, %1\n"
|
||||
"2:\t.section .fixup, \"ax\"\n"
|
||||
"3:\tmov %2, %0\n"
|
||||
"\tjmp 2b\n"
|
||||
"\t.previous\n"
|
||||
_ASM_EXTABLE(1b, 3b)
|
||||
: "=a" (oldval), "+m" (*uaddr)
|
||||
: "i" (-EFAULT), "r" (newval), "0" (oldval)
|
||||
: "memory"
|
||||
);
|
||||
|
||||
return oldval;
|
||||
|
||||
@@ -14,23 +14,22 @@
|
||||
* Copyright 2003 Andi Kleen, SuSE Labs.
|
||||
*/
|
||||
|
||||
struct mpc_config_translation;
|
||||
struct mpc_config_bus;
|
||||
struct mp_config_table;
|
||||
struct mpc_config_processor;
|
||||
|
||||
struct genapic {
|
||||
char *name;
|
||||
int (*probe)(void);
|
||||
struct genapic {
|
||||
char *name;
|
||||
int (*probe)(void);
|
||||
|
||||
int (*apic_id_registered)(void);
|
||||
cpumask_t (*target_cpus)(void);
|
||||
int int_delivery_mode;
|
||||
int int_dest_mode;
|
||||
int int_dest_mode;
|
||||
int ESR_DISABLE;
|
||||
int apic_destination_logical;
|
||||
unsigned long (*check_apicid_used)(physid_mask_t bitmap, int apicid);
|
||||
unsigned long (*check_apicid_present)(int apicid);
|
||||
unsigned long (*check_apicid_present)(int apicid);
|
||||
int no_balance_irq;
|
||||
int no_ioapic_check;
|
||||
void (*init_apic_ldr)(void);
|
||||
@@ -38,28 +37,21 @@ struct genapic {
|
||||
|
||||
void (*setup_apic_routing)(void);
|
||||
int (*multi_timer_check)(int apic, int irq);
|
||||
int (*apicid_to_node)(int logical_apicid);
|
||||
int (*apicid_to_node)(int logical_apicid);
|
||||
int (*cpu_to_logical_apicid)(int cpu);
|
||||
int (*cpu_present_to_apicid)(int mps_cpu);
|
||||
physid_mask_t (*apicid_to_cpu_present)(int phys_apicid);
|
||||
int (*mpc_apic_id)(struct mpc_config_processor *m,
|
||||
struct mpc_config_translation *t);
|
||||
void (*setup_portio_remap)(void);
|
||||
void (*setup_portio_remap)(void);
|
||||
int (*check_phys_apicid_present)(int boot_cpu_physical_apicid);
|
||||
void (*enable_apic_mode)(void);
|
||||
u32 (*phys_pkg_id)(u32 cpuid_apic, int index_msb);
|
||||
|
||||
/* mpparse */
|
||||
void (*mpc_oem_bus_info)(struct mpc_config_bus *, char *,
|
||||
struct mpc_config_translation *);
|
||||
void (*mpc_oem_pci_bus)(struct mpc_config_bus *,
|
||||
struct mpc_config_translation *);
|
||||
|
||||
/* When one of the next two hooks returns 1 the genapic
|
||||
is switched to this. Essentially they are additional probe
|
||||
is switched to this. Essentially they are additional probe
|
||||
functions. */
|
||||
int (*mps_oem_check)(struct mp_config_table *mpc, char *oem,
|
||||
char *productid);
|
||||
int (*mps_oem_check)(struct mp_config_table *mpc, char *oem,
|
||||
char *productid);
|
||||
int (*acpi_madt_oem_check)(char *oem_id, char *oem_table_id);
|
||||
|
||||
unsigned (*get_apic_id)(unsigned long x);
|
||||
@@ -72,7 +64,7 @@ struct genapic {
|
||||
void (*send_IPI_allbutself)(int vector);
|
||||
void (*send_IPI_all)(int vector);
|
||||
#endif
|
||||
};
|
||||
};
|
||||
|
||||
#define APICFUNC(x) .x = x,
|
||||
|
||||
@@ -85,43 +77,46 @@ struct genapic {
|
||||
#define IPIFUNC(x)
|
||||
#endif
|
||||
|
||||
#define APIC_INIT(aname, aprobe) { \
|
||||
.name = aname, \
|
||||
.probe = aprobe, \
|
||||
.int_delivery_mode = INT_DELIVERY_MODE, \
|
||||
.int_dest_mode = INT_DEST_MODE, \
|
||||
.no_balance_irq = NO_BALANCE_IRQ, \
|
||||
.ESR_DISABLE = esr_disable, \
|
||||
.apic_destination_logical = APIC_DEST_LOGICAL, \
|
||||
APICFUNC(apic_id_registered) \
|
||||
APICFUNC(target_cpus) \
|
||||
APICFUNC(check_apicid_used) \
|
||||
APICFUNC(check_apicid_present) \
|
||||
APICFUNC(init_apic_ldr) \
|
||||
APICFUNC(ioapic_phys_id_map) \
|
||||
APICFUNC(setup_apic_routing) \
|
||||
APICFUNC(multi_timer_check) \
|
||||
APICFUNC(apicid_to_node) \
|
||||
APICFUNC(cpu_to_logical_apicid) \
|
||||
APICFUNC(cpu_present_to_apicid) \
|
||||
APICFUNC(apicid_to_cpu_present) \
|
||||
APICFUNC(mpc_apic_id) \
|
||||
APICFUNC(setup_portio_remap) \
|
||||
APICFUNC(check_phys_apicid_present) \
|
||||
APICFUNC(mpc_oem_bus_info) \
|
||||
APICFUNC(mpc_oem_pci_bus) \
|
||||
APICFUNC(mps_oem_check) \
|
||||
APICFUNC(get_apic_id) \
|
||||
.apic_id_mask = APIC_ID_MASK, \
|
||||
APICFUNC(cpu_mask_to_apicid) \
|
||||
APICFUNC(acpi_madt_oem_check) \
|
||||
IPIFUNC(send_IPI_mask) \
|
||||
IPIFUNC(send_IPI_allbutself) \
|
||||
IPIFUNC(send_IPI_all) \
|
||||
APICFUNC(enable_apic_mode) \
|
||||
APICFUNC(phys_pkg_id) \
|
||||
}
|
||||
#define APIC_INIT(aname, aprobe) \
|
||||
{ \
|
||||
.name = aname, \
|
||||
.probe = aprobe, \
|
||||
.int_delivery_mode = INT_DELIVERY_MODE, \
|
||||
.int_dest_mode = INT_DEST_MODE, \
|
||||
.no_balance_irq = NO_BALANCE_IRQ, \
|
||||
.ESR_DISABLE = esr_disable, \
|
||||
.apic_destination_logical = APIC_DEST_LOGICAL, \
|
||||
APICFUNC(apic_id_registered) \
|
||||
APICFUNC(target_cpus) \
|
||||
APICFUNC(check_apicid_used) \
|
||||
APICFUNC(check_apicid_present) \
|
||||
APICFUNC(init_apic_ldr) \
|
||||
APICFUNC(ioapic_phys_id_map) \
|
||||
APICFUNC(setup_apic_routing) \
|
||||
APICFUNC(multi_timer_check) \
|
||||
APICFUNC(apicid_to_node) \
|
||||
APICFUNC(cpu_to_logical_apicid) \
|
||||
APICFUNC(cpu_present_to_apicid) \
|
||||
APICFUNC(apicid_to_cpu_present) \
|
||||
APICFUNC(setup_portio_remap) \
|
||||
APICFUNC(check_phys_apicid_present) \
|
||||
APICFUNC(mps_oem_check) \
|
||||
APICFUNC(get_apic_id) \
|
||||
.apic_id_mask = APIC_ID_MASK, \
|
||||
APICFUNC(cpu_mask_to_apicid) \
|
||||
APICFUNC(acpi_madt_oem_check) \
|
||||
IPIFUNC(send_IPI_mask) \
|
||||
IPIFUNC(send_IPI_allbutself) \
|
||||
IPIFUNC(send_IPI_all) \
|
||||
APICFUNC(enable_apic_mode) \
|
||||
APICFUNC(phys_pkg_id) \
|
||||
}
|
||||
|
||||
extern struct genapic *genapic;
|
||||
|
||||
enum uv_system_type {UV_NONE, UV_LEGACY_APIC, UV_X2APIC, UV_NON_UNIQUE_APIC};
|
||||
#define get_uv_system_type() UV_NONE
|
||||
#define is_uv_system() 0
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -33,5 +33,15 @@ extern struct genapic *genapic;
|
||||
|
||||
extern struct genapic apic_flat;
|
||||
extern struct genapic apic_physflat;
|
||||
extern int acpi_madt_oem_check(char *, char *);
|
||||
|
||||
enum uv_system_type {UV_NONE, UV_LEGACY_APIC, UV_X2APIC, UV_NON_UNIQUE_APIC};
|
||||
extern enum uv_system_type get_uv_system_type(void);
|
||||
extern int is_uv_system(void);
|
||||
|
||||
extern struct genapic apic_x2apic_uv_x;
|
||||
DECLARE_PER_CPU(int, x2apic_extra_bits);
|
||||
extern void uv_cpu_init(void);
|
||||
extern int uv_wakeup_secondary(int phys_apicid, unsigned int start_rip);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -167,7 +167,7 @@ static inline int is_geode(void)
|
||||
/* MFGPTs */
|
||||
|
||||
#define MFGPT_MAX_TIMERS 8
|
||||
#define MFGPT_TIMER_ANY -1
|
||||
#define MFGPT_TIMER_ANY (-1)
|
||||
|
||||
#define MFGPT_DOMAIN_WORKING 1
|
||||
#define MFGPT_DOMAIN_STANDBY 2
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
* Gerhard.Wichert@pdb.siemens.de
|
||||
*
|
||||
*
|
||||
* Redesigned the x86 32-bit VM architecture to deal with
|
||||
* Redesigned the x86 32-bit VM architecture to deal with
|
||||
* up to 16 Terabyte physical memory. With current x86 CPUs
|
||||
* we now support up to 64 Gigabytes physical RAM.
|
||||
*
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
* cleanup after irq migration.
|
||||
*/
|
||||
#define IRQ_MOVE_CLEANUP_VECTOR FIRST_EXTERNAL_VECTOR
|
||||
|
||||
|
||||
/*
|
||||
* Vectors 0x30-0x3f are used for ISA interrupts.
|
||||
*/
|
||||
@@ -159,13 +159,12 @@ extern atomic_t irq_mis_count;
|
||||
* SMP has a few special interrupts for IPI messages
|
||||
*/
|
||||
|
||||
#define BUILD_IRQ(nr) \
|
||||
asmlinkage void IRQ_NAME(nr); \
|
||||
__asm__( \
|
||||
"\n.p2align\n" \
|
||||
"IRQ" #nr "_interrupt:\n\t" \
|
||||
"push $~(" #nr ") ; " \
|
||||
"jmp common_interrupt");
|
||||
#define BUILD_IRQ(nr) \
|
||||
asmlinkage void IRQ_NAME(nr); \
|
||||
asm("\n.p2align\n" \
|
||||
"IRQ" #nr "_interrupt:\n\t" \
|
||||
"push $~(" #nr ") ; " \
|
||||
"jmp common_interrupt");
|
||||
|
||||
#define platform_legacy_irq(irq) ((irq) < 16)
|
||||
|
||||
|
||||
@@ -8,12 +8,14 @@
|
||||
#define HT_IRQ_LOW_BASE 0xf8000000
|
||||
|
||||
#define HT_IRQ_LOW_VECTOR_SHIFT 16
|
||||
#define HT_IRQ_LOW_VECTOR_MASK 0x00ff0000
|
||||
#define HT_IRQ_LOW_VECTOR(v) (((v) << HT_IRQ_LOW_VECTOR_SHIFT) & HT_IRQ_LOW_VECTOR_MASK)
|
||||
#define HT_IRQ_LOW_VECTOR_MASK 0x00ff0000
|
||||
#define HT_IRQ_LOW_VECTOR(v) \
|
||||
(((v) << HT_IRQ_LOW_VECTOR_SHIFT) & HT_IRQ_LOW_VECTOR_MASK)
|
||||
|
||||
#define HT_IRQ_LOW_DEST_ID_SHIFT 8
|
||||
#define HT_IRQ_LOW_DEST_ID_MASK 0x0000ff00
|
||||
#define HT_IRQ_LOW_DEST_ID(v) (((v) << HT_IRQ_LOW_DEST_ID_SHIFT) & HT_IRQ_LOW_DEST_ID_MASK)
|
||||
#define HT_IRQ_LOW_DEST_ID_MASK 0x0000ff00
|
||||
#define HT_IRQ_LOW_DEST_ID(v) \
|
||||
(((v) << HT_IRQ_LOW_DEST_ID_SHIFT) & HT_IRQ_LOW_DEST_ID_MASK)
|
||||
|
||||
#define HT_IRQ_LOW_DM_PHYSICAL 0x0000000
|
||||
#define HT_IRQ_LOW_DM_LOGICAL 0x0000040
|
||||
@@ -36,7 +38,8 @@
|
||||
|
||||
|
||||
#define HT_IRQ_HIGH_DEST_ID_SHIFT 0
|
||||
#define HT_IRQ_HIGH_DEST_ID_MASK 0x00ffffff
|
||||
#define HT_IRQ_HIGH_DEST_ID(v) ((((v) >> 8) << HT_IRQ_HIGH_DEST_ID_SHIFT) & HT_IRQ_HIGH_DEST_ID_MASK)
|
||||
#define HT_IRQ_HIGH_DEST_ID_MASK 0x00ffffff
|
||||
#define HT_IRQ_HIGH_DEST_ID(v) \
|
||||
((((v) >> 8) << HT_IRQ_HIGH_DEST_ID_SHIFT) & HT_IRQ_HIGH_DEST_ID_MASK)
|
||||
|
||||
#endif /* ASM_HYPERTRANSPORT_H */
|
||||
|
||||
+13
-10
@@ -41,7 +41,7 @@ static inline void tolerant_fwait(void)
|
||||
{
|
||||
asm volatile("1: fwait\n"
|
||||
"2:\n"
|
||||
_ASM_EXTABLE(1b,2b));
|
||||
_ASM_EXTABLE(1b, 2b));
|
||||
}
|
||||
|
||||
static inline int restore_fpu_checking(struct i387_fxsave_struct *fx)
|
||||
@@ -54,7 +54,7 @@ static inline int restore_fpu_checking(struct i387_fxsave_struct *fx)
|
||||
"3: movl $-1,%[err]\n"
|
||||
" jmp 2b\n"
|
||||
".previous\n"
|
||||
_ASM_EXTABLE(1b,3b)
|
||||
_ASM_EXTABLE(1b, 3b)
|
||||
: [err] "=r" (err)
|
||||
#if 0 /* See comment in __save_init_fpu() below. */
|
||||
: [fx] "r" (fx), "m" (*fx), "0" (0));
|
||||
@@ -76,11 +76,11 @@ static inline int restore_fpu_checking(struct i387_fxsave_struct *fx)
|
||||
static inline void clear_fpu_state(struct i387_fxsave_struct *fx)
|
||||
{
|
||||
if (unlikely(fx->swd & X87_FSW_ES))
|
||||
asm volatile("fnclex");
|
||||
asm volatile("fnclex");
|
||||
alternative_input(ASM_NOP8 ASM_NOP2,
|
||||
" emms\n" /* clear stack tags */
|
||||
" fildl %%gs:0", /* load to clear state */
|
||||
X86_FEATURE_FXSAVE_LEAK);
|
||||
" emms\n" /* clear stack tags */
|
||||
" fildl %%gs:0", /* load to clear state */
|
||||
X86_FEATURE_FXSAVE_LEAK);
|
||||
}
|
||||
|
||||
static inline int save_i387_checking(struct i387_fxsave_struct __user *fx)
|
||||
@@ -93,14 +93,15 @@ static inline int save_i387_checking(struct i387_fxsave_struct __user *fx)
|
||||
"3: movl $-1,%[err]\n"
|
||||
" jmp 2b\n"
|
||||
".previous\n"
|
||||
_ASM_EXTABLE(1b,3b)
|
||||
_ASM_EXTABLE(1b, 3b)
|
||||
: [err] "=r" (err), "=m" (*fx)
|
||||
#if 0 /* See comment in __fxsave_clear() below. */
|
||||
: [fx] "r" (fx), "0" (0));
|
||||
#else
|
||||
: [fx] "cdaSDb" (fx), "0" (0));
|
||||
#endif
|
||||
if (unlikely(err) && __clear_user(fx, sizeof(struct i387_fxsave_struct)))
|
||||
if (unlikely(err) &&
|
||||
__clear_user(fx, sizeof(struct i387_fxsave_struct)))
|
||||
err = -EFAULT;
|
||||
/* No need to clear here because the caller clears USED_MATH */
|
||||
return err;
|
||||
@@ -156,8 +157,10 @@ static inline int save_i387(struct _fpstate __user *buf)
|
||||
return 0;
|
||||
clear_used_math(); /* trigger finit */
|
||||
if (task_thread_info(tsk)->status & TS_USEDFPU) {
|
||||
err = save_i387_checking((struct i387_fxsave_struct __user *)buf);
|
||||
if (err) return err;
|
||||
err = save_i387_checking((struct i387_fxsave_struct __user *)
|
||||
buf);
|
||||
if (err)
|
||||
return err;
|
||||
task_thread_info(tsk)->status &= ~TS_USEDFPU;
|
||||
stts();
|
||||
} else {
|
||||
|
||||
+26
-3
@@ -1,9 +1,11 @@
|
||||
#ifndef __ASM_I8259_H__
|
||||
#define __ASM_I8259_H__
|
||||
|
||||
#include <linux/delay.h>
|
||||
|
||||
extern unsigned int cached_irq_mask;
|
||||
|
||||
#define __byte(x,y) (((unsigned char *) &(y))[x])
|
||||
#define __byte(x, y) (((unsigned char *)&(y))[x])
|
||||
#define cached_master_mask (__byte(0, cached_irq_mask))
|
||||
#define cached_slave_mask (__byte(1, cached_irq_mask))
|
||||
|
||||
@@ -29,7 +31,28 @@ extern void enable_8259A_irq(unsigned int irq);
|
||||
extern void disable_8259A_irq(unsigned int irq);
|
||||
extern unsigned int startup_8259A_irq(unsigned int irq);
|
||||
|
||||
#define inb_pic inb_p
|
||||
#define outb_pic outb_p
|
||||
/* the PIC may need a careful delay on some platforms, hence specific calls */
|
||||
static inline unsigned char inb_pic(unsigned int port)
|
||||
{
|
||||
unsigned char value = inb(port);
|
||||
|
||||
/*
|
||||
* delay for some accesses to PIC on motherboard or in chipset
|
||||
* must be at least one microsecond, so be safe here:
|
||||
*/
|
||||
udelay(2);
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
static inline void outb_pic(unsigned char value, unsigned int port)
|
||||
{
|
||||
outb(value, port);
|
||||
/*
|
||||
* delay for some accesses to PIC on motherboard or in chipset
|
||||
* must be at least one microsecond, so be safe here:
|
||||
*/
|
||||
udelay(2);
|
||||
}
|
||||
|
||||
#endif /* __ASM_I8259_H__ */
|
||||
|
||||
+30
-32
@@ -14,19 +14,19 @@
|
||||
|
||||
/* signal.h */
|
||||
struct sigaction32 {
|
||||
unsigned int sa_handler; /* Really a pointer, but need to deal
|
||||
with 32 bits */
|
||||
unsigned int sa_flags;
|
||||
unsigned int sa_restorer; /* Another 32 bit pointer */
|
||||
compat_sigset_t sa_mask; /* A 32 bit mask */
|
||||
unsigned int sa_handler; /* Really a pointer, but need to deal
|
||||
with 32 bits */
|
||||
unsigned int sa_flags;
|
||||
unsigned int sa_restorer; /* Another 32 bit pointer */
|
||||
compat_sigset_t sa_mask; /* A 32 bit mask */
|
||||
};
|
||||
|
||||
struct old_sigaction32 {
|
||||
unsigned int sa_handler; /* Really a pointer, but need to deal
|
||||
with 32 bits */
|
||||
compat_old_sigset_t sa_mask; /* A 32 bit mask */
|
||||
unsigned int sa_flags;
|
||||
unsigned int sa_restorer; /* Another 32 bit pointer */
|
||||
unsigned int sa_handler; /* Really a pointer, but need to deal
|
||||
with 32 bits */
|
||||
compat_old_sigset_t sa_mask; /* A 32 bit mask */
|
||||
unsigned int sa_flags;
|
||||
unsigned int sa_restorer; /* Another 32 bit pointer */
|
||||
};
|
||||
|
||||
typedef struct sigaltstack_ia32 {
|
||||
@@ -65,7 +65,7 @@ struct stat64 {
|
||||
long long st_size;
|
||||
unsigned int st_blksize;
|
||||
|
||||
long long st_blocks;/* Number 512-byte blocks allocated. */
|
||||
long long st_blocks;/* Number 512-byte blocks allocated */
|
||||
|
||||
unsigned st_atime;
|
||||
unsigned st_atime_nsec;
|
||||
@@ -77,13 +77,13 @@ struct stat64 {
|
||||
unsigned long long st_ino;
|
||||
} __attribute__((packed));
|
||||
|
||||
typedef struct compat_siginfo{
|
||||
typedef struct compat_siginfo {
|
||||
int si_signo;
|
||||
int si_errno;
|
||||
int si_code;
|
||||
|
||||
union {
|
||||
int _pad[((128/sizeof(int)) - 3)];
|
||||
int _pad[((128 / sizeof(int)) - 3)];
|
||||
|
||||
/* kill() */
|
||||
struct {
|
||||
@@ -129,28 +129,26 @@ typedef struct compat_siginfo{
|
||||
} _sifields;
|
||||
} compat_siginfo_t;
|
||||
|
||||
struct sigframe32
|
||||
{
|
||||
u32 pretcode;
|
||||
int sig;
|
||||
struct sigcontext_ia32 sc;
|
||||
struct _fpstate_ia32 fpstate;
|
||||
unsigned int extramask[_COMPAT_NSIG_WORDS-1];
|
||||
struct sigframe32 {
|
||||
u32 pretcode;
|
||||
int sig;
|
||||
struct sigcontext_ia32 sc;
|
||||
struct _fpstate_ia32 fpstate;
|
||||
unsigned int extramask[_COMPAT_NSIG_WORDS-1];
|
||||
};
|
||||
|
||||
struct rt_sigframe32
|
||||
{
|
||||
u32 pretcode;
|
||||
int sig;
|
||||
u32 pinfo;
|
||||
u32 puc;
|
||||
compat_siginfo_t info;
|
||||
struct ucontext_ia32 uc;
|
||||
struct _fpstate_ia32 fpstate;
|
||||
struct rt_sigframe32 {
|
||||
u32 pretcode;
|
||||
int sig;
|
||||
u32 pinfo;
|
||||
u32 puc;
|
||||
compat_siginfo_t info;
|
||||
struct ucontext_ia32 uc;
|
||||
struct _fpstate_ia32 fpstate;
|
||||
};
|
||||
|
||||
struct ustat32 {
|
||||
__u32 f_tfree;
|
||||
__u32 f_tfree;
|
||||
compat_ino_t f_tinode;
|
||||
char f_fname[6];
|
||||
char f_fpack[6];
|
||||
@@ -168,5 +166,5 @@ extern void ia32_pick_mmap_layout(struct mm_struct *mm);
|
||||
#endif
|
||||
|
||||
#endif /* !CONFIG_IA32_SUPPORT */
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
#define ARCH_HAS_IOREMAP_WC
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
# include "io_32.h"
|
||||
#else
|
||||
# include "io_64.h"
|
||||
#endif
|
||||
extern int ioremap_change_attr(unsigned long vaddr, unsigned long size,
|
||||
unsigned long prot_val);
|
||||
extern void __iomem *ioremap_wc(unsigned long offset, unsigned long size);
|
||||
|
||||
|
||||
+83
-54
@@ -65,14 +65,14 @@
|
||||
*
|
||||
* The returned physical address is the physical (CPU) mapping for
|
||||
* the memory address given. It is only valid to use this function on
|
||||
* addresses directly mapped or allocated via kmalloc.
|
||||
* addresses directly mapped or allocated via kmalloc.
|
||||
*
|
||||
* This function does not give bus mappings for DMA transfers. In
|
||||
* almost all conceivable cases a device driver should not be using
|
||||
* this function
|
||||
*/
|
||||
|
||||
static inline unsigned long virt_to_phys(volatile void * address)
|
||||
|
||||
static inline unsigned long virt_to_phys(volatile void *address)
|
||||
{
|
||||
return __pa(address);
|
||||
}
|
||||
@@ -90,7 +90,7 @@ static inline unsigned long virt_to_phys(volatile void * address)
|
||||
* this function
|
||||
*/
|
||||
|
||||
static inline void * phys_to_virt(unsigned long address)
|
||||
static inline void *phys_to_virt(unsigned long address)
|
||||
{
|
||||
return __va(address);
|
||||
}
|
||||
@@ -169,16 +169,19 @@ extern void __iomem *fix_ioremap(unsigned idx, unsigned long phys);
|
||||
|
||||
static inline unsigned char readb(const volatile void __iomem *addr)
|
||||
{
|
||||
return *(volatile unsigned char __force *) addr;
|
||||
return *(volatile unsigned char __force *)addr;
|
||||
}
|
||||
|
||||
static inline unsigned short readw(const volatile void __iomem *addr)
|
||||
{
|
||||
return *(volatile unsigned short __force *) addr;
|
||||
return *(volatile unsigned short __force *)addr;
|
||||
}
|
||||
|
||||
static inline unsigned int readl(const volatile void __iomem *addr)
|
||||
{
|
||||
return *(volatile unsigned int __force *) addr;
|
||||
}
|
||||
|
||||
#define readb_relaxed(addr) readb(addr)
|
||||
#define readw_relaxed(addr) readw(addr)
|
||||
#define readl_relaxed(addr) readl(addr)
|
||||
@@ -188,15 +191,17 @@ static inline unsigned int readl(const volatile void __iomem *addr)
|
||||
|
||||
static inline void writeb(unsigned char b, volatile void __iomem *addr)
|
||||
{
|
||||
*(volatile unsigned char __force *) addr = b;
|
||||
*(volatile unsigned char __force *)addr = b;
|
||||
}
|
||||
|
||||
static inline void writew(unsigned short b, volatile void __iomem *addr)
|
||||
{
|
||||
*(volatile unsigned short __force *) addr = b;
|
||||
*(volatile unsigned short __force *)addr = b;
|
||||
}
|
||||
|
||||
static inline void writel(unsigned int b, volatile void __iomem *addr)
|
||||
{
|
||||
*(volatile unsigned int __force *) addr = b;
|
||||
*(volatile unsigned int __force *)addr = b;
|
||||
}
|
||||
#define __raw_writeb writeb
|
||||
#define __raw_writew writew
|
||||
@@ -239,12 +244,12 @@ memcpy_toio(volatile void __iomem *dst, const void *src, int count)
|
||||
* 1. Out of order aware processors
|
||||
* 2. Accidentally out of order processors (PPro errata #51)
|
||||
*/
|
||||
|
||||
|
||||
#if defined(CONFIG_X86_OOSTORE) || defined(CONFIG_X86_PPRO_FENCE)
|
||||
|
||||
static inline void flush_write_buffers(void)
|
||||
{
|
||||
__asm__ __volatile__ ("lock; addl $0,0(%%esp)": : :"memory");
|
||||
asm volatile("lock; addl $0,0(%%esp)": : :"memory");
|
||||
}
|
||||
|
||||
#else
|
||||
@@ -264,7 +269,8 @@ extern void io_delay_init(void);
|
||||
#include <asm/paravirt.h>
|
||||
#else
|
||||
|
||||
static inline void slow_down_io(void) {
|
||||
static inline void slow_down_io(void)
|
||||
{
|
||||
native_io_delay();
|
||||
#ifdef REALLY_SLOW_IO
|
||||
native_io_delay();
|
||||
@@ -275,51 +281,74 @@ static inline void slow_down_io(void) {
|
||||
|
||||
#endif
|
||||
|
||||
#define __BUILDIO(bwl,bw,type) \
|
||||
static inline void out##bwl(unsigned type value, int port) { \
|
||||
out##bwl##_local(value, port); \
|
||||
} \
|
||||
static inline unsigned type in##bwl(int port) { \
|
||||
return in##bwl##_local(port); \
|
||||
#define __BUILDIO(bwl, bw, type) \
|
||||
static inline void out##bwl(unsigned type value, int port) \
|
||||
{ \
|
||||
out##bwl##_local(value, port); \
|
||||
} \
|
||||
\
|
||||
static inline unsigned type in##bwl(int port) \
|
||||
{ \
|
||||
return in##bwl##_local(port); \
|
||||
}
|
||||
|
||||
#define BUILDIO(bwl,bw,type) \
|
||||
static inline void out##bwl##_local(unsigned type value, int port) { \
|
||||
__asm__ __volatile__("out" #bwl " %" #bw "0, %w1" : : "a"(value), "Nd"(port)); \
|
||||
} \
|
||||
static inline unsigned type in##bwl##_local(int port) { \
|
||||
unsigned type value; \
|
||||
__asm__ __volatile__("in" #bwl " %w1, %" #bw "0" : "=a"(value) : "Nd"(port)); \
|
||||
return value; \
|
||||
} \
|
||||
static inline void out##bwl##_local_p(unsigned type value, int port) { \
|
||||
out##bwl##_local(value, port); \
|
||||
slow_down_io(); \
|
||||
} \
|
||||
static inline unsigned type in##bwl##_local_p(int port) { \
|
||||
unsigned type value = in##bwl##_local(port); \
|
||||
slow_down_io(); \
|
||||
return value; \
|
||||
} \
|
||||
__BUILDIO(bwl,bw,type) \
|
||||
static inline void out##bwl##_p(unsigned type value, int port) { \
|
||||
out##bwl(value, port); \
|
||||
slow_down_io(); \
|
||||
} \
|
||||
static inline unsigned type in##bwl##_p(int port) { \
|
||||
unsigned type value = in##bwl(port); \
|
||||
slow_down_io(); \
|
||||
return value; \
|
||||
} \
|
||||
static inline void outs##bwl(int port, const void *addr, unsigned long count) { \
|
||||
__asm__ __volatile__("rep; outs" #bwl : "+S"(addr), "+c"(count) : "d"(port)); \
|
||||
} \
|
||||
static inline void ins##bwl(int port, void *addr, unsigned long count) { \
|
||||
__asm__ __volatile__("rep; ins" #bwl : "+D"(addr), "+c"(count) : "d"(port)); \
|
||||
#define BUILDIO(bwl, bw, type) \
|
||||
static inline void out##bwl##_local(unsigned type value, int port) \
|
||||
{ \
|
||||
asm volatile("out" #bwl " %" #bw "0, %w1" \
|
||||
: : "a"(value), "Nd"(port)); \
|
||||
} \
|
||||
\
|
||||
static inline unsigned type in##bwl##_local(int port) \
|
||||
{ \
|
||||
unsigned type value; \
|
||||
asm volatile("in" #bwl " %w1, %" #bw "0" \
|
||||
: "=a"(value) : "Nd"(port)); \
|
||||
return value; \
|
||||
} \
|
||||
\
|
||||
static inline void out##bwl##_local_p(unsigned type value, int port) \
|
||||
{ \
|
||||
out##bwl##_local(value, port); \
|
||||
slow_down_io(); \
|
||||
} \
|
||||
\
|
||||
static inline unsigned type in##bwl##_local_p(int port) \
|
||||
{ \
|
||||
unsigned type value = in##bwl##_local(port); \
|
||||
slow_down_io(); \
|
||||
return value; \
|
||||
} \
|
||||
\
|
||||
__BUILDIO(bwl, bw, type) \
|
||||
\
|
||||
static inline void out##bwl##_p(unsigned type value, int port) \
|
||||
{ \
|
||||
out##bwl(value, port); \
|
||||
slow_down_io(); \
|
||||
} \
|
||||
\
|
||||
static inline unsigned type in##bwl##_p(int port) \
|
||||
{ \
|
||||
unsigned type value = in##bwl(port); \
|
||||
slow_down_io(); \
|
||||
return value; \
|
||||
} \
|
||||
\
|
||||
static inline void outs##bwl(int port, const void *addr, unsigned long count) \
|
||||
{ \
|
||||
asm volatile("rep; outs" #bwl \
|
||||
: "+S"(addr), "+c"(count) : "d"(port)); \
|
||||
} \
|
||||
\
|
||||
static inline void ins##bwl(int port, void *addr, unsigned long count) \
|
||||
{ \
|
||||
asm volatile("rep; ins" #bwl \
|
||||
: "+D"(addr), "+c"(count) : "d"(port)); \
|
||||
}
|
||||
|
||||
BUILDIO(b,b,char)
|
||||
BUILDIO(w,w,short)
|
||||
BUILDIO(l,,int)
|
||||
BUILDIO(b, b, char)
|
||||
BUILDIO(w, w, short)
|
||||
BUILDIO(l, , int)
|
||||
|
||||
#endif
|
||||
|
||||
+68
-42
@@ -58,60 +58,75 @@ static inline void slow_down_io(void)
|
||||
/*
|
||||
* Talk about misusing macros..
|
||||
*/
|
||||
#define __OUT1(s,x) \
|
||||
#define __OUT1(s, x) \
|
||||
static inline void out##s(unsigned x value, unsigned short port) {
|
||||
|
||||
#define __OUT2(s,s1,s2) \
|
||||
__asm__ __volatile__ ("out" #s " %" s1 "0,%" s2 "1"
|
||||
#define __OUT2(s, s1, s2) \
|
||||
asm volatile ("out" #s " %" s1 "0,%" s2 "1"
|
||||
|
||||
#ifndef REALLY_SLOW_IO
|
||||
#define REALLY_SLOW_IO
|
||||
#define UNSET_REALLY_SLOW_IO
|
||||
#endif
|
||||
|
||||
#define __OUT(s,s1,x) \
|
||||
__OUT1(s,x) __OUT2(s,s1,"w") : : "a" (value), "Nd" (port)); } \
|
||||
__OUT1(s##_p, x) __OUT2(s, s1, "w") : : "a" (value), "Nd" (port)); \
|
||||
slow_down_io(); }
|
||||
#define __OUT(s, s1, x) \
|
||||
__OUT1(s, x) __OUT2(s, s1, "w") : : "a" (value), "Nd" (port)); \
|
||||
} \
|
||||
__OUT1(s##_p, x) __OUT2(s, s1, "w") : : "a" (value), "Nd" (port)); \
|
||||
slow_down_io(); \
|
||||
}
|
||||
|
||||
#define __IN1(s) \
|
||||
static inline RETURN_TYPE in##s(unsigned short port) { RETURN_TYPE _v;
|
||||
#define __IN1(s) \
|
||||
static inline RETURN_TYPE in##s(unsigned short port) \
|
||||
{ \
|
||||
RETURN_TYPE _v;
|
||||
|
||||
#define __IN2(s,s1,s2) \
|
||||
__asm__ __volatile__ ("in" #s " %" s2 "1,%" s1 "0"
|
||||
#define __IN2(s, s1, s2) \
|
||||
asm volatile ("in" #s " %" s2 "1,%" s1 "0"
|
||||
|
||||
#define __IN(s,s1,i...) \
|
||||
__IN1(s) __IN2(s, s1, "w") : "=a" (_v) : "Nd" (port), ##i); return _v; } \
|
||||
__IN1(s##_p) __IN2(s, s1, "w") : "=a" (_v) : "Nd" (port), ##i); \
|
||||
slow_down_io(); return _v; }
|
||||
#define __IN(s, s1, i...) \
|
||||
__IN1(s) __IN2(s, s1, "w") : "=a" (_v) : "Nd" (port), ##i); \
|
||||
return _v; \
|
||||
} \
|
||||
__IN1(s##_p) __IN2(s, s1, "w") : "=a" (_v) : "Nd" (port), ##i); \
|
||||
slow_down_io(); \
|
||||
return _v; }
|
||||
|
||||
#ifdef UNSET_REALLY_SLOW_IO
|
||||
#undef REALLY_SLOW_IO
|
||||
#endif
|
||||
|
||||
#define __INS(s) \
|
||||
static inline void ins##s(unsigned short port, void * addr, unsigned long count) \
|
||||
{ __asm__ __volatile__ ("rep ; ins" #s \
|
||||
: "=D" (addr), "=c" (count) : "d" (port),"0" (addr),"1" (count)); }
|
||||
#define __INS(s) \
|
||||
static inline void ins##s(unsigned short port, void *addr, \
|
||||
unsigned long count) \
|
||||
{ \
|
||||
asm volatile ("rep ; ins" #s \
|
||||
: "=D" (addr), "=c" (count) \
|
||||
: "d" (port), "0" (addr), "1" (count)); \
|
||||
}
|
||||
|
||||
#define __OUTS(s) \
|
||||
static inline void outs##s(unsigned short port, const void * addr, unsigned long count) \
|
||||
{ __asm__ __volatile__ ("rep ; outs" #s \
|
||||
: "=S" (addr), "=c" (count) : "d" (port),"0" (addr),"1" (count)); }
|
||||
#define __OUTS(s) \
|
||||
static inline void outs##s(unsigned short port, const void *addr, \
|
||||
unsigned long count) \
|
||||
{ \
|
||||
asm volatile ("rep ; outs" #s \
|
||||
: "=S" (addr), "=c" (count) \
|
||||
: "d" (port), "0" (addr), "1" (count)); \
|
||||
}
|
||||
|
||||
#define RETURN_TYPE unsigned char
|
||||
__IN(b,"")
|
||||
__IN(b, "")
|
||||
#undef RETURN_TYPE
|
||||
#define RETURN_TYPE unsigned short
|
||||
__IN(w,"")
|
||||
__IN(w, "")
|
||||
#undef RETURN_TYPE
|
||||
#define RETURN_TYPE unsigned int
|
||||
__IN(l,"")
|
||||
__IN(l, "")
|
||||
#undef RETURN_TYPE
|
||||
|
||||
__OUT(b,"b",char)
|
||||
__OUT(w,"w",short)
|
||||
__OUT(l,,int)
|
||||
__OUT(b, "b", char)
|
||||
__OUT(w, "w", short)
|
||||
__OUT(l, , int)
|
||||
|
||||
__INS(b)
|
||||
__INS(w)
|
||||
@@ -132,12 +147,12 @@ __OUTS(l)
|
||||
* Change virtual addresses to physical addresses and vv.
|
||||
* These are pretty trivial
|
||||
*/
|
||||
static inline unsigned long virt_to_phys(volatile void * address)
|
||||
static inline unsigned long virt_to_phys(volatile void *address)
|
||||
{
|
||||
return __pa(address);
|
||||
}
|
||||
|
||||
static inline void * phys_to_virt(unsigned long address)
|
||||
static inline void *phys_to_virt(unsigned long address)
|
||||
{
|
||||
return __va(address);
|
||||
}
|
||||
@@ -200,18 +215,22 @@ static inline __u8 __readb(const volatile void __iomem *addr)
|
||||
{
|
||||
return *(__force volatile __u8 *)addr;
|
||||
}
|
||||
|
||||
static inline __u16 __readw(const volatile void __iomem *addr)
|
||||
{
|
||||
return *(__force volatile __u16 *)addr;
|
||||
}
|
||||
|
||||
static __always_inline __u32 __readl(const volatile void __iomem *addr)
|
||||
{
|
||||
return *(__force volatile __u32 *)addr;
|
||||
}
|
||||
|
||||
static inline __u64 __readq(const volatile void __iomem *addr)
|
||||
{
|
||||
return *(__force volatile __u64 *)addr;
|
||||
}
|
||||
|
||||
#define readb(x) __readb(x)
|
||||
#define readw(x) __readw(x)
|
||||
#define readl(x) __readl(x)
|
||||
@@ -231,37 +250,44 @@ static inline void __writel(__u32 b, volatile void __iomem *addr)
|
||||
{
|
||||
*(__force volatile __u32 *)addr = b;
|
||||
}
|
||||
|
||||
static inline void __writeq(__u64 b, volatile void __iomem *addr)
|
||||
{
|
||||
*(__force volatile __u64 *)addr = b;
|
||||
}
|
||||
|
||||
static inline void __writeb(__u8 b, volatile void __iomem *addr)
|
||||
{
|
||||
*(__force volatile __u8 *)addr = b;
|
||||
}
|
||||
|
||||
static inline void __writew(__u16 b, volatile void __iomem *addr)
|
||||
{
|
||||
*(__force volatile __u16 *)addr = b;
|
||||
}
|
||||
#define writeq(val,addr) __writeq((val),(addr))
|
||||
#define writel(val,addr) __writel((val),(addr))
|
||||
#define writew(val,addr) __writew((val),(addr))
|
||||
#define writeb(val,addr) __writeb((val),(addr))
|
||||
|
||||
#define writeq(val, addr) __writeq((val), (addr))
|
||||
#define writel(val, addr) __writel((val), (addr))
|
||||
#define writew(val, addr) __writew((val), (addr))
|
||||
#define writeb(val, addr) __writeb((val), (addr))
|
||||
#define __raw_writeb writeb
|
||||
#define __raw_writew writew
|
||||
#define __raw_writel writel
|
||||
#define __raw_writeq writeq
|
||||
|
||||
void __memcpy_fromio(void*,unsigned long,unsigned);
|
||||
void __memcpy_toio(unsigned long,const void*,unsigned);
|
||||
void __memcpy_fromio(void *, unsigned long, unsigned);
|
||||
void __memcpy_toio(unsigned long, const void *, unsigned);
|
||||
|
||||
static inline void memcpy_fromio(void *to, const volatile void __iomem *from, unsigned len)
|
||||
static inline void memcpy_fromio(void *to, const volatile void __iomem *from,
|
||||
unsigned len)
|
||||
{
|
||||
__memcpy_fromio(to,(unsigned long)from,len);
|
||||
__memcpy_fromio(to, (unsigned long)from, len);
|
||||
}
|
||||
static inline void memcpy_toio(volatile void __iomem *to, const void *from, unsigned len)
|
||||
|
||||
static inline void memcpy_toio(volatile void __iomem *to, const void *from,
|
||||
unsigned len)
|
||||
{
|
||||
__memcpy_toio((unsigned long)to,from,len);
|
||||
__memcpy_toio((unsigned long)to, from, len);
|
||||
}
|
||||
|
||||
void memset_io(volatile void __iomem *a, int b, size_t c);
|
||||
@@ -276,7 +302,7 @@ void memset_io(volatile void __iomem *a, int b, size_t c);
|
||||
*/
|
||||
#define __ISA_IO_base ((char __iomem *)(PAGE_OFFSET))
|
||||
|
||||
#define flush_write_buffers()
|
||||
#define flush_write_buffers()
|
||||
|
||||
extern int iommu_bio_merge;
|
||||
#define BIO_VMERGE_BOUNDARY iommu_bio_merge
|
||||
|
||||
@@ -110,6 +110,13 @@ extern int nr_ioapic_registers[MAX_IO_APICS];
|
||||
* MP-BIOS irq configuration table structures:
|
||||
*/
|
||||
|
||||
struct mp_ioapic_routing {
|
||||
int apic_id;
|
||||
int gsi_base;
|
||||
int gsi_end;
|
||||
u32 pin_programmed[4];
|
||||
};
|
||||
|
||||
/* I/O APIC entries */
|
||||
extern struct mpc_config_ioapic mp_ioapics[MAX_IO_APICS];
|
||||
|
||||
@@ -146,7 +153,6 @@ extern int io_apic_get_version(int ioapic);
|
||||
extern int io_apic_get_redir_entries(int ioapic);
|
||||
extern int io_apic_set_pci_routing(int ioapic, int pin, int irq,
|
||||
int edge_level, int active_high_low);
|
||||
extern int timer_uses_ioapic_pin_0;
|
||||
#endif /* CONFIG_ACPI */
|
||||
|
||||
extern int (*ioapic_renumber_irq)(int ioapic, int irq);
|
||||
|
||||
@@ -47,12 +47,13 @@
|
||||
#define TIOCSBRK 0x5427 /* BSD compatibility */
|
||||
#define TIOCCBRK 0x5428 /* BSD compatibility */
|
||||
#define TIOCGSID 0x5429 /* Return the session ID of FD */
|
||||
#define TCGETS2 _IOR('T',0x2A, struct termios2)
|
||||
#define TCSETS2 _IOW('T',0x2B, struct termios2)
|
||||
#define TCSETSW2 _IOW('T',0x2C, struct termios2)
|
||||
#define TCSETSF2 _IOW('T',0x2D, struct termios2)
|
||||
#define TIOCGPTN _IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */
|
||||
#define TIOCSPTLCK _IOW('T',0x31, int) /* Lock/unlock Pty */
|
||||
#define TCGETS2 _IOR('T', 0x2A, struct termios2)
|
||||
#define TCSETS2 _IOW('T', 0x2B, struct termios2)
|
||||
#define TCSETSW2 _IOW('T', 0x2C, struct termios2)
|
||||
#define TCSETSF2 _IOW('T', 0x2D, struct termios2)
|
||||
#define TIOCGPTN _IOR('T', 0x30, unsigned int)
|
||||
/* Get Pty Number (of pty-mux device) */
|
||||
#define TIOCSPTLCK _IOW('T', 0x31, int) /* Lock/unlock Pty */
|
||||
|
||||
#define FIONCLEX 0x5450
|
||||
#define FIOCLEX 0x5451
|
||||
|
||||
@@ -11,8 +11,7 @@
|
||||
* - 2 miscellaneous 32-bit values
|
||||
*/
|
||||
|
||||
struct ipc64_perm
|
||||
{
|
||||
struct ipc64_perm {
|
||||
__kernel_key_t key;
|
||||
__kernel_uid32_t uid;
|
||||
__kernel_gid32_t gid;
|
||||
|
||||
@@ -27,7 +27,8 @@
|
||||
* We use 'broadcast', CPU->CPU IPIs and self-IPIs too.
|
||||
*/
|
||||
|
||||
static inline unsigned int __prepare_ICR (unsigned int shortcut, int vector, unsigned int dest)
|
||||
static inline unsigned int __prepare_ICR(unsigned int shortcut, int vector,
|
||||
unsigned int dest)
|
||||
{
|
||||
unsigned int icr = shortcut | dest;
|
||||
|
||||
@@ -42,12 +43,13 @@ static inline unsigned int __prepare_ICR (unsigned int shortcut, int vector, uns
|
||||
return icr;
|
||||
}
|
||||
|
||||
static inline int __prepare_ICR2 (unsigned int mask)
|
||||
static inline int __prepare_ICR2(unsigned int mask)
|
||||
{
|
||||
return SET_APIC_DEST_FIELD(mask);
|
||||
}
|
||||
|
||||
static inline void __send_IPI_shortcut(unsigned int shortcut, int vector, unsigned int dest)
|
||||
static inline void __send_IPI_shortcut(unsigned int shortcut, int vector,
|
||||
unsigned int dest)
|
||||
{
|
||||
/*
|
||||
* Subtle. In the case of the 'never do double writes' workaround
|
||||
@@ -78,7 +80,8 @@ static inline void __send_IPI_shortcut(unsigned int shortcut, int vector, unsign
|
||||
* This is used to send an IPI with no shorthand notation (the destination is
|
||||
* specified in bits 56 to 63 of the ICR).
|
||||
*/
|
||||
static inline void __send_IPI_dest_field(unsigned int mask, int vector, unsigned int dest)
|
||||
static inline void __send_IPI_dest_field(unsigned int mask, int vector,
|
||||
unsigned int dest)
|
||||
{
|
||||
unsigned long cfg;
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
#include "irq_vectors.h"
|
||||
#include <asm/thread_info.h>
|
||||
|
||||
static __inline__ int irq_canonicalize(int irq)
|
||||
static inline int irq_canonicalize(int irq)
|
||||
{
|
||||
return ((irq == 2) ? 9 : irq);
|
||||
}
|
||||
|
||||
@@ -31,10 +31,10 @@
|
||||
|
||||
#define FIRST_SYSTEM_VECTOR 0xef /* duplicated in hw_irq.h */
|
||||
|
||||
#define NR_IRQS (NR_VECTORS + (32 *NR_CPUS))
|
||||
#define NR_IRQS (NR_VECTORS + (32 * NR_CPUS))
|
||||
#define NR_IRQ_VECTORS NR_IRQS
|
||||
|
||||
static __inline__ int irq_canonicalize(int irq)
|
||||
static inline int irq_canonicalize(int irq)
|
||||
{
|
||||
return ((irq == 2) ? 9 : irq);
|
||||
}
|
||||
|
||||
+13
-46
@@ -12,25 +12,21 @@ static inline unsigned long native_save_fl(void)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
__asm__ __volatile__(
|
||||
"# __raw_save_flags\n\t"
|
||||
"pushf ; pop %0"
|
||||
: "=g" (flags)
|
||||
: /* no input */
|
||||
: "memory"
|
||||
);
|
||||
asm volatile("# __raw_save_flags\n\t"
|
||||
"pushf ; pop %0"
|
||||
: "=g" (flags)
|
||||
: /* no input */
|
||||
: "memory");
|
||||
|
||||
return flags;
|
||||
}
|
||||
|
||||
static inline void native_restore_fl(unsigned long flags)
|
||||
{
|
||||
__asm__ __volatile__(
|
||||
"push %0 ; popf"
|
||||
: /* no output */
|
||||
:"g" (flags)
|
||||
:"memory", "cc"
|
||||
);
|
||||
asm volatile("push %0 ; popf"
|
||||
: /* no output */
|
||||
:"g" (flags)
|
||||
:"memory", "cc");
|
||||
}
|
||||
|
||||
static inline void native_irq_disable(void)
|
||||
@@ -70,26 +66,6 @@ static inline void raw_local_irq_restore(unsigned long flags)
|
||||
native_restore_fl(flags);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_X86_VSMP
|
||||
|
||||
/*
|
||||
* Interrupt control for the VSMP architecture:
|
||||
*/
|
||||
|
||||
static inline void raw_local_irq_disable(void)
|
||||
{
|
||||
unsigned long flags = __raw_local_save_flags();
|
||||
raw_local_irq_restore((flags & ~X86_EFLAGS_IF) | X86_EFLAGS_AC);
|
||||
}
|
||||
|
||||
static inline void raw_local_irq_enable(void)
|
||||
{
|
||||
unsigned long flags = __raw_local_save_flags();
|
||||
raw_local_irq_restore((flags | X86_EFLAGS_IF) & (~X86_EFLAGS_AC));
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static inline void raw_local_irq_disable(void)
|
||||
{
|
||||
native_irq_disable();
|
||||
@@ -100,8 +76,6 @@ static inline void raw_local_irq_enable(void)
|
||||
native_irq_enable();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Used in the idle loop; sti takes one instruction cycle
|
||||
* to complete:
|
||||
@@ -153,23 +127,16 @@ static inline unsigned long __raw_local_irq_save(void)
|
||||
#endif /* CONFIG_PARAVIRT */
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#define raw_local_save_flags(flags) \
|
||||
do { (flags) = __raw_local_save_flags(); } while (0)
|
||||
#define raw_local_save_flags(flags) \
|
||||
do { (flags) = __raw_local_save_flags(); } while (0)
|
||||
|
||||
#define raw_local_irq_save(flags) \
|
||||
do { (flags) = __raw_local_irq_save(); } while (0)
|
||||
#define raw_local_irq_save(flags) \
|
||||
do { (flags) = __raw_local_irq_save(); } while (0)
|
||||
|
||||
#ifdef CONFIG_X86_VSMP
|
||||
static inline int raw_irqs_disabled_flags(unsigned long flags)
|
||||
{
|
||||
return !(flags & X86_EFLAGS_IF) || (flags & X86_EFLAGS_AC);
|
||||
}
|
||||
#else
|
||||
static inline int raw_irqs_disabled_flags(unsigned long flags)
|
||||
{
|
||||
return !(flags & X86_EFLAGS_IF);
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline int raw_irqs_disabled(void)
|
||||
{
|
||||
|
||||
@@ -23,12 +23,12 @@ enum die_val {
|
||||
};
|
||||
|
||||
extern void printk_address(unsigned long address, int reliable);
|
||||
extern void die(const char *,struct pt_regs *,long);
|
||||
extern void die(const char *, struct pt_regs *,long);
|
||||
extern int __must_check __die(const char *, struct pt_regs *, long);
|
||||
extern void show_registers(struct pt_regs *regs);
|
||||
extern void __show_registers(struct pt_regs *, int all);
|
||||
extern void show_trace(struct task_struct *t, struct pt_regs *regs,
|
||||
unsigned long *sp, unsigned long bp);
|
||||
unsigned long *sp, unsigned long bp);
|
||||
extern void __show_regs(struct pt_regs *regs);
|
||||
extern void show_regs(struct pt_regs *regs);
|
||||
extern unsigned long oops_begin(void);
|
||||
|
||||
+35
-36
@@ -94,10 +94,9 @@ static inline void crash_fixup_ss_esp(struct pt_regs *newregs,
|
||||
{
|
||||
#ifdef CONFIG_X86_32
|
||||
newregs->sp = (unsigned long)&(oldregs->sp);
|
||||
__asm__ __volatile__(
|
||||
"xorl %%eax, %%eax\n\t"
|
||||
"movw %%ss, %%ax\n\t"
|
||||
:"=a"(newregs->ss));
|
||||
asm volatile("xorl %%eax, %%eax\n\t"
|
||||
"movw %%ss, %%ax\n\t"
|
||||
:"=a"(newregs->ss));
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -114,39 +113,39 @@ static inline void crash_setup_regs(struct pt_regs *newregs,
|
||||
crash_fixup_ss_esp(newregs, oldregs);
|
||||
} else {
|
||||
#ifdef CONFIG_X86_32
|
||||
__asm__ __volatile__("movl %%ebx,%0" : "=m"(newregs->bx));
|
||||
__asm__ __volatile__("movl %%ecx,%0" : "=m"(newregs->cx));
|
||||
__asm__ __volatile__("movl %%edx,%0" : "=m"(newregs->dx));
|
||||
__asm__ __volatile__("movl %%esi,%0" : "=m"(newregs->si));
|
||||
__asm__ __volatile__("movl %%edi,%0" : "=m"(newregs->di));
|
||||
__asm__ __volatile__("movl %%ebp,%0" : "=m"(newregs->bp));
|
||||
__asm__ __volatile__("movl %%eax,%0" : "=m"(newregs->ax));
|
||||
__asm__ __volatile__("movl %%esp,%0" : "=m"(newregs->sp));
|
||||
__asm__ __volatile__("movl %%ss, %%eax;" :"=a"(newregs->ss));
|
||||
__asm__ __volatile__("movl %%cs, %%eax;" :"=a"(newregs->cs));
|
||||
__asm__ __volatile__("movl %%ds, %%eax;" :"=a"(newregs->ds));
|
||||
__asm__ __volatile__("movl %%es, %%eax;" :"=a"(newregs->es));
|
||||
__asm__ __volatile__("pushfl; popl %0" :"=m"(newregs->flags));
|
||||
asm volatile("movl %%ebx,%0" : "=m"(newregs->bx));
|
||||
asm volatile("movl %%ecx,%0" : "=m"(newregs->cx));
|
||||
asm volatile("movl %%edx,%0" : "=m"(newregs->dx));
|
||||
asm volatile("movl %%esi,%0" : "=m"(newregs->si));
|
||||
asm volatile("movl %%edi,%0" : "=m"(newregs->di));
|
||||
asm volatile("movl %%ebp,%0" : "=m"(newregs->bp));
|
||||
asm volatile("movl %%eax,%0" : "=m"(newregs->ax));
|
||||
asm volatile("movl %%esp,%0" : "=m"(newregs->sp));
|
||||
asm volatile("movl %%ss, %%eax;" :"=a"(newregs->ss));
|
||||
asm volatile("movl %%cs, %%eax;" :"=a"(newregs->cs));
|
||||
asm volatile("movl %%ds, %%eax;" :"=a"(newregs->ds));
|
||||
asm volatile("movl %%es, %%eax;" :"=a"(newregs->es));
|
||||
asm volatile("pushfl; popl %0" :"=m"(newregs->flags));
|
||||
#else
|
||||
__asm__ __volatile__("movq %%rbx,%0" : "=m"(newregs->bx));
|
||||
__asm__ __volatile__("movq %%rcx,%0" : "=m"(newregs->cx));
|
||||
__asm__ __volatile__("movq %%rdx,%0" : "=m"(newregs->dx));
|
||||
__asm__ __volatile__("movq %%rsi,%0" : "=m"(newregs->si));
|
||||
__asm__ __volatile__("movq %%rdi,%0" : "=m"(newregs->di));
|
||||
__asm__ __volatile__("movq %%rbp,%0" : "=m"(newregs->bp));
|
||||
__asm__ __volatile__("movq %%rax,%0" : "=m"(newregs->ax));
|
||||
__asm__ __volatile__("movq %%rsp,%0" : "=m"(newregs->sp));
|
||||
__asm__ __volatile__("movq %%r8,%0" : "=m"(newregs->r8));
|
||||
__asm__ __volatile__("movq %%r9,%0" : "=m"(newregs->r9));
|
||||
__asm__ __volatile__("movq %%r10,%0" : "=m"(newregs->r10));
|
||||
__asm__ __volatile__("movq %%r11,%0" : "=m"(newregs->r11));
|
||||
__asm__ __volatile__("movq %%r12,%0" : "=m"(newregs->r12));
|
||||
__asm__ __volatile__("movq %%r13,%0" : "=m"(newregs->r13));
|
||||
__asm__ __volatile__("movq %%r14,%0" : "=m"(newregs->r14));
|
||||
__asm__ __volatile__("movq %%r15,%0" : "=m"(newregs->r15));
|
||||
__asm__ __volatile__("movl %%ss, %%eax;" :"=a"(newregs->ss));
|
||||
__asm__ __volatile__("movl %%cs, %%eax;" :"=a"(newregs->cs));
|
||||
__asm__ __volatile__("pushfq; popq %0" :"=m"(newregs->flags));
|
||||
asm volatile("movq %%rbx,%0" : "=m"(newregs->bx));
|
||||
asm volatile("movq %%rcx,%0" : "=m"(newregs->cx));
|
||||
asm volatile("movq %%rdx,%0" : "=m"(newregs->dx));
|
||||
asm volatile("movq %%rsi,%0" : "=m"(newregs->si));
|
||||
asm volatile("movq %%rdi,%0" : "=m"(newregs->di));
|
||||
asm volatile("movq %%rbp,%0" : "=m"(newregs->bp));
|
||||
asm volatile("movq %%rax,%0" : "=m"(newregs->ax));
|
||||
asm volatile("movq %%rsp,%0" : "=m"(newregs->sp));
|
||||
asm volatile("movq %%r8,%0" : "=m"(newregs->r8));
|
||||
asm volatile("movq %%r9,%0" : "=m"(newregs->r9));
|
||||
asm volatile("movq %%r10,%0" : "=m"(newregs->r10));
|
||||
asm volatile("movq %%r11,%0" : "=m"(newregs->r11));
|
||||
asm volatile("movq %%r12,%0" : "=m"(newregs->r12));
|
||||
asm volatile("movq %%r13,%0" : "=m"(newregs->r13));
|
||||
asm volatile("movq %%r14,%0" : "=m"(newregs->r14));
|
||||
asm volatile("movq %%r15,%0" : "=m"(newregs->r15));
|
||||
asm volatile("movl %%ss, %%eax;" :"=a"(newregs->ss));
|
||||
asm volatile("movl %%cs, %%eax;" :"=a"(newregs->cs));
|
||||
asm volatile("pushfq; popq %0" :"=m"(newregs->flags));
|
||||
#endif
|
||||
newregs->ip = (unsigned long)current_text_addr();
|
||||
}
|
||||
|
||||
@@ -35,12 +35,12 @@ typedef u8 kprobe_opcode_t;
|
||||
#define RELATIVEJUMP_INSTRUCTION 0xe9
|
||||
#define MAX_INSN_SIZE 16
|
||||
#define MAX_STACK_SIZE 64
|
||||
#define MIN_STACK_SIZE(ADDR) (((MAX_STACK_SIZE) < \
|
||||
(((unsigned long)current_thread_info()) + THREAD_SIZE \
|
||||
- (unsigned long)(ADDR))) \
|
||||
? (MAX_STACK_SIZE) \
|
||||
: (((unsigned long)current_thread_info()) + THREAD_SIZE \
|
||||
- (unsigned long)(ADDR)))
|
||||
#define MIN_STACK_SIZE(ADDR) \
|
||||
(((MAX_STACK_SIZE) < (((unsigned long)current_thread_info()) + \
|
||||
THREAD_SIZE - (unsigned long)(ADDR))) \
|
||||
? (MAX_STACK_SIZE) \
|
||||
: (((unsigned long)current_thread_info()) + \
|
||||
THREAD_SIZE - (unsigned long)(ADDR)))
|
||||
|
||||
#define flush_insn_slot(p) do { } while (0)
|
||||
|
||||
|
||||
+13
-11
@@ -22,15 +22,16 @@
|
||||
|
||||
#define CR3_PAE_RESERVED_BITS ((X86_CR3_PWT | X86_CR3_PCD) - 1)
|
||||
#define CR3_NONPAE_RESERVED_BITS ((PAGE_SIZE-1) & ~(X86_CR3_PWT | X86_CR3_PCD))
|
||||
#define CR3_L_MODE_RESERVED_BITS (CR3_NONPAE_RESERVED_BITS|0xFFFFFF0000000000ULL)
|
||||
#define CR3_L_MODE_RESERVED_BITS (CR3_NONPAE_RESERVED_BITS | \
|
||||
0xFFFFFF0000000000ULL)
|
||||
|
||||
#define KVM_GUEST_CR0_MASK \
|
||||
#define KVM_GUEST_CR0_MASK \
|
||||
(X86_CR0_PG | X86_CR0_PE | X86_CR0_WP | X86_CR0_NE \
|
||||
| X86_CR0_NW | X86_CR0_CD)
|
||||
#define KVM_VM_CR0_ALWAYS_ON \
|
||||
#define KVM_VM_CR0_ALWAYS_ON \
|
||||
(X86_CR0_PG | X86_CR0_PE | X86_CR0_WP | X86_CR0_NE | X86_CR0_TS \
|
||||
| X86_CR0_MP)
|
||||
#define KVM_GUEST_CR4_MASK \
|
||||
#define KVM_GUEST_CR4_MASK \
|
||||
(X86_CR4_VME | X86_CR4_PSE | X86_CR4_PAE | X86_CR4_PGE | X86_CR4_VMXE)
|
||||
#define KVM_PMODE_VM_CR4_ALWAYS_ON (X86_CR4_PAE | X86_CR4_VMXE)
|
||||
#define KVM_RMODE_VM_CR4_ALWAYS_ON (X86_CR4_VME | X86_CR4_PAE | X86_CR4_VMXE)
|
||||
@@ -133,12 +134,12 @@ struct kvm_pte_chain {
|
||||
union kvm_mmu_page_role {
|
||||
unsigned word;
|
||||
struct {
|
||||
unsigned glevels : 4;
|
||||
unsigned level : 4;
|
||||
unsigned quadrant : 2;
|
||||
unsigned pad_for_nice_hex_output : 6;
|
||||
unsigned metaphysical : 1;
|
||||
unsigned access : 3;
|
||||
unsigned glevels:4;
|
||||
unsigned level:4;
|
||||
unsigned quadrant:2;
|
||||
unsigned pad_for_nice_hex_output:6;
|
||||
unsigned metaphysical:1;
|
||||
unsigned access:3;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -606,6 +607,7 @@ static inline void kvm_inject_gp(struct kvm_vcpu *vcpu, u32 error_code)
|
||||
#define TSS_BASE_SIZE 0x68
|
||||
#define TSS_IOPB_SIZE (65536 / 8)
|
||||
#define TSS_REDIRECTION_SIZE (256 / 8)
|
||||
#define RMODE_TSS_SIZE (TSS_BASE_SIZE + TSS_REDIRECTION_SIZE + TSS_IOPB_SIZE + 1)
|
||||
#define RMODE_TSS_SIZE \
|
||||
(TSS_BASE_SIZE + TSS_REDIRECTION_SIZE + TSS_IOPB_SIZE + 1)
|
||||
|
||||
#endif
|
||||
|
||||
@@ -68,10 +68,10 @@ struct x86_emulate_ops {
|
||||
* @val: [OUT] Value read from memory, zero-extended to 'u_long'.
|
||||
* @bytes: [IN ] Number of bytes to read from memory.
|
||||
*/
|
||||
int (*read_emulated) (unsigned long addr,
|
||||
void *val,
|
||||
unsigned int bytes,
|
||||
struct kvm_vcpu *vcpu);
|
||||
int (*read_emulated)(unsigned long addr,
|
||||
void *val,
|
||||
unsigned int bytes,
|
||||
struct kvm_vcpu *vcpu);
|
||||
|
||||
/*
|
||||
* write_emulated: Read bytes from emulated/special memory area.
|
||||
@@ -80,10 +80,10 @@ struct x86_emulate_ops {
|
||||
* required).
|
||||
* @bytes: [IN ] Number of bytes to write to memory.
|
||||
*/
|
||||
int (*write_emulated) (unsigned long addr,
|
||||
const void *val,
|
||||
unsigned int bytes,
|
||||
struct kvm_vcpu *vcpu);
|
||||
int (*write_emulated)(unsigned long addr,
|
||||
const void *val,
|
||||
unsigned int bytes,
|
||||
struct kvm_vcpu *vcpu);
|
||||
|
||||
/*
|
||||
* cmpxchg_emulated: Emulate an atomic (LOCKed) CMPXCHG operation on an
|
||||
@@ -93,11 +93,11 @@ struct x86_emulate_ops {
|
||||
* @new: [IN ] Value to write to @addr.
|
||||
* @bytes: [IN ] Number of bytes to access using CMPXCHG.
|
||||
*/
|
||||
int (*cmpxchg_emulated) (unsigned long addr,
|
||||
const void *old,
|
||||
const void *new,
|
||||
unsigned int bytes,
|
||||
struct kvm_vcpu *vcpu);
|
||||
int (*cmpxchg_emulated)(unsigned long addr,
|
||||
const void *old,
|
||||
const void *new,
|
||||
unsigned int bytes,
|
||||
struct kvm_vcpu *vcpu);
|
||||
|
||||
};
|
||||
|
||||
@@ -143,7 +143,7 @@ struct x86_emulate_ctxt {
|
||||
/* Register state before/after emulation. */
|
||||
struct kvm_vcpu *vcpu;
|
||||
|
||||
/* Linear faulting address (if emulating a page-faulting instruction). */
|
||||
/* Linear faulting address (if emulating a page-faulting instruction) */
|
||||
unsigned long eflags;
|
||||
|
||||
/* Emulated execution mode, represented by an X86EMUL_MODE value. */
|
||||
|
||||
@@ -34,8 +34,7 @@ extern const char lgstart_iret[], lgend_iret[];
|
||||
extern void lguest_iret(void);
|
||||
extern void lguest_init(void);
|
||||
|
||||
struct lguest_regs
|
||||
{
|
||||
struct lguest_regs {
|
||||
/* Manually saved part. */
|
||||
unsigned long eax, ebx, ecx, edx;
|
||||
unsigned long esi, edi, ebp;
|
||||
@@ -51,8 +50,7 @@ struct lguest_regs
|
||||
};
|
||||
|
||||
/* This is a guest-specific page (mapped ro) into the guest. */
|
||||
struct lguest_ro_state
|
||||
{
|
||||
struct lguest_ro_state {
|
||||
/* Host information we need to restore when we switch back. */
|
||||
u32 host_cr3;
|
||||
struct desc_ptr host_idt_desc;
|
||||
@@ -67,8 +65,7 @@ struct lguest_ro_state
|
||||
struct desc_struct guest_gdt[GDT_ENTRIES];
|
||||
};
|
||||
|
||||
struct lg_cpu_arch
|
||||
{
|
||||
struct lg_cpu_arch {
|
||||
/* The GDT entries copied into lguest_ro_state when running. */
|
||||
struct desc_struct gdt[GDT_ENTRIES];
|
||||
|
||||
@@ -85,7 +82,7 @@ static inline void lguest_set_ts(void)
|
||||
|
||||
cr0 = read_cr0();
|
||||
if (!(cr0 & 8))
|
||||
write_cr0(cr0|8);
|
||||
write_cr0(cr0 | 8);
|
||||
}
|
||||
|
||||
/* Full 4G segment descriptors, suitable for CS and DS. */
|
||||
|
||||
@@ -46,7 +46,7 @@ hcall(unsigned long call,
|
||||
{
|
||||
/* "int" is the Intel instruction to trigger a trap. */
|
||||
asm volatile("int $" __stringify(LGUEST_TRAP_ENTRY)
|
||||
/* The call in %eax (aka "a") might be overwritten */
|
||||
/* The call in %eax (aka "a") might be overwritten */
|
||||
: "=a"(call)
|
||||
/* The arguments are in %eax, %edx, %ebx & %ecx */
|
||||
: "a"(call), "d"(arg1), "b"(arg2), "c"(arg3)
|
||||
@@ -62,8 +62,7 @@ hcall(unsigned long call,
|
||||
#define LGUEST_IRQS (NR_IRQS < 32 ? NR_IRQS: 32)
|
||||
|
||||
#define LHCALL_RING_SIZE 64
|
||||
struct hcall_args
|
||||
{
|
||||
struct hcall_args {
|
||||
/* These map directly onto eax, ebx, ecx, edx in struct lguest_regs */
|
||||
unsigned long arg0, arg2, arg3, arg1;
|
||||
};
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
#ifndef __ASM_LINKAGE_H
|
||||
#define __ASM_LINKAGE_H
|
||||
|
||||
#undef notrace
|
||||
#define notrace __attribute__((no_instrument_function))
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
#define __ALIGN .p2align 4,,15
|
||||
#define __ALIGN_STR ".p2align 4,,15"
|
||||
|
||||
+48
-53
@@ -18,32 +18,28 @@ typedef struct {
|
||||
|
||||
static inline void local_inc(local_t *l)
|
||||
{
|
||||
__asm__ __volatile__(
|
||||
_ASM_INC "%0"
|
||||
:"+m" (l->a.counter));
|
||||
asm volatile(_ASM_INC "%0"
|
||||
: "+m" (l->a.counter));
|
||||
}
|
||||
|
||||
static inline void local_dec(local_t *l)
|
||||
{
|
||||
__asm__ __volatile__(
|
||||
_ASM_DEC "%0"
|
||||
:"+m" (l->a.counter));
|
||||
asm volatile(_ASM_DEC "%0"
|
||||
: "+m" (l->a.counter));
|
||||
}
|
||||
|
||||
static inline void local_add(long i, local_t *l)
|
||||
{
|
||||
__asm__ __volatile__(
|
||||
_ASM_ADD "%1,%0"
|
||||
:"+m" (l->a.counter)
|
||||
:"ir" (i));
|
||||
asm volatile(_ASM_ADD "%1,%0"
|
||||
: "+m" (l->a.counter)
|
||||
: "ir" (i));
|
||||
}
|
||||
|
||||
static inline void local_sub(long i, local_t *l)
|
||||
{
|
||||
__asm__ __volatile__(
|
||||
_ASM_SUB "%1,%0"
|
||||
:"+m" (l->a.counter)
|
||||
:"ir" (i));
|
||||
asm volatile(_ASM_SUB "%1,%0"
|
||||
: "+m" (l->a.counter)
|
||||
: "ir" (i));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -59,10 +55,9 @@ static inline int local_sub_and_test(long i, local_t *l)
|
||||
{
|
||||
unsigned char c;
|
||||
|
||||
__asm__ __volatile__(
|
||||
_ASM_SUB "%2,%0; sete %1"
|
||||
:"+m" (l->a.counter), "=qm" (c)
|
||||
:"ir" (i) : "memory");
|
||||
asm volatile(_ASM_SUB "%2,%0; sete %1"
|
||||
: "+m" (l->a.counter), "=qm" (c)
|
||||
: "ir" (i) : "memory");
|
||||
return c;
|
||||
}
|
||||
|
||||
@@ -78,10 +73,9 @@ static inline int local_dec_and_test(local_t *l)
|
||||
{
|
||||
unsigned char c;
|
||||
|
||||
__asm__ __volatile__(
|
||||
_ASM_DEC "%0; sete %1"
|
||||
:"+m" (l->a.counter), "=qm" (c)
|
||||
: : "memory");
|
||||
asm volatile(_ASM_DEC "%0; sete %1"
|
||||
: "+m" (l->a.counter), "=qm" (c)
|
||||
: : "memory");
|
||||
return c != 0;
|
||||
}
|
||||
|
||||
@@ -97,10 +91,9 @@ static inline int local_inc_and_test(local_t *l)
|
||||
{
|
||||
unsigned char c;
|
||||
|
||||
__asm__ __volatile__(
|
||||
_ASM_INC "%0; sete %1"
|
||||
:"+m" (l->a.counter), "=qm" (c)
|
||||
: : "memory");
|
||||
asm volatile(_ASM_INC "%0; sete %1"
|
||||
: "+m" (l->a.counter), "=qm" (c)
|
||||
: : "memory");
|
||||
return c != 0;
|
||||
}
|
||||
|
||||
@@ -117,10 +110,9 @@ static inline int local_add_negative(long i, local_t *l)
|
||||
{
|
||||
unsigned char c;
|
||||
|
||||
__asm__ __volatile__(
|
||||
_ASM_ADD "%2,%0; sets %1"
|
||||
:"+m" (l->a.counter), "=qm" (c)
|
||||
:"ir" (i) : "memory");
|
||||
asm volatile(_ASM_ADD "%2,%0; sets %1"
|
||||
: "+m" (l->a.counter), "=qm" (c)
|
||||
: "ir" (i) : "memory");
|
||||
return c;
|
||||
}
|
||||
|
||||
@@ -141,10 +133,9 @@ static inline long local_add_return(long i, local_t *l)
|
||||
#endif
|
||||
/* Modern 486+ processor */
|
||||
__i = i;
|
||||
__asm__ __volatile__(
|
||||
_ASM_XADD "%0, %1;"
|
||||
:"+r" (i), "+m" (l->a.counter)
|
||||
: : "memory");
|
||||
asm volatile(_ASM_XADD "%0, %1;"
|
||||
: "+r" (i), "+m" (l->a.counter)
|
||||
: : "memory");
|
||||
return i + __i;
|
||||
|
||||
#ifdef CONFIG_M386
|
||||
@@ -182,11 +173,11 @@ static inline long local_sub_return(long i, local_t *l)
|
||||
#define local_add_unless(l, a, u) \
|
||||
({ \
|
||||
long c, old; \
|
||||
c = local_read(l); \
|
||||
c = local_read((l)); \
|
||||
for (;;) { \
|
||||
if (unlikely(c == (u))) \
|
||||
break; \
|
||||
old = local_cmpxchg((l), c, c + (a)); \
|
||||
old = local_cmpxchg((l), c, c + (a)); \
|
||||
if (likely(old == c)) \
|
||||
break; \
|
||||
c = old; \
|
||||
@@ -214,26 +205,30 @@ static inline long local_sub_return(long i, local_t *l)
|
||||
|
||||
/* Need to disable preemption for the cpu local counters otherwise we could
|
||||
still access a variable of a previous CPU in a non atomic way. */
|
||||
#define cpu_local_wrap_v(l) \
|
||||
({ local_t res__; \
|
||||
preempt_disable(); \
|
||||
res__ = (l); \
|
||||
preempt_enable(); \
|
||||
res__; })
|
||||
#define cpu_local_wrap_v(l) \
|
||||
({ \
|
||||
local_t res__; \
|
||||
preempt_disable(); \
|
||||
res__ = (l); \
|
||||
preempt_enable(); \
|
||||
res__; \
|
||||
})
|
||||
#define cpu_local_wrap(l) \
|
||||
({ preempt_disable(); \
|
||||
l; \
|
||||
preempt_enable(); }) \
|
||||
({ \
|
||||
preempt_disable(); \
|
||||
(l); \
|
||||
preempt_enable(); \
|
||||
}) \
|
||||
|
||||
#define cpu_local_read(l) cpu_local_wrap_v(local_read(&__get_cpu_var(l)))
|
||||
#define cpu_local_set(l, i) cpu_local_wrap(local_set(&__get_cpu_var(l), (i)))
|
||||
#define cpu_local_inc(l) cpu_local_wrap(local_inc(&__get_cpu_var(l)))
|
||||
#define cpu_local_dec(l) cpu_local_wrap(local_dec(&__get_cpu_var(l)))
|
||||
#define cpu_local_add(i, l) cpu_local_wrap(local_add((i), &__get_cpu_var(l)))
|
||||
#define cpu_local_sub(i, l) cpu_local_wrap(local_sub((i), &__get_cpu_var(l)))
|
||||
#define cpu_local_read(l) cpu_local_wrap_v(local_read(&__get_cpu_var((l))))
|
||||
#define cpu_local_set(l, i) cpu_local_wrap(local_set(&__get_cpu_var((l)), (i)))
|
||||
#define cpu_local_inc(l) cpu_local_wrap(local_inc(&__get_cpu_var((l))))
|
||||
#define cpu_local_dec(l) cpu_local_wrap(local_dec(&__get_cpu_var((l))))
|
||||
#define cpu_local_add(i, l) cpu_local_wrap(local_add((i), &__get_cpu_var((l))))
|
||||
#define cpu_local_sub(i, l) cpu_local_wrap(local_sub((i), &__get_cpu_var((l))))
|
||||
|
||||
#define __cpu_local_inc(l) cpu_local_inc(l)
|
||||
#define __cpu_local_dec(l) cpu_local_dec(l)
|
||||
#define __cpu_local_inc(l) cpu_local_inc((l))
|
||||
#define __cpu_local_dec(l) cpu_local_dec((l))
|
||||
#define __cpu_local_add(i, l) cpu_local_add((i), (l))
|
||||
#define __cpu_local_sub(i, l) cpu_local_sub((i), (l))
|
||||
|
||||
|
||||
@@ -1,10 +1,7 @@
|
||||
#ifndef __ASM_MACH_APIC_H
|
||||
#define __ASM_MACH_APIC_H
|
||||
|
||||
|
||||
extern u8 bios_cpu_apicid[];
|
||||
|
||||
#define xapic_phys_to_log_apicid(cpu) (bios_cpu_apicid[cpu])
|
||||
#define xapic_phys_to_log_apicid(cpu) (per_cpu(x86_bios_cpu_apicid, cpu))
|
||||
#define esr_disable (1)
|
||||
|
||||
static inline int apic_id_registered(void)
|
||||
@@ -90,7 +87,7 @@ static inline int apicid_to_node(int logical_apicid)
|
||||
static inline int cpu_present_to_apicid(int mps_cpu)
|
||||
{
|
||||
if (mps_cpu < NR_CPUS)
|
||||
return (int) bios_cpu_apicid[mps_cpu];
|
||||
return (int) per_cpu(x86_bios_cpu_apicid, mps_cpu);
|
||||
|
||||
return BAD_APICID;
|
||||
}
|
||||
@@ -109,17 +106,6 @@ static inline int cpu_to_logical_apicid(int cpu)
|
||||
return cpu_physical_id(cpu);
|
||||
}
|
||||
|
||||
static inline int mpc_apic_id(struct mpc_config_processor *m,
|
||||
struct mpc_config_translation *translation_record)
|
||||
{
|
||||
printk("Processor #%d %u:%u APIC version %d\n",
|
||||
m->mpc_apicid,
|
||||
(m->mpc_cpufeature & CPU_FAMILY_MASK) >> 8,
|
||||
(m->mpc_cpufeature & CPU_MODEL_MASK) >> 4,
|
||||
m->mpc_apicver);
|
||||
return m->mpc_apicid;
|
||||
}
|
||||
|
||||
static inline physid_mask_t ioapic_phys_id_map(physid_mask_t phys_map)
|
||||
{
|
||||
/* For clustered we don't have a good way to do this yet - hack */
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
#ifndef __ASM_MACH_APIC_H
|
||||
#define __ASM_MACH_APIC_H
|
||||
|
||||
#ifdef CONFIG_X86_LOCAL_APIC
|
||||
|
||||
#include <mach_apicdef.h>
|
||||
#include <asm/smp.h>
|
||||
|
||||
@@ -14,24 +16,25 @@ static inline cpumask_t target_cpus(void)
|
||||
return cpumask_of_cpu(0);
|
||||
#endif
|
||||
}
|
||||
#define TARGET_CPUS (target_cpus())
|
||||
|
||||
#define NO_BALANCE_IRQ (0)
|
||||
#define esr_disable (0)
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
#include <asm/genapic.h>
|
||||
#define INT_DELIVERY_MODE (genapic->int_delivery_mode)
|
||||
#define INT_DEST_MODE (genapic->int_dest_mode)
|
||||
#define TARGET_CPUS (genapic->target_cpus())
|
||||
#define apic_id_registered (genapic->apic_id_registered)
|
||||
#define init_apic_ldr (genapic->init_apic_ldr)
|
||||
#define cpu_mask_to_apicid (genapic->cpu_mask_to_apicid)
|
||||
#define phys_pkg_id (genapic->phys_pkg_id)
|
||||
#define vector_allocation_domain (genapic->vector_allocation_domain)
|
||||
extern void setup_apic_routing(void);
|
||||
#else
|
||||
#define INT_DELIVERY_MODE dest_LowestPrio
|
||||
#define INT_DEST_MODE 1 /* logical delivery broadcast to all procs */
|
||||
|
||||
static inline unsigned long check_apicid_used(physid_mask_t bitmap, int apicid)
|
||||
{
|
||||
return physid_isset(apicid, bitmap);
|
||||
}
|
||||
|
||||
static inline unsigned long check_apicid_present(int bit)
|
||||
{
|
||||
return physid_isset(bit, phys_cpu_present_map);
|
||||
}
|
||||
|
||||
#define TARGET_CPUS (target_cpus())
|
||||
/*
|
||||
* Set up the logical destination ID.
|
||||
*
|
||||
@@ -49,27 +52,55 @@ static inline void init_apic_ldr(void)
|
||||
apic_write_around(APIC_LDR, val);
|
||||
}
|
||||
|
||||
static inline int apic_id_registered(void)
|
||||
{
|
||||
return physid_isset(GET_APIC_ID(read_apic_id()), phys_cpu_present_map);
|
||||
}
|
||||
|
||||
static inline unsigned int cpu_mask_to_apicid(cpumask_t cpumask)
|
||||
{
|
||||
return cpus_addr(cpumask)[0];
|
||||
}
|
||||
|
||||
static inline u32 phys_pkg_id(u32 cpuid_apic, int index_msb)
|
||||
{
|
||||
return cpuid_apic >> index_msb;
|
||||
}
|
||||
|
||||
static inline void setup_apic_routing(void)
|
||||
{
|
||||
#ifdef CONFIG_X86_IO_APIC
|
||||
printk("Enabling APIC mode: %s. Using %d I/O APICs\n",
|
||||
"Flat", nr_ioapics);
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline int apicid_to_node(int logical_apicid)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline unsigned long check_apicid_used(physid_mask_t bitmap, int apicid)
|
||||
{
|
||||
return physid_isset(apicid, bitmap);
|
||||
}
|
||||
|
||||
static inline unsigned long check_apicid_present(int bit)
|
||||
{
|
||||
return physid_isset(bit, phys_cpu_present_map);
|
||||
}
|
||||
|
||||
static inline physid_mask_t ioapic_phys_id_map(physid_mask_t phys_map)
|
||||
{
|
||||
return phys_map;
|
||||
}
|
||||
|
||||
static inline void setup_apic_routing(void)
|
||||
{
|
||||
printk("Enabling APIC mode: %s. Using %d I/O APICs\n",
|
||||
"Flat", nr_ioapics);
|
||||
}
|
||||
|
||||
static inline int multi_timer_check(int apic, int irq)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int apicid_to_node(int logical_apicid)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Mapping from cpu number to logical apicid */
|
||||
static inline int cpu_to_logical_apicid(int cpu)
|
||||
{
|
||||
@@ -78,8 +109,13 @@ static inline int cpu_to_logical_apicid(int cpu)
|
||||
|
||||
static inline int cpu_present_to_apicid(int mps_cpu)
|
||||
{
|
||||
#ifdef CONFIG_X86_64
|
||||
if (cpu_present(mps_cpu))
|
||||
return (int)per_cpu(x86_bios_cpu_apicid, mps_cpu);
|
||||
#else
|
||||
if (mps_cpu < get_physical_broadcast())
|
||||
return mps_cpu;
|
||||
#endif
|
||||
else
|
||||
return BAD_APICID;
|
||||
}
|
||||
@@ -89,17 +125,6 @@ static inline physid_mask_t apicid_to_cpu_present(int phys_apicid)
|
||||
return physid_mask_of_physid(phys_apicid);
|
||||
}
|
||||
|
||||
static inline int mpc_apic_id(struct mpc_config_processor *m,
|
||||
struct mpc_config_translation *translation_record)
|
||||
{
|
||||
printk("Processor #%d %u:%u APIC version %d\n",
|
||||
m->mpc_apicid,
|
||||
(m->mpc_cpufeature & CPU_FAMILY_MASK) >> 8,
|
||||
(m->mpc_cpufeature & CPU_MODEL_MASK) >> 4,
|
||||
m->mpc_apicver);
|
||||
return m->mpc_apicid;
|
||||
}
|
||||
|
||||
static inline void setup_portio_remap(void)
|
||||
{
|
||||
}
|
||||
@@ -109,23 +134,9 @@ static inline int check_phys_apicid_present(int boot_cpu_physical_apicid)
|
||||
return physid_isset(boot_cpu_physical_apicid, phys_cpu_present_map);
|
||||
}
|
||||
|
||||
static inline int apic_id_registered(void)
|
||||
{
|
||||
return physid_isset(GET_APIC_ID(apic_read(APIC_ID)), phys_cpu_present_map);
|
||||
}
|
||||
|
||||
static inline unsigned int cpu_mask_to_apicid(cpumask_t cpumask)
|
||||
{
|
||||
return cpus_addr(cpumask)[0];
|
||||
}
|
||||
|
||||
static inline void enable_apic_mode(void)
|
||||
{
|
||||
}
|
||||
|
||||
static inline u32 phys_pkg_id(u32 cpuid_apic, int index_msb)
|
||||
{
|
||||
return cpuid_apic >> index_msb;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_X86_LOCAL_APIC */
|
||||
#endif /* __ASM_MACH_APIC_H */
|
||||
|
||||
@@ -3,10 +3,14 @@
|
||||
|
||||
#include <asm/apic.h>
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
#define APIC_ID_MASK (0xFFu<<24)
|
||||
#define GET_APIC_ID(x) (((x)>>24)&0xFFu)
|
||||
#define SET_APIC_ID(x) (((x)<<24))
|
||||
#else
|
||||
#define APIC_ID_MASK (0xF<<24)
|
||||
|
||||
static inline unsigned get_apic_id(unsigned long x)
|
||||
{
|
||||
{
|
||||
unsigned int ver = GET_APIC_VERSION(apic_read(APIC_LVR));
|
||||
if (APIC_XAPIC(ver))
|
||||
return (((x)>>24)&0xFF);
|
||||
@@ -15,5 +19,6 @@ static inline unsigned get_apic_id(unsigned long x)
|
||||
}
|
||||
|
||||
#define GET_APIC_ID(x) get_apic_id(x)
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
@@ -9,10 +9,15 @@ void __send_IPI_shortcut(unsigned int shortcut, int vector);
|
||||
|
||||
extern int no_broadcast;
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
#include <asm/genapic.h>
|
||||
#define send_IPI_mask (genapic->send_IPI_mask)
|
||||
#else
|
||||
static inline void send_IPI_mask(cpumask_t mask, int vector)
|
||||
{
|
||||
send_IPI_mask_bitmask(mask, vector);
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline void __local_send_IPI_allbutself(int vector)
|
||||
{
|
||||
@@ -33,6 +38,10 @@ static inline void __local_send_IPI_all(int vector)
|
||||
__send_IPI_shortcut(APIC_DEST_ALLINC, vector);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
#define send_IPI_allbutself (genapic->send_IPI_allbutself)
|
||||
#define send_IPI_all (genapic->send_IPI_all)
|
||||
#else
|
||||
static inline void send_IPI_allbutself(int vector)
|
||||
{
|
||||
/*
|
||||
@@ -50,5 +59,6 @@ static inline void send_IPI_all(int vector)
|
||||
{
|
||||
__local_send_IPI_all(vector);
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __ASM_MACH_IPI_H */
|
||||
|
||||
@@ -1,17 +1,6 @@
|
||||
#ifndef __ASM_MACH_MPPARSE_H
|
||||
#define __ASM_MACH_MPPARSE_H
|
||||
|
||||
static inline void mpc_oem_bus_info(struct mpc_config_bus *m, char *name,
|
||||
struct mpc_config_translation *translation)
|
||||
{
|
||||
// Dprintk("Bus #%d is %s\n", m->mpc_busid, name);
|
||||
}
|
||||
|
||||
static inline void mpc_oem_pci_bus(struct mpc_config_bus *m,
|
||||
struct mpc_config_translation *translation)
|
||||
{
|
||||
}
|
||||
|
||||
static inline int mps_oem_check(struct mp_config_table *mpc, char *oem,
|
||||
char *productid)
|
||||
{
|
||||
|
||||
@@ -1,61 +0,0 @@
|
||||
/*
|
||||
* arch/i386/mach-generic/mach_reboot.h
|
||||
*
|
||||
* Machine specific reboot functions for generic.
|
||||
* Split out from reboot.c by Osamu Tomita <tomita@cinet.co.jp>
|
||||
*/
|
||||
#ifndef _MACH_REBOOT_H
|
||||
#define _MACH_REBOOT_H
|
||||
|
||||
static inline void kb_wait(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 0x10000; i++)
|
||||
if ((inb_p(0x64) & 0x02) == 0)
|
||||
break;
|
||||
}
|
||||
|
||||
static inline void mach_reboot(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* old method, works on most machines */
|
||||
for (i = 0; i < 10; i++) {
|
||||
kb_wait();
|
||||
udelay(50);
|
||||
outb(0xfe, 0x64); /* pulse reset low */
|
||||
udelay(50);
|
||||
}
|
||||
|
||||
/* New method: sets the "System flag" which, when set, indicates
|
||||
* successful completion of the keyboard controller self-test (Basic
|
||||
* Assurance Test, BAT). This is needed for some machines with no
|
||||
* keyboard plugged in. This read-modify-write sequence sets only the
|
||||
* system flag
|
||||
*/
|
||||
for (i = 0; i < 10; i++) {
|
||||
int cmd;
|
||||
|
||||
outb(0x20, 0x64); /* read Controller Command Byte */
|
||||
udelay(50);
|
||||
kb_wait();
|
||||
udelay(50);
|
||||
cmd = inb(0x60);
|
||||
udelay(50);
|
||||
kb_wait();
|
||||
udelay(50);
|
||||
outb(0x60, 0x64); /* write Controller Command Byte */
|
||||
udelay(50);
|
||||
kb_wait();
|
||||
udelay(50);
|
||||
outb(cmd | 0x14, 0x60); /* set "System flag" and "Keyboard Disabled" */
|
||||
udelay(50);
|
||||
kb_wait();
|
||||
udelay(50);
|
||||
outb(0xfe, 0x64); /* pulse reset low */
|
||||
udelay(50);
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* !_MACH_REBOOT_H */
|
||||
@@ -41,4 +41,11 @@ static inline void smpboot_setup_io_apic(void)
|
||||
*/
|
||||
if (!skip_ioapic_setup && nr_ioapics)
|
||||
setup_IO_APIC();
|
||||
else
|
||||
nr_ioapics = 0;
|
||||
}
|
||||
|
||||
static inline void smpboot_clear_io_apic(void)
|
||||
{
|
||||
nr_ioapics = 0;
|
||||
}
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
#ifndef __ASM_MACH_APIC_H
|
||||
#define __ASM_MACH_APIC_H
|
||||
|
||||
extern u8 bios_cpu_apicid[];
|
||||
|
||||
#define xapic_phys_to_log_apicid(cpu) (bios_cpu_apicid[cpu])
|
||||
#define xapic_phys_to_log_apicid(cpu) per_cpu(x86_bios_cpu_apicid, cpu)
|
||||
#define esr_disable (1)
|
||||
|
||||
static inline int apic_id_registered(void)
|
||||
@@ -80,7 +78,7 @@ extern void enable_apic_mode(void);
|
||||
extern int apic_version [MAX_APICS];
|
||||
static inline void setup_apic_routing(void)
|
||||
{
|
||||
int apic = bios_cpu_apicid[smp_processor_id()];
|
||||
int apic = per_cpu(x86_bios_cpu_apicid, smp_processor_id());
|
||||
printk("Enabling APIC mode: %s. Using %d I/O APICs, target cpus %lx\n",
|
||||
(apic_version[apic] == 0x14) ?
|
||||
"Physical Cluster" : "Logical Cluster", nr_ioapics, cpus_addr(TARGET_CPUS)[0]);
|
||||
@@ -102,7 +100,7 @@ static inline int cpu_present_to_apicid(int mps_cpu)
|
||||
if (!mps_cpu)
|
||||
return boot_cpu_physical_apicid;
|
||||
else if (mps_cpu < NR_CPUS)
|
||||
return (int) bios_cpu_apicid[mps_cpu];
|
||||
return (int) per_cpu(x86_bios_cpu_apicid, mps_cpu);
|
||||
else
|
||||
return BAD_APICID;
|
||||
}
|
||||
@@ -129,16 +127,6 @@ static inline int cpu_to_logical_apicid(int cpu)
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline int mpc_apic_id(struct mpc_config_processor *m, struct mpc_config_translation *unused)
|
||||
{
|
||||
printk("Processor #%d %u:%u APIC version %d\n",
|
||||
m->mpc_apicid,
|
||||
(m->mpc_cpufeature & CPU_FAMILY_MASK) >> 8,
|
||||
(m->mpc_cpufeature & CPU_MODEL_MASK) >> 4,
|
||||
m->mpc_apicver);
|
||||
return (m->mpc_apicid);
|
||||
}
|
||||
|
||||
static inline physid_mask_t ioapic_phys_id_map(physid_mask_t phys_map)
|
||||
{
|
||||
/* For clustered we don't have a good way to do this yet - hack */
|
||||
@@ -153,7 +141,7 @@ static inline void setup_portio_remap(void)
|
||||
extern unsigned int boot_cpu_physical_apicid;
|
||||
static inline int check_phys_apicid_present(int cpu_physical_apicid)
|
||||
{
|
||||
boot_cpu_physical_apicid = GET_APIC_ID(apic_read(APIC_ID));
|
||||
boot_cpu_physical_apicid = GET_APIC_ID(read_apic_id());
|
||||
return (1);
|
||||
}
|
||||
|
||||
|
||||
@@ -3,17 +3,6 @@
|
||||
|
||||
#include <linux/acpi.h>
|
||||
|
||||
static inline void mpc_oem_bus_info(struct mpc_config_bus *m, char *name,
|
||||
struct mpc_config_translation *translation)
|
||||
{
|
||||
Dprintk("Bus #%d is %s\n", m->mpc_busid, name);
|
||||
}
|
||||
|
||||
static inline void mpc_oem_pci_bus(struct mpc_config_bus *m,
|
||||
struct mpc_config_translation *translation)
|
||||
{
|
||||
}
|
||||
|
||||
extern int parse_unisys_oem (char *oemptr);
|
||||
extern int find_unisys_acpi_oem_table(unsigned long *oem_addr);
|
||||
extern void setup_unisys(void);
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
#define cpu_to_logical_apicid (genapic->cpu_to_logical_apicid)
|
||||
#define cpu_present_to_apicid (genapic->cpu_present_to_apicid)
|
||||
#define apicid_to_cpu_present (genapic->apicid_to_cpu_present)
|
||||
#define mpc_apic_id (genapic->mpc_apic_id)
|
||||
#define setup_portio_remap (genapic->setup_portio_remap)
|
||||
#define check_apicid_present (genapic->check_apicid_present)
|
||||
#define check_phys_apicid_present (genapic->check_phys_apicid_present)
|
||||
|
||||
@@ -1,11 +1,6 @@
|
||||
#ifndef _MACH_MPPARSE_H
|
||||
#define _MACH_MPPARSE_H 1
|
||||
|
||||
#include <asm/genapic.h>
|
||||
|
||||
#define mpc_oem_bus_info (genapic->mpc_oem_bus_info)
|
||||
#define mpc_oem_pci_bus (genapic->mpc_oem_pci_bus)
|
||||
|
||||
int mps_oem_check(struct mp_config_table *mpc, char *oem, char *productid);
|
||||
int acpi_madt_oem_check(char *oem_id, char *oem_table_id);
|
||||
|
||||
|
||||
@@ -95,6 +95,16 @@ static inline physid_mask_t apicid_to_cpu_present(int logical_apicid)
|
||||
return physid_mask_of_physid(cpu + 4*node);
|
||||
}
|
||||
|
||||
struct mpc_config_translation {
|
||||
unsigned char mpc_type;
|
||||
unsigned char trans_len;
|
||||
unsigned char trans_type;
|
||||
unsigned char trans_quad;
|
||||
unsigned char trans_global;
|
||||
unsigned char trans_local;
|
||||
unsigned short trans_reserved;
|
||||
};
|
||||
|
||||
static inline int mpc_apic_id(struct mpc_config_processor *m,
|
||||
struct mpc_config_translation *translation_record)
|
||||
{
|
||||
|
||||
@@ -1,25 +1,10 @@
|
||||
#ifndef __ASM_MACH_MPPARSE_H
|
||||
#define __ASM_MACH_MPPARSE_H
|
||||
|
||||
static inline void mpc_oem_bus_info(struct mpc_config_bus *m, char *name,
|
||||
struct mpc_config_translation *translation)
|
||||
{
|
||||
int quad = translation->trans_quad;
|
||||
int local = translation->trans_local;
|
||||
|
||||
mp_bus_id_to_node[m->mpc_busid] = quad;
|
||||
mp_bus_id_to_local[m->mpc_busid] = local;
|
||||
printk("Bus #%d is %s (node %d)\n", m->mpc_busid, name, quad);
|
||||
}
|
||||
|
||||
static inline void mpc_oem_pci_bus(struct mpc_config_bus *m,
|
||||
struct mpc_config_translation *translation)
|
||||
{
|
||||
int quad = translation->trans_quad;
|
||||
int local = translation->trans_local;
|
||||
|
||||
quad_local_to_mp_bus_id[quad][local] = m->mpc_busid;
|
||||
}
|
||||
extern void mpc_oem_bus_info(struct mpc_config_bus *m, char *name,
|
||||
struct mpc_config_translation *translation);
|
||||
extern void mpc_oem_pci_bus(struct mpc_config_bus *m,
|
||||
struct mpc_config_translation *translation);
|
||||
|
||||
/* Hook from generic ACPI tables.c */
|
||||
static inline void acpi_madt_oem_check(char *oem_id, char *oem_table_id)
|
||||
|
||||
@@ -40,7 +40,6 @@ static inline unsigned long check_apicid_present(int bit)
|
||||
|
||||
#define apicid_cluster(apicid) ((apicid) & XAPIC_DEST_CLUSTER_MASK)
|
||||
|
||||
extern u8 bios_cpu_apicid[];
|
||||
extern u8 cpu_2_logical_apicid[];
|
||||
|
||||
static inline void init_apic_ldr(void)
|
||||
@@ -110,7 +109,7 @@ static inline int cpu_to_logical_apicid(int cpu)
|
||||
static inline int cpu_present_to_apicid(int mps_cpu)
|
||||
{
|
||||
if (mps_cpu < NR_CPUS)
|
||||
return (int)bios_cpu_apicid[mps_cpu];
|
||||
return (int)per_cpu(x86_bios_cpu_apicid, mps_cpu);
|
||||
else
|
||||
return BAD_APICID;
|
||||
}
|
||||
@@ -126,17 +125,6 @@ static inline physid_mask_t apicid_to_cpu_present(int apicid)
|
||||
return physid_mask_of_physid(0);
|
||||
}
|
||||
|
||||
static inline int mpc_apic_id(struct mpc_config_processor *m,
|
||||
struct mpc_config_translation *translation_record)
|
||||
{
|
||||
printk("Processor #%d %u:%u APIC version %d\n",
|
||||
m->mpc_apicid,
|
||||
(m->mpc_cpufeature & CPU_FAMILY_MASK) >> 8,
|
||||
(m->mpc_cpufeature & CPU_MODEL_MASK) >> 4,
|
||||
m->mpc_apicver);
|
||||
return m->mpc_apicid;
|
||||
}
|
||||
|
||||
static inline void setup_portio_remap(void)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -12,17 +12,6 @@ extern void setup_summit(void);
|
||||
#define setup_summit() {}
|
||||
#endif
|
||||
|
||||
static inline void mpc_oem_bus_info(struct mpc_config_bus *m, char *name,
|
||||
struct mpc_config_translation *translation)
|
||||
{
|
||||
Dprintk("Bus #%d is %s\n", m->mpc_busid, name);
|
||||
}
|
||||
|
||||
static inline void mpc_oem_pci_bus(struct mpc_config_bus *m,
|
||||
struct mpc_config_translation *translation)
|
||||
{
|
||||
}
|
||||
|
||||
static inline int mps_oem_check(struct mp_config_table *mpc, char *oem,
|
||||
char *productid)
|
||||
{
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
|
||||
static inline int apic_id_registered(void)
|
||||
{
|
||||
return physid_isset(GET_APIC_ID(apic_read(APIC_ID)), phys_cpu_present_map);
|
||||
return physid_isset(GET_APIC_ID(read_apic_id()), phys_cpu_present_map);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -22,3 +22,7 @@ static inline void smpboot_restore_warm_reset_vector(void)
|
||||
static inline void smpboot_setup_io_apic(void)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void smpboot_clear_io_apic(void)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
#ifndef __ASM_MACH_APIC_H
|
||||
#define __ASM_MACH_APIC_H
|
||||
|
||||
/*
|
||||
* Copyright 2004 James Cleverdon, IBM.
|
||||
* Subject to the GNU Public License, v.2
|
||||
*
|
||||
* Generic APIC sub-arch defines.
|
||||
*
|
||||
* Hacked for x86-64 by James Cleverdon from i386 architecture code by
|
||||
* Martin Bligh, Andi Kleen, James Bottomley, John Stultz, and
|
||||
* James Cleverdon.
|
||||
*/
|
||||
|
||||
#include <asm/genapic.h>
|
||||
|
||||
#define INT_DELIVERY_MODE (genapic->int_delivery_mode)
|
||||
#define INT_DEST_MODE (genapic->int_dest_mode)
|
||||
#define TARGET_CPUS (genapic->target_cpus())
|
||||
#define vector_allocation_domain (genapic->vector_allocation_domain)
|
||||
#define apic_id_registered (genapic->apic_id_registered)
|
||||
#define init_apic_ldr (genapic->init_apic_ldr)
|
||||
#define send_IPI_mask (genapic->send_IPI_mask)
|
||||
#define send_IPI_allbutself (genapic->send_IPI_allbutself)
|
||||
#define send_IPI_all (genapic->send_IPI_all)
|
||||
#define cpu_mask_to_apicid (genapic->cpu_mask_to_apicid)
|
||||
#define phys_pkg_id (genapic->phys_pkg_id)
|
||||
|
||||
#endif /* __ASM_MACH_APIC_H */
|
||||
@@ -42,7 +42,7 @@ extern volatile unsigned long cmos_lock;
|
||||
static inline void lock_cmos(unsigned char reg)
|
||||
{
|
||||
unsigned long new;
|
||||
new = ((smp_processor_id()+1) << 8) | reg;
|
||||
new = ((smp_processor_id() + 1) << 8) | reg;
|
||||
for (;;) {
|
||||
if (cmos_lock) {
|
||||
cpu_relax();
|
||||
@@ -57,22 +57,26 @@ static inline void unlock_cmos(void)
|
||||
{
|
||||
cmos_lock = 0;
|
||||
}
|
||||
|
||||
static inline int do_i_have_lock_cmos(void)
|
||||
{
|
||||
return (cmos_lock >> 8) == (smp_processor_id()+1);
|
||||
return (cmos_lock >> 8) == (smp_processor_id() + 1);
|
||||
}
|
||||
|
||||
static inline unsigned char current_lock_cmos_reg(void)
|
||||
{
|
||||
return cmos_lock & 0xff;
|
||||
}
|
||||
#define lock_cmos_prefix(reg) \
|
||||
|
||||
#define lock_cmos_prefix(reg) \
|
||||
do { \
|
||||
unsigned long cmos_flags; \
|
||||
local_irq_save(cmos_flags); \
|
||||
lock_cmos(reg)
|
||||
#define lock_cmos_suffix(reg) \
|
||||
unlock_cmos(); \
|
||||
local_irq_restore(cmos_flags); \
|
||||
|
||||
#define lock_cmos_suffix(reg) \
|
||||
unlock_cmos(); \
|
||||
local_irq_restore(cmos_flags); \
|
||||
} while (0)
|
||||
#else
|
||||
#define lock_cmos_prefix(reg) do {} while (0)
|
||||
|
||||
+17
-17
@@ -12,18 +12,18 @@
|
||||
* count by 2 when using 16-bit dma; that is not handled by these functions.
|
||||
*
|
||||
* Ramen Noodles are yummy.
|
||||
*
|
||||
* 1998 Tymm Twillman <tymm@computer.org>
|
||||
*
|
||||
* 1998 Tymm Twillman <tymm@computer.org>
|
||||
*/
|
||||
|
||||
/*
|
||||
* Registers that are used by the DMA controller; FN is the function register
|
||||
* Registers that are used by the DMA controller; FN is the function register
|
||||
* (tell the controller what to do) and EXE is the execution register (how
|
||||
* to do it)
|
||||
*/
|
||||
|
||||
#define MCA_DMA_REG_FN 0x18
|
||||
#define MCA_DMA_REG_EXE 0x1A
|
||||
#define MCA_DMA_REG_EXE 0x1A
|
||||
|
||||
/*
|
||||
* Functions that the DMA controller can do
|
||||
@@ -43,9 +43,9 @@
|
||||
|
||||
/*
|
||||
* Modes (used by setting MCA_DMA_FN_MODE in the function register)
|
||||
*
|
||||
*
|
||||
* Note that the MODE_READ is read from memory (write to device), and
|
||||
* MODE_WRITE is vice-versa.
|
||||
* MODE_WRITE is vice-versa.
|
||||
*/
|
||||
|
||||
#define MCA_DMA_MODE_XFER 0x04 /* read by default */
|
||||
@@ -63,7 +63,7 @@
|
||||
* IRQ context.
|
||||
*/
|
||||
|
||||
static __inline__ void mca_enable_dma(unsigned int dmanr)
|
||||
static inline void mca_enable_dma(unsigned int dmanr)
|
||||
{
|
||||
outb(MCA_DMA_FN_RESET_MASK | dmanr, MCA_DMA_REG_FN);
|
||||
}
|
||||
@@ -76,7 +76,7 @@ static __inline__ void mca_enable_dma(unsigned int dmanr)
|
||||
* IRQ context.
|
||||
*/
|
||||
|
||||
static __inline__ void mca_disable_dma(unsigned int dmanr)
|
||||
static inline void mca_disable_dma(unsigned int dmanr)
|
||||
{
|
||||
outb(MCA_DMA_FN_MASK | dmanr, MCA_DMA_REG_FN);
|
||||
}
|
||||
@@ -87,10 +87,10 @@ static __inline__ void mca_disable_dma(unsigned int dmanr)
|
||||
* @a: 24bit bus address
|
||||
*
|
||||
* Load the address register in the DMA controller. This has a 24bit
|
||||
* limitation (16Mb).
|
||||
* limitation (16Mb).
|
||||
*/
|
||||
|
||||
static __inline__ void mca_set_dma_addr(unsigned int dmanr, unsigned int a)
|
||||
static inline void mca_set_dma_addr(unsigned int dmanr, unsigned int a)
|
||||
{
|
||||
outb(MCA_DMA_FN_SET_ADDR | dmanr, MCA_DMA_REG_FN);
|
||||
outb(a & 0xff, MCA_DMA_REG_EXE);
|
||||
@@ -106,14 +106,14 @@ static __inline__ void mca_set_dma_addr(unsigned int dmanr, unsigned int a)
|
||||
* limitation (16Mb). The return is a bus address.
|
||||
*/
|
||||
|
||||
static __inline__ unsigned int mca_get_dma_addr(unsigned int dmanr)
|
||||
static inline unsigned int mca_get_dma_addr(unsigned int dmanr)
|
||||
{
|
||||
unsigned int addr;
|
||||
|
||||
outb(MCA_DMA_FN_GET_ADDR | dmanr, MCA_DMA_REG_FN);
|
||||
addr = inb(MCA_DMA_REG_EXE);
|
||||
addr |= inb(MCA_DMA_REG_EXE) << 8;
|
||||
addr |= inb(MCA_DMA_REG_EXE) << 16;
|
||||
addr |= inb(MCA_DMA_REG_EXE) << 16;
|
||||
|
||||
return addr;
|
||||
}
|
||||
@@ -127,7 +127,7 @@ static __inline__ unsigned int mca_get_dma_addr(unsigned int dmanr)
|
||||
* Setting a count of zero will not do what you expect.
|
||||
*/
|
||||
|
||||
static __inline__ void mca_set_dma_count(unsigned int dmanr, unsigned int count)
|
||||
static inline void mca_set_dma_count(unsigned int dmanr, unsigned int count)
|
||||
{
|
||||
count--; /* transfers one more than count -- correct for this */
|
||||
|
||||
@@ -144,7 +144,7 @@ static __inline__ void mca_set_dma_count(unsigned int dmanr, unsigned int count)
|
||||
* on this DMA channel.
|
||||
*/
|
||||
|
||||
static __inline__ unsigned int mca_get_dma_residue(unsigned int dmanr)
|
||||
static inline unsigned int mca_get_dma_residue(unsigned int dmanr)
|
||||
{
|
||||
unsigned short count;
|
||||
|
||||
@@ -164,12 +164,12 @@ static __inline__ unsigned int mca_get_dma_residue(unsigned int dmanr)
|
||||
* with an I/O port target.
|
||||
*/
|
||||
|
||||
static __inline__ void mca_set_dma_io(unsigned int dmanr, unsigned int io_addr)
|
||||
static inline void mca_set_dma_io(unsigned int dmanr, unsigned int io_addr)
|
||||
{
|
||||
/*
|
||||
* DMA from a port address -- set the io address
|
||||
*/
|
||||
|
||||
|
||||
outb(MCA_DMA_FN_SET_IO | dmanr, MCA_DMA_REG_FN);
|
||||
outb(io_addr & 0xff, MCA_DMA_REG_EXE);
|
||||
outb((io_addr >> 8) & 0xff, MCA_DMA_REG_EXE);
|
||||
@@ -192,7 +192,7 @@ static __inline__ void mca_set_dma_io(unsigned int dmanr, unsigned int io_addr)
|
||||
* %MCA_DMA_MODE_16 to do 16bit transfers.
|
||||
*/
|
||||
|
||||
static __inline__ void mca_set_dma_mode(unsigned int dmanr, unsigned int mode)
|
||||
static inline void mca_set_dma_mode(unsigned int dmanr, unsigned int mode)
|
||||
{
|
||||
outb(MCA_DMA_FN_SET_MODE | dmanr, MCA_DMA_REG_FN);
|
||||
outb(mode, MCA_DMA_REG_EXE);
|
||||
|
||||
@@ -10,10 +10,10 @@
|
||||
*
|
||||
* cpu_vm_mask is used to optimize ldt flushing.
|
||||
*/
|
||||
typedef struct {
|
||||
typedef struct {
|
||||
void *ldt;
|
||||
#ifdef CONFIG_X86_64
|
||||
rwlock_t ldtlock;
|
||||
rwlock_t ldtlock;
|
||||
#endif
|
||||
int size;
|
||||
struct mutex lock;
|
||||
|
||||
@@ -62,7 +62,7 @@ static inline void switch_mm(struct mm_struct *prev,
|
||||
BUG_ON(per_cpu(cpu_tlbstate, cpu).active_mm != next);
|
||||
|
||||
if (!cpu_test_and_set(cpu, next->cpu_vm_mask)) {
|
||||
/* We were in lazy tlb mode and leave_mm disabled
|
||||
/* We were in lazy tlb mode and leave_mm disabled
|
||||
* tlb flush IPI delivery. We must reload %cr3.
|
||||
*/
|
||||
load_cr3(next->pgd);
|
||||
@@ -75,10 +75,10 @@ static inline void switch_mm(struct mm_struct *prev,
|
||||
#define deactivate_mm(tsk, mm) \
|
||||
asm("movl %0,%%gs": :"r" (0));
|
||||
|
||||
#define activate_mm(prev, next) \
|
||||
do { \
|
||||
paravirt_activate_mm(prev, next); \
|
||||
switch_mm((prev),(next),NULL); \
|
||||
} while(0);
|
||||
#define activate_mm(prev, next) \
|
||||
do { \
|
||||
paravirt_activate_mm((prev), (next)); \
|
||||
switch_mm((prev), (next), NULL); \
|
||||
} while (0);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -20,12 +20,12 @@ void destroy_context(struct mm_struct *mm);
|
||||
static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk)
|
||||
{
|
||||
#ifdef CONFIG_SMP
|
||||
if (read_pda(mmu_state) == TLBSTATE_OK)
|
||||
if (read_pda(mmu_state) == TLBSTATE_OK)
|
||||
write_pda(mmu_state, TLBSTATE_LAZY);
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next,
|
||||
static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next,
|
||||
struct task_struct *tsk)
|
||||
{
|
||||
unsigned cpu = smp_processor_id();
|
||||
@@ -39,7 +39,7 @@ static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next,
|
||||
cpu_set(cpu, next->cpu_vm_mask);
|
||||
load_cr3(next->pgd);
|
||||
|
||||
if (unlikely(next->context.ldt != prev->context.ldt))
|
||||
if (unlikely(next->context.ldt != prev->context.ldt))
|
||||
load_LDT_nolock(&next->context);
|
||||
}
|
||||
#ifdef CONFIG_SMP
|
||||
@@ -48,7 +48,7 @@ static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next,
|
||||
if (read_pda(active_mm) != next)
|
||||
BUG();
|
||||
if (!cpu_test_and_set(cpu, next->cpu_vm_mask)) {
|
||||
/* We were in lazy tlb mode and leave_mm disabled
|
||||
/* We were in lazy tlb mode and leave_mm disabled
|
||||
* tlb flush IPI delivery. We must reload CR3
|
||||
* to make sure to use no freed page tables.
|
||||
*/
|
||||
@@ -59,13 +59,14 @@ static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next,
|
||||
#endif
|
||||
}
|
||||
|
||||
#define deactivate_mm(tsk,mm) do { \
|
||||
load_gs_index(0); \
|
||||
asm volatile("movl %0,%%fs"::"r"(0)); \
|
||||
} while(0)
|
||||
#define deactivate_mm(tsk, mm) \
|
||||
do { \
|
||||
load_gs_index(0); \
|
||||
asm volatile("movl %0,%%fs"::"r"(0)); \
|
||||
} while (0)
|
||||
|
||||
#define activate_mm(prev, next) \
|
||||
switch_mm((prev),(next),NULL)
|
||||
#define activate_mm(prev, next) \
|
||||
switch_mm((prev), (next), NULL)
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
|
||||
extern void *_mmx_memcpy(void *to, const void *from, size_t size);
|
||||
extern void mmx_clear_page(void *page);
|
||||
extern void mmx_copy_page(void *to, void *from);
|
||||
|
||||
@@ -18,7 +18,7 @@ extern struct pglist_data *node_data[];
|
||||
#include <asm/srat.h>
|
||||
#endif
|
||||
|
||||
extern int get_memcfg_numa_flat(void );
|
||||
extern int get_memcfg_numa_flat(void);
|
||||
/*
|
||||
* This allows any one NUMA architecture to be compiled
|
||||
* for, and still fall back to the flat function if it
|
||||
@@ -129,7 +129,7 @@ static inline int pfn_valid(int pfn)
|
||||
struct pglist_data __maybe_unused \
|
||||
*__alloc_bootmem_node__pgdat = (pgdat); \
|
||||
__alloc_bootmem_node(NODE_DATA(0), (x), PAGE_SIZE, \
|
||||
__pa(MAX_DMA_ADDRESS)) \
|
||||
__pa(MAX_DMA_ADDRESS)); \
|
||||
})
|
||||
#define alloc_bootmem_low_pages_node(pgdat, x) \
|
||||
({ \
|
||||
|
||||
+12
-12
@@ -7,7 +7,7 @@
|
||||
|
||||
#ifdef CONFIG_NUMA
|
||||
|
||||
#define VIRTUAL_BUG_ON(x)
|
||||
#define VIRTUAL_BUG_ON(x)
|
||||
|
||||
#include <asm/smp.h>
|
||||
|
||||
@@ -16,7 +16,7 @@ struct memnode {
|
||||
int shift;
|
||||
unsigned int mapsize;
|
||||
s16 *map;
|
||||
s16 embedded_map[64-8];
|
||||
s16 embedded_map[64 - 8];
|
||||
} ____cacheline_aligned; /* total size = 128 bytes */
|
||||
extern struct memnode memnode;
|
||||
#define memnode_shift memnode.shift
|
||||
@@ -25,27 +25,27 @@ extern struct memnode memnode;
|
||||
|
||||
extern struct pglist_data *node_data[];
|
||||
|
||||
static inline __attribute__((pure)) int phys_to_nid(unsigned long addr)
|
||||
{
|
||||
unsigned nid;
|
||||
static inline __attribute__((pure)) int phys_to_nid(unsigned long addr)
|
||||
{
|
||||
unsigned nid;
|
||||
VIRTUAL_BUG_ON(!memnodemap);
|
||||
VIRTUAL_BUG_ON((addr >> memnode_shift) >= memnodemapsize);
|
||||
nid = memnodemap[addr >> memnode_shift];
|
||||
VIRTUAL_BUG_ON(nid >= MAX_NUMNODES || !node_data[nid]);
|
||||
return nid;
|
||||
}
|
||||
nid = memnodemap[addr >> memnode_shift];
|
||||
VIRTUAL_BUG_ON(nid >= MAX_NUMNODES || !node_data[nid]);
|
||||
return nid;
|
||||
}
|
||||
|
||||
#define NODE_DATA(nid) (node_data[nid])
|
||||
|
||||
#define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn)
|
||||
#define node_end_pfn(nid) (NODE_DATA(nid)->node_start_pfn + \
|
||||
#define node_end_pfn(nid) (NODE_DATA(nid)->node_start_pfn + \
|
||||
NODE_DATA(nid)->node_spanned_pages)
|
||||
|
||||
extern int early_pfn_to_nid(unsigned long pfn);
|
||||
|
||||
#ifdef CONFIG_NUMA_EMU
|
||||
#define FAKE_NODE_MIN_SIZE (64*1024*1024)
|
||||
#define FAKE_NODE_MIN_HASH_MASK (~(FAKE_NODE_MIN_SIZE - 1uL))
|
||||
#define FAKE_NODE_MIN_SIZE (64 * 1024 * 1024)
|
||||
#define FAKE_NODE_MIN_HASH_MASK (~(FAKE_NODE_MIN_SIZE - 1UL))
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
+23
-24
@@ -1,16 +1,13 @@
|
||||
#ifndef _AM_X86_MPSPEC_H
|
||||
#define _AM_X86_MPSPEC_H
|
||||
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <asm/mpspec_def.h>
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
#include <mach_mpspec.h>
|
||||
|
||||
extern int mp_bus_id_to_type[MAX_MP_BUSSES];
|
||||
extern int mp_bus_id_to_node[MAX_MP_BUSSES];
|
||||
extern int mp_bus_id_to_local[MAX_MP_BUSSES];
|
||||
extern int quad_local_to_mp_bus_id[NR_CPUS/4][4];
|
||||
|
||||
extern unsigned int def_to_bigsmp;
|
||||
extern int apic_version[MAX_APICS];
|
||||
extern u8 apicid_2_node[];
|
||||
@@ -24,27 +21,30 @@ extern int pic_mode;
|
||||
/* Each PCI slot may be a combo card with its own bus. 4 IRQ pins per slot. */
|
||||
#define MAX_IRQ_SOURCES (MAX_MP_BUSSES * 4)
|
||||
|
||||
extern DECLARE_BITMAP(mp_bus_not_pci, MAX_MP_BUSSES);
|
||||
extern void early_find_smp_config(void);
|
||||
extern void early_get_smp_config(void);
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_MCA) || defined(CONFIG_EISA)
|
||||
extern int mp_bus_id_to_type[MAX_MP_BUSSES];
|
||||
#endif
|
||||
|
||||
extern DECLARE_BITMAP(mp_bus_not_pci, MAX_MP_BUSSES);
|
||||
|
||||
extern int mp_bus_id_to_pci_bus[MAX_MP_BUSSES];
|
||||
|
||||
extern unsigned int boot_cpu_physical_apicid;
|
||||
extern int smp_found_config;
|
||||
extern int nr_ioapics;
|
||||
extern int mp_irq_entries;
|
||||
extern struct mpc_config_intsrc mp_irqs[MAX_IRQ_SOURCES];
|
||||
extern int mpc_default_type;
|
||||
extern unsigned long mp_lapic_addr;
|
||||
|
||||
extern void find_smp_config(void);
|
||||
extern void get_smp_config(void);
|
||||
|
||||
void __cpuinit generic_processor_info(int apicid, int version);
|
||||
#ifdef CONFIG_ACPI
|
||||
extern void mp_register_lapic(u8 id, u8 enabled);
|
||||
extern void mp_register_lapic_address(u64 address);
|
||||
extern void mp_register_ioapic(u8 id, u32 address, u32 gsi_base);
|
||||
extern void mp_register_ioapic(int id, u32 address, u32 gsi_base);
|
||||
extern void mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger,
|
||||
u32 gsi);
|
||||
extern void mp_config_acpi_legacy_irqs(void);
|
||||
@@ -53,8 +53,7 @@ extern int mp_register_gsi(u32 gsi, int edge_level, int active_high_low);
|
||||
|
||||
#define PHYSID_ARRAY_SIZE BITS_TO_LONGS(MAX_APICS)
|
||||
|
||||
struct physid_mask
|
||||
{
|
||||
struct physid_mask {
|
||||
unsigned long mask[PHYSID_ARRAY_SIZE];
|
||||
};
|
||||
|
||||
@@ -63,34 +62,34 @@ typedef struct physid_mask physid_mask_t;
|
||||
#define physid_set(physid, map) set_bit(physid, (map).mask)
|
||||
#define physid_clear(physid, map) clear_bit(physid, (map).mask)
|
||||
#define physid_isset(physid, map) test_bit(physid, (map).mask)
|
||||
#define physid_test_and_set(physid, map) \
|
||||
#define physid_test_and_set(physid, map) \
|
||||
test_and_set_bit(physid, (map).mask)
|
||||
|
||||
#define physids_and(dst, src1, src2) \
|
||||
#define physids_and(dst, src1, src2) \
|
||||
bitmap_and((dst).mask, (src1).mask, (src2).mask, MAX_APICS)
|
||||
|
||||
#define physids_or(dst, src1, src2) \
|
||||
#define physids_or(dst, src1, src2) \
|
||||
bitmap_or((dst).mask, (src1).mask, (src2).mask, MAX_APICS)
|
||||
|
||||
#define physids_clear(map) \
|
||||
#define physids_clear(map) \
|
||||
bitmap_zero((map).mask, MAX_APICS)
|
||||
|
||||
#define physids_complement(dst, src) \
|
||||
#define physids_complement(dst, src) \
|
||||
bitmap_complement((dst).mask, (src).mask, MAX_APICS)
|
||||
|
||||
#define physids_empty(map) \
|
||||
#define physids_empty(map) \
|
||||
bitmap_empty((map).mask, MAX_APICS)
|
||||
|
||||
#define physids_equal(map1, map2) \
|
||||
#define physids_equal(map1, map2) \
|
||||
bitmap_equal((map1).mask, (map2).mask, MAX_APICS)
|
||||
|
||||
#define physids_weight(map) \
|
||||
#define physids_weight(map) \
|
||||
bitmap_weight((map).mask, MAX_APICS)
|
||||
|
||||
#define physids_shift_right(d, s, n) \
|
||||
#define physids_shift_right(d, s, n) \
|
||||
bitmap_shift_right((d).mask, (s).mask, n, MAX_APICS)
|
||||
|
||||
#define physids_shift_left(d, s, n) \
|
||||
#define physids_shift_left(d, s, n) \
|
||||
bitmap_shift_left((d).mask, (s).mask, n, MAX_APICS)
|
||||
|
||||
#define physids_coerce(map) ((map).mask[0])
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
* information is.
|
||||
*/
|
||||
|
||||
#define SMP_MAGIC_IDENT (('_'<<24)|('P'<<16)|('M'<<8)|'_')
|
||||
#define SMP_MAGIC_IDENT (('_'<<24) | ('P'<<16) | ('M'<<8) | '_')
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
# define MAX_MPC_ENTRY 1024
|
||||
@@ -23,8 +23,7 @@
|
||||
# define MAX_APICS 255
|
||||
#endif
|
||||
|
||||
struct intel_mp_floating
|
||||
{
|
||||
struct intel_mp_floating {
|
||||
char mpf_signature[4]; /* "_MP_" */
|
||||
unsigned int mpf_physptr; /* Configuration table address */
|
||||
unsigned char mpf_length; /* Our length (paragraphs) */
|
||||
@@ -39,14 +38,13 @@ struct intel_mp_floating
|
||||
|
||||
#define MPC_SIGNATURE "PCMP"
|
||||
|
||||
struct mp_config_table
|
||||
{
|
||||
struct mp_config_table {
|
||||
char mpc_signature[4];
|
||||
unsigned short mpc_length; /* Size of table */
|
||||
char mpc_spec; /* 0x01 */
|
||||
char mpc_checksum;
|
||||
char mpc_oem[8];
|
||||
char mpc_productid[12];
|
||||
char mpc_spec; /* 0x01 */
|
||||
char mpc_checksum;
|
||||
char mpc_oem[8];
|
||||
char mpc_productid[12];
|
||||
unsigned int mpc_oemptr; /* 0 if not present */
|
||||
unsigned short mpc_oemsize; /* 0 if not present */
|
||||
unsigned short mpc_oemcount;
|
||||
@@ -71,8 +69,7 @@ struct mp_config_table
|
||||
#define CPU_MODEL_MASK 0x00F0
|
||||
#define CPU_FAMILY_MASK 0x0F00
|
||||
|
||||
struct mpc_config_processor
|
||||
{
|
||||
struct mpc_config_processor {
|
||||
unsigned char mpc_type;
|
||||
unsigned char mpc_apicid; /* Local APIC number */
|
||||
unsigned char mpc_apicver; /* Its versions */
|
||||
@@ -82,8 +79,7 @@ struct mpc_config_processor
|
||||
unsigned int mpc_reserved[2];
|
||||
};
|
||||
|
||||
struct mpc_config_bus
|
||||
{
|
||||
struct mpc_config_bus {
|
||||
unsigned char mpc_type;
|
||||
unsigned char mpc_busid;
|
||||
unsigned char mpc_bustype[6];
|
||||
@@ -111,8 +107,7 @@ struct mpc_config_bus
|
||||
|
||||
#define MPC_APIC_USABLE 0x01
|
||||
|
||||
struct mpc_config_ioapic
|
||||
{
|
||||
struct mpc_config_ioapic {
|
||||
unsigned char mpc_type;
|
||||
unsigned char mpc_apicid;
|
||||
unsigned char mpc_apicver;
|
||||
@@ -120,8 +115,7 @@ struct mpc_config_ioapic
|
||||
unsigned int mpc_apicaddr;
|
||||
};
|
||||
|
||||
struct mpc_config_intsrc
|
||||
{
|
||||
struct mpc_config_intsrc {
|
||||
unsigned char mpc_type;
|
||||
unsigned char mpc_irqtype;
|
||||
unsigned short mpc_irqflag;
|
||||
@@ -144,8 +138,7 @@ enum mp_irq_source_types {
|
||||
|
||||
#define MP_APIC_ALL 0xFF
|
||||
|
||||
struct mpc_config_lintsrc
|
||||
{
|
||||
struct mpc_config_lintsrc {
|
||||
unsigned char mpc_type;
|
||||
unsigned char mpc_irqtype;
|
||||
unsigned short mpc_irqflag;
|
||||
@@ -157,8 +150,7 @@ struct mpc_config_lintsrc
|
||||
|
||||
#define MPC_OEM_SIGNATURE "_OEM"
|
||||
|
||||
struct mp_config_oemtable
|
||||
{
|
||||
struct mp_config_oemtable {
|
||||
char oem_signature[4];
|
||||
unsigned short oem_length; /* Size of table */
|
||||
char oem_rev; /* 0x01 */
|
||||
@@ -166,17 +158,6 @@ struct mp_config_oemtable
|
||||
char mpc_oem[8];
|
||||
};
|
||||
|
||||
struct mpc_config_translation
|
||||
{
|
||||
unsigned char mpc_type;
|
||||
unsigned char trans_len;
|
||||
unsigned char trans_type;
|
||||
unsigned char trans_quad;
|
||||
unsigned char trans_global;
|
||||
unsigned char trans_local;
|
||||
unsigned short trans_reserved;
|
||||
};
|
||||
|
||||
/*
|
||||
* Default configurations
|
||||
*
|
||||
@@ -196,4 +177,3 @@ enum mp_bustype {
|
||||
MP_BUS_MCA,
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
@@ -11,7 +11,8 @@
|
||||
|
||||
#define MSI_DATA_VECTOR_SHIFT 0
|
||||
#define MSI_DATA_VECTOR_MASK 0x000000ff
|
||||
#define MSI_DATA_VECTOR(v) (((v) << MSI_DATA_VECTOR_SHIFT) & MSI_DATA_VECTOR_MASK)
|
||||
#define MSI_DATA_VECTOR(v) (((v) << MSI_DATA_VECTOR_SHIFT) & \
|
||||
MSI_DATA_VECTOR_MASK)
|
||||
|
||||
#define MSI_DATA_DELIVERY_MODE_SHIFT 8
|
||||
#define MSI_DATA_DELIVERY_FIXED (0 << MSI_DATA_DELIVERY_MODE_SHIFT)
|
||||
@@ -37,11 +38,14 @@
|
||||
#define MSI_ADDR_DEST_MODE_LOGICAL (1 << MSI_ADDR_DEST_MODE_SHIFT)
|
||||
|
||||
#define MSI_ADDR_REDIRECTION_SHIFT 3
|
||||
#define MSI_ADDR_REDIRECTION_CPU (0 << MSI_ADDR_REDIRECTION_SHIFT) /* dedicated cpu */
|
||||
#define MSI_ADDR_REDIRECTION_LOWPRI (1 << MSI_ADDR_REDIRECTION_SHIFT) /* lowest priority */
|
||||
#define MSI_ADDR_REDIRECTION_CPU (0 << MSI_ADDR_REDIRECTION_SHIFT)
|
||||
/* dedicated cpu */
|
||||
#define MSI_ADDR_REDIRECTION_LOWPRI (1 << MSI_ADDR_REDIRECTION_SHIFT)
|
||||
/* lowest priority */
|
||||
|
||||
#define MSI_ADDR_DEST_ID_SHIFT 12
|
||||
#define MSI_ADDR_DEST_ID_MASK 0x00ffff0
|
||||
#define MSI_ADDR_DEST_ID(dest) (((dest) << MSI_ADDR_DEST_ID_SHIFT) & MSI_ADDR_DEST_ID_MASK)
|
||||
#define MSI_ADDR_DEST_ID(dest) (((dest) << MSI_ADDR_DEST_ID_SHIFT) & \
|
||||
MSI_ADDR_DEST_ID_MASK)
|
||||
|
||||
#endif /* ASM_MSIDEF_H */
|
||||
|
||||
@@ -57,6 +57,8 @@
|
||||
#define MSR_MTRRfix4K_F8000 0x0000026f
|
||||
#define MSR_MTRRdefType 0x000002ff
|
||||
|
||||
#define MSR_IA32_CR_PAT 0x00000277
|
||||
|
||||
#define MSR_IA32_DEBUGCTLMSR 0x000001d9
|
||||
#define MSR_IA32_LASTBRANCHFROMIP 0x000001db
|
||||
#define MSR_IA32_LASTBRANCHTOIP 0x000001dc
|
||||
@@ -83,6 +85,7 @@
|
||||
/* AMD64 MSRs. Not complete. See the architecture manual for a more
|
||||
complete list. */
|
||||
|
||||
#define MSR_AMD64_NB_CFG 0xc001001f
|
||||
#define MSR_AMD64_IBSFETCHCTL 0xc0011030
|
||||
#define MSR_AMD64_IBSFETCHLINAD 0xc0011031
|
||||
#define MSR_AMD64_IBSFETCHPHYSAD 0xc0011032
|
||||
@@ -109,6 +112,7 @@
|
||||
#define MSR_K8_SYSCFG 0xc0010010
|
||||
#define MSR_K8_HWCR 0xc0010015
|
||||
#define MSR_K8_ENABLE_C1E 0xc0010055
|
||||
#define MSR_K8_TSEG_ADDR 0xc0010112
|
||||
#define K8_MTRRFIXRANGE_DRAM_ENABLE 0x00040000 /* MtrrFixDramEn bit */
|
||||
#define K8_MTRRFIXRANGE_DRAM_MODIFY 0x00080000 /* MtrrFixDramModEn bit */
|
||||
#define K8_MTRR_RDMEM_WRMEM_MASK 0x18181818 /* Mask: RdMem|WrMem */
|
||||
|
||||
+50
-39
@@ -16,8 +16,8 @@
|
||||
static inline unsigned long long native_read_tscp(unsigned int *aux)
|
||||
{
|
||||
unsigned long low, high;
|
||||
asm volatile (".byte 0x0f,0x01,0xf9"
|
||||
: "=a" (low), "=d" (high), "=c" (*aux));
|
||||
asm volatile(".byte 0x0f,0x01,0xf9"
|
||||
: "=a" (low), "=d" (high), "=c" (*aux));
|
||||
return low | ((u64)high >> 32);
|
||||
}
|
||||
|
||||
@@ -29,7 +29,7 @@ static inline unsigned long long native_read_tscp(unsigned int *aux)
|
||||
*/
|
||||
#ifdef CONFIG_X86_64
|
||||
#define DECLARE_ARGS(val, low, high) unsigned low, high
|
||||
#define EAX_EDX_VAL(val, low, high) (low | ((u64)(high) << 32))
|
||||
#define EAX_EDX_VAL(val, low, high) ((low) | ((u64)(high) << 32))
|
||||
#define EAX_EDX_ARGS(val, low, high) "a" (low), "d" (high)
|
||||
#define EAX_EDX_RET(val, low, high) "=a" (low), "=d" (high)
|
||||
#else
|
||||
@@ -57,7 +57,7 @@ static inline unsigned long long native_read_msr_safe(unsigned int msr,
|
||||
".section .fixup,\"ax\"\n\t"
|
||||
"3: mov %3,%0 ; jmp 1b\n\t"
|
||||
".previous\n\t"
|
||||
_ASM_EXTABLE(2b,3b)
|
||||
_ASM_EXTABLE(2b, 3b)
|
||||
: "=r" (*err), EAX_EDX_RET(val, low, high)
|
||||
: "c" (msr), "i" (-EFAULT));
|
||||
return EAX_EDX_VAL(val, low, high);
|
||||
@@ -78,10 +78,10 @@ static inline int native_write_msr_safe(unsigned int msr,
|
||||
".section .fixup,\"ax\"\n\t"
|
||||
"3: mov %4,%0 ; jmp 1b\n\t"
|
||||
".previous\n\t"
|
||||
_ASM_EXTABLE(2b,3b)
|
||||
_ASM_EXTABLE(2b, 3b)
|
||||
: "=a" (err)
|
||||
: "c" (msr), "0" (low), "d" (high),
|
||||
"i" (-EFAULT));
|
||||
"i" (-EFAULT));
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -116,23 +116,23 @@ static inline unsigned long long native_read_pmc(int counter)
|
||||
* pointer indirection), this allows gcc to optimize better
|
||||
*/
|
||||
|
||||
#define rdmsr(msr,val1,val2) \
|
||||
do { \
|
||||
u64 __val = native_read_msr(msr); \
|
||||
(val1) = (u32)__val; \
|
||||
(val2) = (u32)(__val >> 32); \
|
||||
} while(0)
|
||||
#define rdmsr(msr, val1, val2) \
|
||||
do { \
|
||||
u64 __val = native_read_msr((msr)); \
|
||||
(val1) = (u32)__val; \
|
||||
(val2) = (u32)(__val >> 32); \
|
||||
} while (0)
|
||||
|
||||
static inline void wrmsr(unsigned msr, unsigned low, unsigned high)
|
||||
{
|
||||
native_write_msr(msr, low, high);
|
||||
}
|
||||
|
||||
#define rdmsrl(msr,val) \
|
||||
((val) = native_read_msr(msr))
|
||||
#define rdmsrl(msr, val) \
|
||||
((val) = native_read_msr((msr)))
|
||||
|
||||
#define wrmsrl(msr, val) \
|
||||
native_write_msr(msr, (u32)((u64)(val)), (u32)((u64)(val) >> 32))
|
||||
native_write_msr((msr), (u32)((u64)(val)), (u32)((u64)(val) >> 32))
|
||||
|
||||
/* wrmsr with exception handling */
|
||||
static inline int wrmsr_safe(unsigned msr, unsigned low, unsigned high)
|
||||
@@ -141,14 +141,22 @@ static inline int wrmsr_safe(unsigned msr, unsigned low, unsigned high)
|
||||
}
|
||||
|
||||
/* rdmsr with exception handling */
|
||||
#define rdmsr_safe(msr,p1,p2) \
|
||||
({ \
|
||||
int __err; \
|
||||
u64 __val = native_read_msr_safe(msr, &__err); \
|
||||
(*p1) = (u32)__val; \
|
||||
(*p2) = (u32)(__val >> 32); \
|
||||
__err; \
|
||||
})
|
||||
#define rdmsr_safe(msr, p1, p2) \
|
||||
({ \
|
||||
int __err; \
|
||||
u64 __val = native_read_msr_safe((msr), &__err); \
|
||||
(*p1) = (u32)__val; \
|
||||
(*p2) = (u32)(__val >> 32); \
|
||||
__err; \
|
||||
})
|
||||
|
||||
static inline int rdmsrl_safe(unsigned msr, unsigned long long *p)
|
||||
{
|
||||
int err;
|
||||
|
||||
*p = native_read_msr_safe(msr, &err);
|
||||
return err;
|
||||
}
|
||||
|
||||
#define rdtscl(low) \
|
||||
((low) = (u32)native_read_tsc())
|
||||
@@ -156,35 +164,37 @@ static inline int wrmsr_safe(unsigned msr, unsigned low, unsigned high)
|
||||
#define rdtscll(val) \
|
||||
((val) = native_read_tsc())
|
||||
|
||||
#define rdpmc(counter,low,high) \
|
||||
do { \
|
||||
u64 _l = native_read_pmc(counter); \
|
||||
(low) = (u32)_l; \
|
||||
(high) = (u32)(_l >> 32); \
|
||||
} while(0)
|
||||
#define rdpmc(counter, low, high) \
|
||||
do { \
|
||||
u64 _l = native_read_pmc((counter)); \
|
||||
(low) = (u32)_l; \
|
||||
(high) = (u32)(_l >> 32); \
|
||||
} while (0)
|
||||
|
||||
#define rdtscp(low, high, aux) \
|
||||
do { \
|
||||
unsigned long long _val = native_read_tscp(&(aux)); \
|
||||
(low) = (u32)_val; \
|
||||
(high) = (u32)(_val >> 32); \
|
||||
} while (0)
|
||||
#define rdtscp(low, high, aux) \
|
||||
do { \
|
||||
unsigned long long _val = native_read_tscp(&(aux)); \
|
||||
(low) = (u32)_val; \
|
||||
(high) = (u32)(_val >> 32); \
|
||||
} while (0)
|
||||
|
||||
#define rdtscpll(val, aux) (val) = native_read_tscp(&(aux))
|
||||
|
||||
#endif /* !CONFIG_PARAVIRT */
|
||||
|
||||
|
||||
#define checking_wrmsrl(msr,val) wrmsr_safe(msr,(u32)(val),(u32)((val)>>32))
|
||||
#define checking_wrmsrl(msr, val) wrmsr_safe((msr), (u32)(val), \
|
||||
(u32)((val) >> 32))
|
||||
|
||||
#define write_tsc(val1,val2) wrmsr(0x10, val1, val2)
|
||||
#define write_tsc(val1, val2) wrmsr(0x10, (val1), (val2))
|
||||
|
||||
#define write_rdtscp_aux(val) wrmsr(0xc0000103, val, 0)
|
||||
#define write_rdtscp_aux(val) wrmsr(0xc0000103, (val), 0)
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
void rdmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h);
|
||||
void wrmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h);
|
||||
int rdmsr_safe_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h);
|
||||
|
||||
int wrmsr_safe_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h);
|
||||
#else /* CONFIG_SMP */
|
||||
static inline void rdmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h)
|
||||
@@ -195,7 +205,8 @@ static inline void wrmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h)
|
||||
{
|
||||
wrmsr(msr_no, l, h);
|
||||
}
|
||||
static inline int rdmsr_safe_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h)
|
||||
static inline int rdmsr_safe_on_cpu(unsigned int cpu, u32 msr_no,
|
||||
u32 *l, u32 *h)
|
||||
{
|
||||
return rdmsr_safe(msr_no, l, h);
|
||||
}
|
||||
|
||||
+42
-37
@@ -28,8 +28,7 @@
|
||||
|
||||
#define MTRR_IOCTL_BASE 'M'
|
||||
|
||||
struct mtrr_sentry
|
||||
{
|
||||
struct mtrr_sentry {
|
||||
unsigned long base; /* Base address */
|
||||
unsigned int size; /* Size of region */
|
||||
unsigned int type; /* Type of region */
|
||||
@@ -41,8 +40,7 @@ struct mtrr_sentry
|
||||
will break. */
|
||||
|
||||
#ifdef __i386__
|
||||
struct mtrr_gentry
|
||||
{
|
||||
struct mtrr_gentry {
|
||||
unsigned int regnum; /* Register number */
|
||||
unsigned long base; /* Base address */
|
||||
unsigned int size; /* Size of region */
|
||||
@@ -51,8 +49,7 @@ struct mtrr_gentry
|
||||
|
||||
#else /* __i386__ */
|
||||
|
||||
struct mtrr_gentry
|
||||
{
|
||||
struct mtrr_gentry {
|
||||
unsigned long base; /* Base address */
|
||||
unsigned int size; /* Size of region */
|
||||
unsigned int regnum; /* Register number */
|
||||
@@ -86,38 +83,45 @@ struct mtrr_gentry
|
||||
|
||||
/* The following functions are for use by other drivers */
|
||||
# ifdef CONFIG_MTRR
|
||||
extern u8 mtrr_type_lookup(u64 addr, u64 end);
|
||||
extern void mtrr_save_fixed_ranges(void *);
|
||||
extern void mtrr_save_state(void);
|
||||
extern int mtrr_add (unsigned long base, unsigned long size,
|
||||
unsigned int type, bool increment);
|
||||
extern int mtrr_add_page (unsigned long base, unsigned long size,
|
||||
unsigned int type, bool increment);
|
||||
extern int mtrr_del (int reg, unsigned long base, unsigned long size);
|
||||
extern int mtrr_del_page (int reg, unsigned long base, unsigned long size);
|
||||
extern int mtrr_add(unsigned long base, unsigned long size,
|
||||
unsigned int type, bool increment);
|
||||
extern int mtrr_add_page(unsigned long base, unsigned long size,
|
||||
unsigned int type, bool increment);
|
||||
extern int mtrr_del(int reg, unsigned long base, unsigned long size);
|
||||
extern int mtrr_del_page(int reg, unsigned long base, unsigned long size);
|
||||
extern void mtrr_centaur_report_mcr(int mcr, u32 lo, u32 hi);
|
||||
extern void mtrr_ap_init(void);
|
||||
extern void mtrr_bp_init(void);
|
||||
extern int mtrr_trim_uncached_memory(unsigned long end_pfn);
|
||||
extern int amd_special_default_mtrr(void);
|
||||
# else
|
||||
static inline u8 mtrr_type_lookup(u64 addr, u64 end)
|
||||
{
|
||||
/*
|
||||
* Return no-MTRRs:
|
||||
*/
|
||||
return 0xff;
|
||||
}
|
||||
#define mtrr_save_fixed_ranges(arg) do {} while (0)
|
||||
#define mtrr_save_state() do {} while (0)
|
||||
static __inline__ int mtrr_add (unsigned long base, unsigned long size,
|
||||
static inline int mtrr_add(unsigned long base, unsigned long size,
|
||||
unsigned int type, bool increment)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
static inline int mtrr_add_page(unsigned long base, unsigned long size,
|
||||
unsigned int type, bool increment)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
static __inline__ int mtrr_add_page (unsigned long base, unsigned long size,
|
||||
unsigned int type, bool increment)
|
||||
static inline int mtrr_del(int reg, unsigned long base, unsigned long size)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
static __inline__ int mtrr_del (int reg, unsigned long base,
|
||||
unsigned long size)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
static __inline__ int mtrr_del_page (int reg, unsigned long base,
|
||||
unsigned long size)
|
||||
static inline int mtrr_del_page(int reg, unsigned long base, unsigned long size)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
@@ -125,7 +129,9 @@ static inline int mtrr_trim_uncached_memory(unsigned long end_pfn)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static __inline__ void mtrr_centaur_report_mcr(int mcr, u32 lo, u32 hi) {;}
|
||||
static inline void mtrr_centaur_report_mcr(int mcr, u32 lo, u32 hi)
|
||||
{
|
||||
}
|
||||
|
||||
#define mtrr_ap_init() do {} while (0)
|
||||
#define mtrr_bp_init() do {} while (0)
|
||||
@@ -134,15 +140,13 @@ static __inline__ void mtrr_centaur_report_mcr(int mcr, u32 lo, u32 hi) {;}
|
||||
#ifdef CONFIG_COMPAT
|
||||
#include <linux/compat.h>
|
||||
|
||||
struct mtrr_sentry32
|
||||
{
|
||||
struct mtrr_sentry32 {
|
||||
compat_ulong_t base; /* Base address */
|
||||
compat_uint_t size; /* Size of region */
|
||||
compat_uint_t type; /* Type of region */
|
||||
};
|
||||
|
||||
struct mtrr_gentry32
|
||||
{
|
||||
struct mtrr_gentry32 {
|
||||
compat_ulong_t regnum; /* Register number */
|
||||
compat_uint_t base; /* Base address */
|
||||
compat_uint_t size; /* Size of region */
|
||||
@@ -151,16 +155,17 @@ struct mtrr_gentry32
|
||||
|
||||
#define MTRR_IOCTL_BASE 'M'
|
||||
|
||||
#define MTRRIOC32_ADD_ENTRY _IOW(MTRR_IOCTL_BASE, 0, struct mtrr_sentry32)
|
||||
#define MTRRIOC32_SET_ENTRY _IOW(MTRR_IOCTL_BASE, 1, struct mtrr_sentry32)
|
||||
#define MTRRIOC32_DEL_ENTRY _IOW(MTRR_IOCTL_BASE, 2, struct mtrr_sentry32)
|
||||
#define MTRRIOC32_GET_ENTRY _IOWR(MTRR_IOCTL_BASE, 3, struct mtrr_gentry32)
|
||||
#define MTRRIOC32_KILL_ENTRY _IOW(MTRR_IOCTL_BASE, 4, struct mtrr_sentry32)
|
||||
#define MTRRIOC32_ADD_PAGE_ENTRY _IOW(MTRR_IOCTL_BASE, 5, struct mtrr_sentry32)
|
||||
#define MTRRIOC32_SET_PAGE_ENTRY _IOW(MTRR_IOCTL_BASE, 6, struct mtrr_sentry32)
|
||||
#define MTRRIOC32_DEL_PAGE_ENTRY _IOW(MTRR_IOCTL_BASE, 7, struct mtrr_sentry32)
|
||||
#define MTRRIOC32_GET_PAGE_ENTRY _IOWR(MTRR_IOCTL_BASE, 8, struct mtrr_gentry32)
|
||||
#define MTRRIOC32_KILL_PAGE_ENTRY _IOW(MTRR_IOCTL_BASE, 9, struct mtrr_sentry32)
|
||||
#define MTRRIOC32_ADD_ENTRY _IOW(MTRR_IOCTL_BASE, 0, struct mtrr_sentry32)
|
||||
#define MTRRIOC32_SET_ENTRY _IOW(MTRR_IOCTL_BASE, 1, struct mtrr_sentry32)
|
||||
#define MTRRIOC32_DEL_ENTRY _IOW(MTRR_IOCTL_BASE, 2, struct mtrr_sentry32)
|
||||
#define MTRRIOC32_GET_ENTRY _IOWR(MTRR_IOCTL_BASE, 3, struct mtrr_gentry32)
|
||||
#define MTRRIOC32_KILL_ENTRY _IOW(MTRR_IOCTL_BASE, 4, struct mtrr_sentry32)
|
||||
#define MTRRIOC32_ADD_PAGE_ENTRY _IOW(MTRR_IOCTL_BASE, 5, struct mtrr_sentry32)
|
||||
#define MTRRIOC32_SET_PAGE_ENTRY _IOW(MTRR_IOCTL_BASE, 6, struct mtrr_sentry32)
|
||||
#define MTRRIOC32_DEL_PAGE_ENTRY _IOW(MTRR_IOCTL_BASE, 7, struct mtrr_sentry32)
|
||||
#define MTRRIOC32_GET_PAGE_ENTRY _IOWR(MTRR_IOCTL_BASE, 8, struct mtrr_gentry32)
|
||||
#define MTRRIOC32_KILL_PAGE_ENTRY \
|
||||
_IOW(MTRR_IOCTL_BASE, 9, struct mtrr_sentry32)
|
||||
#endif /* CONFIG_COMPAT */
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
+31
-35
@@ -9,7 +9,7 @@
|
||||
#ifndef _ASM_MUTEX_H
|
||||
#define _ASM_MUTEX_H
|
||||
|
||||
#include "asm/alternative.h"
|
||||
#include <asm/alternative.h>
|
||||
|
||||
/**
|
||||
* __mutex_fastpath_lock - try to take the lock by moving the count
|
||||
@@ -21,22 +21,20 @@
|
||||
* wasn't 1 originally. This function MUST leave the value lower than 1
|
||||
* even when the "1" assertion wasn't true.
|
||||
*/
|
||||
#define __mutex_fastpath_lock(count, fail_fn) \
|
||||
do { \
|
||||
unsigned int dummy; \
|
||||
\
|
||||
typecheck(atomic_t *, count); \
|
||||
#define __mutex_fastpath_lock(count, fail_fn) \
|
||||
do { \
|
||||
unsigned int dummy; \
|
||||
\
|
||||
typecheck(atomic_t *, count); \
|
||||
typecheck_fn(void (*)(atomic_t *), fail_fn); \
|
||||
\
|
||||
__asm__ __volatile__( \
|
||||
LOCK_PREFIX " decl (%%eax) \n" \
|
||||
" jns 1f \n" \
|
||||
" call "#fail_fn" \n" \
|
||||
"1: \n" \
|
||||
\
|
||||
:"=a" (dummy) \
|
||||
: "a" (count) \
|
||||
: "memory", "ecx", "edx"); \
|
||||
\
|
||||
asm volatile(LOCK_PREFIX " decl (%%eax)\n" \
|
||||
" jns 1f \n" \
|
||||
" call " #fail_fn "\n" \
|
||||
"1:\n" \
|
||||
: "=a" (dummy) \
|
||||
: "a" (count) \
|
||||
: "memory", "ecx", "edx"); \
|
||||
} while (0)
|
||||
|
||||
|
||||
@@ -50,8 +48,8 @@ do { \
|
||||
* wasn't 1 originally. This function returns 0 if the fastpath succeeds,
|
||||
* or anything the slow path function returns
|
||||
*/
|
||||
static inline int
|
||||
__mutex_fastpath_lock_retval(atomic_t *count, int (*fail_fn)(atomic_t *))
|
||||
static inline int __mutex_fastpath_lock_retval(atomic_t *count,
|
||||
int (*fail_fn)(atomic_t *))
|
||||
{
|
||||
if (unlikely(atomic_dec_return(count) < 0))
|
||||
return fail_fn(count);
|
||||
@@ -72,22 +70,20 @@ __mutex_fastpath_lock_retval(atomic_t *count, int (*fail_fn)(atomic_t *))
|
||||
* __mutex_slowpath_needs_to_unlock() macro needs to return 1, it needs
|
||||
* to return 0 otherwise.
|
||||
*/
|
||||
#define __mutex_fastpath_unlock(count, fail_fn) \
|
||||
do { \
|
||||
unsigned int dummy; \
|
||||
\
|
||||
typecheck(atomic_t *, count); \
|
||||
#define __mutex_fastpath_unlock(count, fail_fn) \
|
||||
do { \
|
||||
unsigned int dummy; \
|
||||
\
|
||||
typecheck(atomic_t *, count); \
|
||||
typecheck_fn(void (*)(atomic_t *), fail_fn); \
|
||||
\
|
||||
__asm__ __volatile__( \
|
||||
LOCK_PREFIX " incl (%%eax) \n" \
|
||||
" jg 1f \n" \
|
||||
" call "#fail_fn" \n" \
|
||||
"1: \n" \
|
||||
\
|
||||
:"=a" (dummy) \
|
||||
: "a" (count) \
|
||||
: "memory", "ecx", "edx"); \
|
||||
\
|
||||
asm volatile(LOCK_PREFIX " incl (%%eax)\n" \
|
||||
" jg 1f\n" \
|
||||
" call " #fail_fn "\n" \
|
||||
"1:\n" \
|
||||
: "=a" (dummy) \
|
||||
: "a" (count) \
|
||||
: "memory", "ecx", "edx"); \
|
||||
} while (0)
|
||||
|
||||
#define __mutex_slowpath_needs_to_unlock() 1
|
||||
@@ -104,8 +100,8 @@ do { \
|
||||
* Additionally, if the value was < 0 originally, this function must not leave
|
||||
* it to 0 on failure.
|
||||
*/
|
||||
static inline int
|
||||
__mutex_fastpath_trylock(atomic_t *count, int (*fail_fn)(atomic_t *))
|
||||
static inline int __mutex_fastpath_trylock(atomic_t *count,
|
||||
int (*fail_fn)(atomic_t *))
|
||||
{
|
||||
/*
|
||||
* We have two variants here. The cmpxchg based one is the best one
|
||||
|
||||
+34
-39
@@ -16,23 +16,21 @@
|
||||
*
|
||||
* Atomically decrements @v and calls <fail_fn> if the result is negative.
|
||||
*/
|
||||
#define __mutex_fastpath_lock(v, fail_fn) \
|
||||
do { \
|
||||
unsigned long dummy; \
|
||||
\
|
||||
typecheck(atomic_t *, v); \
|
||||
typecheck_fn(void (*)(atomic_t *), fail_fn); \
|
||||
\
|
||||
__asm__ __volatile__( \
|
||||
LOCK_PREFIX " decl (%%rdi) \n" \
|
||||
" jns 1f \n" \
|
||||
" call "#fail_fn" \n" \
|
||||
"1:" \
|
||||
\
|
||||
:"=D" (dummy) \
|
||||
: "D" (v) \
|
||||
: "rax", "rsi", "rdx", "rcx", \
|
||||
"r8", "r9", "r10", "r11", "memory"); \
|
||||
#define __mutex_fastpath_lock(v, fail_fn) \
|
||||
do { \
|
||||
unsigned long dummy; \
|
||||
\
|
||||
typecheck(atomic_t *, v); \
|
||||
typecheck_fn(void (*)(atomic_t *), fail_fn); \
|
||||
\
|
||||
asm volatile(LOCK_PREFIX " decl (%%rdi)\n" \
|
||||
" jns 1f \n" \
|
||||
" call " #fail_fn "\n" \
|
||||
"1:" \
|
||||
: "=D" (dummy) \
|
||||
: "D" (v) \
|
||||
: "rax", "rsi", "rdx", "rcx", \
|
||||
"r8", "r9", "r10", "r11", "memory"); \
|
||||
} while (0)
|
||||
|
||||
/**
|
||||
@@ -45,9 +43,8 @@ do { \
|
||||
* it wasn't 1 originally. This function returns 0 if the fastpath succeeds,
|
||||
* or anything the slow path function returns
|
||||
*/
|
||||
static inline int
|
||||
__mutex_fastpath_lock_retval(atomic_t *count,
|
||||
int (*fail_fn)(atomic_t *))
|
||||
static inline int __mutex_fastpath_lock_retval(atomic_t *count,
|
||||
int (*fail_fn)(atomic_t *))
|
||||
{
|
||||
if (unlikely(atomic_dec_return(count) < 0))
|
||||
return fail_fn(count);
|
||||
@@ -62,23 +59,21 @@ __mutex_fastpath_lock_retval(atomic_t *count,
|
||||
*
|
||||
* Atomically increments @v and calls <fail_fn> if the result is nonpositive.
|
||||
*/
|
||||
#define __mutex_fastpath_unlock(v, fail_fn) \
|
||||
do { \
|
||||
unsigned long dummy; \
|
||||
\
|
||||
typecheck(atomic_t *, v); \
|
||||
typecheck_fn(void (*)(atomic_t *), fail_fn); \
|
||||
\
|
||||
__asm__ __volatile__( \
|
||||
LOCK_PREFIX " incl (%%rdi) \n" \
|
||||
" jg 1f \n" \
|
||||
" call "#fail_fn" \n" \
|
||||
"1: " \
|
||||
\
|
||||
:"=D" (dummy) \
|
||||
: "D" (v) \
|
||||
: "rax", "rsi", "rdx", "rcx", \
|
||||
"r8", "r9", "r10", "r11", "memory"); \
|
||||
#define __mutex_fastpath_unlock(v, fail_fn) \
|
||||
do { \
|
||||
unsigned long dummy; \
|
||||
\
|
||||
typecheck(atomic_t *, v); \
|
||||
typecheck_fn(void (*)(atomic_t *), fail_fn); \
|
||||
\
|
||||
asm volatile(LOCK_PREFIX " incl (%%rdi)\n" \
|
||||
" jg 1f\n" \
|
||||
" call " #fail_fn "\n" \
|
||||
"1:" \
|
||||
: "=D" (dummy) \
|
||||
: "D" (v) \
|
||||
: "rax", "rsi", "rdx", "rcx", \
|
||||
"r8", "r9", "r10", "r11", "memory"); \
|
||||
} while (0)
|
||||
|
||||
#define __mutex_slowpath_needs_to_unlock() 1
|
||||
@@ -93,8 +88,8 @@ do { \
|
||||
* if it wasn't 1 originally. [the fallback function is never used on
|
||||
* x86_64, because all x86_64 CPUs have a CMPXCHG instruction.]
|
||||
*/
|
||||
static inline int
|
||||
__mutex_fastpath_trylock(atomic_t *count, int (*fail_fn)(atomic_t *))
|
||||
static inline int __mutex_fastpath_trylock(atomic_t *count,
|
||||
int (*fail_fn)(atomic_t *))
|
||||
{
|
||||
if (likely(atomic_cmpxchg(count, 1, 0) == 1))
|
||||
return 1;
|
||||
|
||||
+91
-3
@@ -1,5 +1,93 @@
|
||||
#ifdef CONFIG_X86_32
|
||||
# include "nmi_32.h"
|
||||
#ifndef _ASM_X86_NMI_H_
|
||||
#define _ASM_X86_NMI_H_
|
||||
|
||||
#include <linux/pm.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
#ifdef ARCH_HAS_NMI_WATCHDOG
|
||||
|
||||
/**
|
||||
* do_nmi_callback
|
||||
*
|
||||
* Check to see if a callback exists and execute it. Return 1
|
||||
* if the handler exists and was handled successfully.
|
||||
*/
|
||||
int do_nmi_callback(struct pt_regs *regs, int cpu);
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
/** Replace the PM callback routine for NMI. */
|
||||
struct pm_dev *set_nmi_pm_callback(pm_callback callback);
|
||||
|
||||
/** Unset the PM callback routine back to the default. */
|
||||
void unset_nmi_pm_callback(struct pm_dev *dev);
|
||||
|
||||
#else
|
||||
# include "nmi_64.h"
|
||||
|
||||
static inline struct pm_dev *set_nmi_pm_callback(pm_callback callback)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void unset_nmi_pm_callback(struct pm_dev *dev)
|
||||
{
|
||||
}
|
||||
|
||||
#endif /* CONFIG_PM */
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
extern void default_do_nmi(struct pt_regs *);
|
||||
extern void die_nmi(char *str, struct pt_regs *regs, int do_panic);
|
||||
extern void nmi_watchdog_default(void);
|
||||
#else
|
||||
#define nmi_watchdog_default() do {} while (0)
|
||||
#endif
|
||||
|
||||
extern int check_nmi_watchdog(void);
|
||||
extern int nmi_watchdog_enabled;
|
||||
extern int unknown_nmi_panic;
|
||||
extern int avail_to_resrv_perfctr_nmi_bit(unsigned int);
|
||||
extern int avail_to_resrv_perfctr_nmi(unsigned int);
|
||||
extern int reserve_perfctr_nmi(unsigned int);
|
||||
extern void release_perfctr_nmi(unsigned int);
|
||||
extern int reserve_evntsel_nmi(unsigned int);
|
||||
extern void release_evntsel_nmi(unsigned int);
|
||||
|
||||
extern void setup_apic_nmi_watchdog(void *);
|
||||
extern void stop_apic_nmi_watchdog(void *);
|
||||
extern void disable_timer_nmi_watchdog(void);
|
||||
extern void enable_timer_nmi_watchdog(void);
|
||||
extern int nmi_watchdog_tick(struct pt_regs *regs, unsigned reason);
|
||||
|
||||
extern atomic_t nmi_active;
|
||||
extern unsigned int nmi_watchdog;
|
||||
#define NMI_DISABLED -1
|
||||
#define NMI_NONE 0
|
||||
#define NMI_IO_APIC 1
|
||||
#define NMI_LOCAL_APIC 2
|
||||
#define NMI_INVALID 3
|
||||
#define NMI_DEFAULT NMI_DISABLED
|
||||
|
||||
struct ctl_table;
|
||||
struct file;
|
||||
extern int proc_nmi_enabled(struct ctl_table *, int , struct file *,
|
||||
void __user *, size_t *, loff_t *);
|
||||
extern int unknown_nmi_panic;
|
||||
|
||||
void __trigger_all_cpu_backtrace(void);
|
||||
#define trigger_all_cpu_backtrace() __trigger_all_cpu_backtrace()
|
||||
|
||||
#endif
|
||||
|
||||
void lapic_watchdog_stop(void);
|
||||
int lapic_watchdog_init(unsigned nmi_hz);
|
||||
int lapic_wd_event(unsigned nmi_hz);
|
||||
unsigned lapic_adjust_nmi_hz(unsigned hz);
|
||||
int lapic_watchdog_ok(void);
|
||||
void disable_lapic_nmi_watchdog(void);
|
||||
void enable_lapic_nmi_watchdog(void);
|
||||
void stop_nmi(void);
|
||||
void restart_nmi(void);
|
||||
|
||||
#endif
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user