Commit 1660b1af authored by Anton Altaparmakov's avatar Anton Altaparmakov

Merge cantab.net:/home/src/bklinux-2.6

into cantab.net:/home/src/ntfs-2.6
parents b7f91987 57bea21a
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include <linux/smp.h> #include <linux/smp.h>
#include <asm/semaphore.h> #include <asm/semaphore.h>
#include <asm/processor.h> #include <asm/processor.h>
#include <asm/i387.h>
#include <asm/msr.h> #include <asm/msr.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/mmu_context.h> #include <asm/mmu_context.h>
...@@ -536,5 +537,5 @@ void __init cpu_init (void) ...@@ -536,5 +537,5 @@ void __init cpu_init (void)
*/ */
current_thread_info()->status = 0; current_thread_info()->status = 0;
current->used_math = 0; current->used_math = 0;
stts(); mxcsr_feature_mask_init();
} }
...@@ -24,6 +24,22 @@ ...@@ -24,6 +24,22 @@
#define HAVE_HWFP 1 #define HAVE_HWFP 1
#endif #endif
unsigned long mxcsr_feature_mask = 0xffffffff;
void mxcsr_feature_mask_init(void)
{
unsigned long mask = 0;
clts();
if (cpu_has_fxsr) {
memset(&current->thread.i387.fxsave, 0, sizeof(struct i387_fxsave_struct));
asm volatile("fxsave %0" : : "m" (current->thread.i387.fxsave));
mask = current->thread.i387.fxsave.mxcsr_mask;
if (mask == 0) mask = 0x0000ffbf;
}
mxcsr_feature_mask &= mask;
stts();
}
/* /*
* The _current_ task is using the FPU for the first time * The _current_ task is using the FPU for the first time
* so initialize it and set the mxcsr to its default * so initialize it and set the mxcsr to its default
...@@ -204,13 +220,6 @@ void set_fpu_twd( struct task_struct *tsk, unsigned short twd ) ...@@ -204,13 +220,6 @@ void set_fpu_twd( struct task_struct *tsk, unsigned short twd )
} }
} }
void set_fpu_mxcsr( struct task_struct *tsk, unsigned short mxcsr )
{
if ( cpu_has_xmm ) {
tsk->thread.i387.fxsave.mxcsr = (mxcsr & 0xffbf);
}
}
/* /*
* FXSR floating point environment conversions. * FXSR floating point environment conversions.
*/ */
...@@ -355,8 +364,8 @@ static int restore_i387_fxsave( struct _fpstate __user *buf ) ...@@ -355,8 +364,8 @@ static int restore_i387_fxsave( struct _fpstate __user *buf )
clear_fpu( tsk ); clear_fpu( tsk );
err = __copy_from_user( &tsk->thread.i387.fxsave, &buf->_fxsr_env[0], err = __copy_from_user( &tsk->thread.i387.fxsave, &buf->_fxsr_env[0],
sizeof(struct i387_fxsave_struct) ); sizeof(struct i387_fxsave_struct) );
/* mxcsr bit 6 and 31-16 must be zero for security reasons */ /* mxcsr reserved bits must be masked to zero for security reasons */
tsk->thread.i387.fxsave.mxcsr &= 0xffbf; tsk->thread.i387.fxsave.mxcsr &= mxcsr_feature_mask;
return err ? 1 : convert_fxsr_from_user( &tsk->thread.i387.fxsave, buf ); return err ? 1 : convert_fxsr_from_user( &tsk->thread.i387.fxsave, buf );
} }
...@@ -457,8 +466,8 @@ int set_fpxregs( struct task_struct *tsk, struct user_fxsr_struct __user *buf ) ...@@ -457,8 +466,8 @@ int set_fpxregs( struct task_struct *tsk, struct user_fxsr_struct __user *buf )
if (__copy_from_user( &tsk->thread.i387.fxsave, buf, if (__copy_from_user( &tsk->thread.i387.fxsave, buf,
sizeof(struct user_fxsr_struct) )) sizeof(struct user_fxsr_struct) ))
ret = -EFAULT; ret = -EFAULT;
/* mxcsr bit 6 and 31-16 must be zero for security reasons */ /* mxcsr reserved bits must be masked to zero for security reasons */
tsk->thread.i387.fxsave.mxcsr &= 0xffbf; tsk->thread.i387.fxsave.mxcsr &= mxcsr_feature_mask;
} else { } else {
ret = -EIO; ret = -EIO;
} }
......
...@@ -72,6 +72,7 @@ do_fpu_end(void) ...@@ -72,6 +72,7 @@ do_fpu_end(void)
/* restore FPU regs if necessary */ /* restore FPU regs if necessary */
/* Do it out of line so that gcc does not move cr0 load to some stupid place */ /* Do it out of line so that gcc does not move cr0 load to some stupid place */
kernel_fpu_end(); kernel_fpu_end();
mxcsr_feature_mask_init();
} }
void restore_processor_state(void) void restore_processor_state(void)
......
...@@ -155,7 +155,7 @@ int restore_i387_ia32(struct task_struct *tsk, struct _fpstate_ia32 *buf, int fs ...@@ -155,7 +155,7 @@ int restore_i387_ia32(struct task_struct *tsk, struct _fpstate_ia32 *buf, int fs
&buf->_fxsr_env[0], &buf->_fxsr_env[0],
sizeof(struct i387_fxsave_struct))) sizeof(struct i387_fxsave_struct)))
return -1; return -1;
tsk->thread.i387.fxsave.mxcsr &= 0xffbf; tsk->thread.i387.fxsave.mxcsr &= mxcsr_feature_mask;
tsk->used_math = 1; tsk->used_math = 1;
} }
return convert_fxsr_from_user(&tsk->thread.i387.fxsave, buf); return convert_fxsr_from_user(&tsk->thread.i387.fxsave, buf);
......
...@@ -357,10 +357,10 @@ asmlinkage long sys32_ptrace(long request, u32 pid, u32 addr, u32 data) ...@@ -357,10 +357,10 @@ asmlinkage long sys32_ptrace(long request, u32 pid, u32 addr, u32 data)
/* no checking to be bug-to-bug compatible with i386 */ /* no checking to be bug-to-bug compatible with i386 */
__copy_from_user(&child->thread.i387.fxsave, u, sizeof(*u)); __copy_from_user(&child->thread.i387.fxsave, u, sizeof(*u));
child->used_math = 1; child->used_math = 1;
child->thread.i387.fxsave.mxcsr &= 0xffbf; child->thread.i387.fxsave.mxcsr &= mxcsr_feature_mask;
ret = 0; ret = 0;
break; break;
} }
default: default:
ret = -EINVAL; ret = -EINVAL;
......
...@@ -24,6 +24,20 @@ ...@@ -24,6 +24,20 @@
#include <asm/ptrace.h> #include <asm/ptrace.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
unsigned int mxcsr_feature_mask = 0xffffffff;
void mxcsr_feature_mask_init(void)
{
unsigned int mask;
clts();
memset(&current->thread.i387.fxsave, 0, sizeof(struct i387_fxsave_struct));
asm volatile("fxsave %0" : : "m" (current->thread.i387.fxsave));
mask = current->thread.i387.fxsave.mxcsr_mask;
if (mask == 0) mask = 0x0000ffbf;
mxcsr_feature_mask &= mask;
stts();
}
/* /*
* Called at bootup to set up the initial FPU state that is later cloned * Called at bootup to set up the initial FPU state that is later cloned
* into all processes. * into all processes.
...@@ -40,8 +54,8 @@ void __init fpu_init(void) ...@@ -40,8 +54,8 @@ void __init fpu_init(void)
write_cr0(oldcr0 & ~((1UL<<3)|(1UL<<2))); /* clear TS and EM */ write_cr0(oldcr0 & ~((1UL<<3)|(1UL<<2))); /* clear TS and EM */
mxcsr_feature_mask_init();
/* clean state in init */ /* clean state in init */
stts();
current_thread_info()->status = 0; current_thread_info()->status = 0;
current->used_math = 0; current->used_math = 0;
} }
......
...@@ -77,6 +77,7 @@ do_fpu_end(void) ...@@ -77,6 +77,7 @@ do_fpu_end(void)
/* restore FPU regs if necessary */ /* restore FPU regs if necessary */
/* Do it out of line so that gcc does not move cr0 load to some stupid place */ /* Do it out of line so that gcc does not move cr0 load to some stupid place */
kernel_fpu_end(); kernel_fpu_end();
mxcsr_feature_mask_init();
} }
void restore_processor_state(void) void restore_processor_state(void)
......
...@@ -1702,11 +1702,22 @@ static int idedisk_cleanup (ide_drive_t *drive) ...@@ -1702,11 +1702,22 @@ static int idedisk_cleanup (ide_drive_t *drive)
static int idedisk_attach(ide_drive_t *drive); static int idedisk_attach(ide_drive_t *drive);
static void ide_device_shutdown(struct device *dev)
{
ide_drive_t *drive = container_of(dev, ide_drive_t, gendev);
printk("Shutdown: %s\n", drive->name);
dev->bus->suspend(dev, PM_SUSPEND_STANDBY);
}
/* /*
* IDE subdriver functions, registered with ide.c * IDE subdriver functions, registered with ide.c
*/ */
static ide_driver_t idedisk_driver = { static ide_driver_t idedisk_driver = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.gen_driver = {
.shutdown = ide_device_shutdown,
},
.name = "ide-disk", .name = "ide-disk",
.version = IDEDISK_VERSION, .version = IDEDISK_VERSION,
.media = ide_disk, .media = ide_disk,
...@@ -1779,7 +1790,8 @@ static int ide_cacheflush_p(ide_drive_t *drive) ...@@ -1779,7 +1790,8 @@ static int ide_cacheflush_p(ide_drive_t *drive)
static int idedisk_release(struct inode *inode, struct file *filp) static int idedisk_release(struct inode *inode, struct file *filp)
{ {
ide_drive_t *drive = inode->i_bdev->bd_disk->private_data; ide_drive_t *drive = inode->i_bdev->bd_disk->private_data;
ide_cacheflush_p(drive); if (drive->usage == 1)
ide_cacheflush_p(drive);
if (drive->removable && drive->usage == 1) { if (drive->removable && drive->usage == 1) {
ide_task_t args; ide_task_t args;
memset(&args, 0, sizeof(ide_task_t)); memset(&args, 0, sizeof(ide_task_t));
......
...@@ -146,11 +146,35 @@ void ps2pp_set_800dpi(struct psmouse *psmouse) ...@@ -146,11 +146,35 @@ void ps2pp_set_800dpi(struct psmouse *psmouse)
static int ps2pp_detect_model(struct psmouse *psmouse, unsigned char *param) static int ps2pp_detect_model(struct psmouse *psmouse, unsigned char *param)
{ {
int i; int i;
static int logitech_4btn[] = { 12, 40, 41, 42, 43, 52, 73, 80, -1 }; static struct _logips2_list {
static int logitech_wheel[] = { 52, 53, 75, 76, 80, 81, 83, 88, 112, -1 }; const int model;
static int logitech_ps2pp[] = { 12, 13, 40, 41, 42, 43, 50, 51, 52, 53, 73, 75, unsigned const int features;
76, 80, 81, 83, 88, 96, 97, 112, -1 }; } logips2pp_list [] = {
static int logitech_mx[] = { 61, 112, -1 }; { 12, PS2PP_4BTN},
{ 13, 0 },
{ 40, PS2PP_4BTN },
{ 41, PS2PP_4BTN },
{ 42, PS2PP_4BTN },
{ 43, PS2PP_4BTN },
{ 50, 0 },
{ 51, 0 },
{ 52, PS2PP_4BTN | PS2PP_WHEEL },
{ 53, PS2PP_WHEEL },
{ 61, PS2PP_WHEEL | PS2PP_MX }, /* MX700 */
{ 73, PS2PP_4BTN },
{ 75, PS2PP_WHEEL },
{ 76, PS2PP_WHEEL },
{ 80, PS2PP_4BTN | PS2PP_WHEEL },
{ 81, PS2PP_WHEEL },
{ 83, PS2PP_WHEEL },
{ 88, PS2PP_WHEEL },
{ 96, 0 },
{ 97, 0 },
{ 100 , PS2PP_WHEEL | PS2PP_MX }, /* MX510 */
{ 112 , PS2PP_WHEEL | PS2PP_MX }, /* MX500 */
{ 114 , PS2PP_WHEEL | PS2PP_MX | PS2PP_MX310 }, /* MX310 */
{ }
};
psmouse->vendor = "Logitech"; psmouse->vendor = "Logitech";
psmouse->model = ((param[0] >> 4) & 0x07) | ((param[0] << 3) & 0x78); psmouse->model = ((param[0] >> 4) & 0x07) | ((param[0] << 3) & 0x78);
...@@ -162,35 +186,33 @@ static int ps2pp_detect_model(struct psmouse *psmouse, unsigned char *param) ...@@ -162,35 +186,33 @@ static int ps2pp_detect_model(struct psmouse *psmouse, unsigned char *param)
psmouse->type = PSMOUSE_PS2; psmouse->type = PSMOUSE_PS2;
for (i = 0; logitech_ps2pp[i] != -1; i++) for (i = 0; logips2pp_list[i].model; i++){
if (logitech_ps2pp[i] == psmouse->model) if (logips2pp_list[i].model == psmouse->model){
psmouse->type = PSMOUSE_PS2PP; psmouse->type = PSMOUSE_PS2PP;
if (logips2pp_list[i].features & PS2PP_4BTN)
if (psmouse->type == PSMOUSE_PS2PP) {
for (i = 0; logitech_4btn[i] != -1; i++)
if (logitech_4btn[i] == psmouse->model)
set_bit(BTN_SIDE, psmouse->dev.keybit); set_bit(BTN_SIDE, psmouse->dev.keybit);
for (i = 0; logitech_wheel[i] != -1; i++) if (logips2pp_list[i].features & PS2PP_WHEEL){
if (logitech_wheel[i] == psmouse->model) {
set_bit(REL_WHEEL, psmouse->dev.relbit); set_bit(REL_WHEEL, psmouse->dev.relbit);
psmouse->name = "Wheel Mouse"; psmouse->name = "Wheel Mouse";
} }
if (logips2pp_list[i].features & PS2PP_MX) {
for (i = 0; logitech_mx[i] != -1; i++)
if (logitech_mx[i] == psmouse->model) {
set_bit(BTN_SIDE, psmouse->dev.keybit); set_bit(BTN_SIDE, psmouse->dev.keybit);
set_bit(BTN_EXTRA, psmouse->dev.keybit); set_bit(BTN_EXTRA, psmouse->dev.keybit);
set_bit(BTN_BACK, psmouse->dev.keybit);
set_bit(BTN_FORWARD, psmouse->dev.keybit);
set_bit(BTN_TASK, psmouse->dev.keybit); set_bit(BTN_TASK, psmouse->dev.keybit);
if (!(logips2pp_list[i].features & PS2PP_MX310)){
set_bit(BTN_BACK, psmouse->dev.keybit);
set_bit(BTN_FORWARD, psmouse->dev.keybit);
}
psmouse->name = "MX Mouse"; psmouse->name = "MX Mouse";
} }
break;
}
}
/* /*
* Do Logitech PS2++ / PS2T++ magic init. * Do Logitech PS2++ / PS2T++ magic init.
*/ */
if (psmouse->type == PSMOUSE_PS2PP) {
if (psmouse->model == 97) { /* TouchPad 3 */ if (psmouse->model == 97) { /* TouchPad 3 */
......
...@@ -10,6 +10,12 @@ ...@@ -10,6 +10,12 @@
#ifndef _LOGIPS2PP_H #ifndef _LOGIPS2PP_H
#define _LOGIPS2PP_H #define _LOGIPS2PP_H
#define PS2PP_4BTN 0x01
#define PS2PP_WHEEL 0x02
#define PS2PP_MX 0x04
#define PS2PP_MX310 0x08
struct psmouse; struct psmouse;
void ps2pp_process_packet(struct psmouse *psmouse); void ps2pp_process_packet(struct psmouse *psmouse);
void ps2pp_set_800dpi(struct psmouse *psmouse); void ps2pp_set_800dpi(struct psmouse *psmouse);
......
...@@ -12,10 +12,13 @@ ...@@ -12,10 +12,13 @@
#define __ASM_I386_I387_H #define __ASM_I386_I387_H
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/init.h>
#include <asm/processor.h> #include <asm/processor.h>
#include <asm/sigcontext.h> #include <asm/sigcontext.h>
#include <asm/user.h> #include <asm/user.h>
extern unsigned long mxcsr_feature_mask;
extern void mxcsr_feature_mask_init(void);
extern void init_fpu(struct task_struct *); extern void init_fpu(struct task_struct *);
/* /*
* FPU lazy state save handling... * FPU lazy state save handling...
...@@ -89,12 +92,6 @@ extern unsigned short get_fpu_mxcsr( struct task_struct *tsk ); ...@@ -89,12 +92,6 @@ extern unsigned short get_fpu_mxcsr( struct task_struct *tsk );
extern void set_fpu_cwd( struct task_struct *tsk, unsigned short cwd ); extern void set_fpu_cwd( struct task_struct *tsk, unsigned short cwd );
extern void set_fpu_swd( struct task_struct *tsk, unsigned short swd ); extern void set_fpu_swd( struct task_struct *tsk, unsigned short swd );
extern void set_fpu_twd( struct task_struct *tsk, unsigned short twd ); extern void set_fpu_twd( struct task_struct *tsk, unsigned short twd );
extern void set_fpu_mxcsr( struct task_struct *tsk, unsigned short mxcsr );
#define load_mxcsr( val ) do { \
unsigned long __mxcsr = ((unsigned long)(val) & 0xffbf); \
asm volatile( "ldmxcsr %0" : : "m" (__mxcsr) ); \
} while (0)
/* /*
* Signal frame handlers... * Signal frame handlers...
......
...@@ -332,7 +332,7 @@ struct i387_fxsave_struct { ...@@ -332,7 +332,7 @@ struct i387_fxsave_struct {
long foo; long foo;
long fos; long fos;
long mxcsr; long mxcsr;
long reserved; long mxcsr_mask;
long st_space[32]; /* 8*16 bytes for each FP-reg = 128 bytes */ long st_space[32]; /* 8*16 bytes for each FP-reg = 128 bytes */
long xmm_space[32]; /* 8*16 bytes for each XMM-reg = 128 bytes */ long xmm_space[32]; /* 8*16 bytes for each XMM-reg = 128 bytes */
long padding[56]; long padding[56];
......
...@@ -78,8 +78,8 @@ struct pte_freelist_batch ...@@ -78,8 +78,8 @@ struct pte_freelist_batch
struct page * pages[0]; struct page * pages[0];
}; };
#define PTE_FREELIST_SIZE ((PAGE_SIZE - sizeof(struct pte_freelist_batch) / \ #define PTE_FREELIST_SIZE ((PAGE_SIZE - sizeof(struct pte_freelist_batch)) / \
sizeof(struct page *))) sizeof(struct page *))
extern void pte_free_now(struct page *ptepage); extern void pte_free_now(struct page *ptepage);
extern void pte_free_submit(struct pte_freelist_batch *batch); extern void pte_free_submit(struct pte_freelist_batch *batch);
......
...@@ -20,6 +20,8 @@ ...@@ -20,6 +20,8 @@
#include <asm/uaccess.h> #include <asm/uaccess.h>
extern void fpu_init(void); extern void fpu_init(void);
extern unsigned int mxcsr_feature_mask;
extern void mxcsr_feature_mask_init(void);
extern void init_fpu(struct task_struct *child); extern void init_fpu(struct task_struct *child);
extern int save_i387(struct _fpstate *buf); extern int save_i387(struct _fpstate *buf);
...@@ -52,11 +54,6 @@ static inline int need_signal_i387(struct task_struct *me) ...@@ -52,11 +54,6 @@ static inline int need_signal_i387(struct task_struct *me)
} \ } \
} while (0) } while (0)
#define load_mxcsr(val) do { \
unsigned long __mxcsr = ((unsigned long)(val) & 0xffbf); \
asm volatile("ldmxcsr %0" : : "m" (__mxcsr)); \
} while (0)
/* /*
* ptrace request handers... * ptrace request handers...
*/ */
...@@ -75,7 +72,6 @@ extern int set_fpregs(struct task_struct *tsk, ...@@ -75,7 +72,6 @@ extern int set_fpregs(struct task_struct *tsk,
#define set_fpu_cwd(t,val) ((t)->thread.i387.fxsave.cwd = (val)) #define set_fpu_cwd(t,val) ((t)->thread.i387.fxsave.cwd = (val))
#define set_fpu_swd(t,val) ((t)->thread.i387.fxsave.swd = (val)) #define set_fpu_swd(t,val) ((t)->thread.i387.fxsave.swd = (val))
#define set_fpu_fxsr_twd(t,val) ((t)->thread.i387.fxsave.twd = (val)) #define set_fpu_fxsr_twd(t,val) ((t)->thread.i387.fxsave.twd = (val))
#define set_fpu_mxcsr(t,val) ((t)->thread.i387.fxsave.mxcsr = (val)&0xffbf)
static inline int restore_fpu_checking(struct i387_fxsave_struct *fx) static inline int restore_fpu_checking(struct i387_fxsave_struct *fx)
{ {
......
...@@ -956,16 +956,10 @@ static void change_sym_value(struct menu *menu, gint col) ...@@ -956,16 +956,10 @@ static void change_sym_value(struct menu *menu, gint col)
static void toggle_sym_value(struct menu *menu) static void toggle_sym_value(struct menu *menu)
{ {
const tristate next_val[3] = { no, mod, yes };
tristate newval;
if (!menu->sym) if (!menu->sym)
return; return;
newval = next_val[(sym_get_tristate_value(menu->sym) + 1) % 3]; sym_toggle_tristate_value(menu->sym);
if (!sym_tristate_within_range(menu->sym, newval))
newval = yes;
sym_set_tristate_value(menu->sym, newval);
if (view_mode == FULL_VIEW) if (view_mode == FULL_VIEW)
update_tree(&rootmenu, NULL); update_tree(&rootmenu, NULL);
else if (view_mode == SPLIT_VIEW) { else if (view_mode == SPLIT_VIEW) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment