Commit 350827b4 authored by Linus Torvalds's avatar Linus Torvalds

Import 0.99.15e

parent 17e969fb
VERSION = 0.99 VERSION = 0.99
PATCHLEVEL = 15 PATCHLEVEL = 15
ALPHA = d ALPHA = e
all: Version zImage all: Version zImage
......
...@@ -35,9 +35,10 @@ ...@@ -35,9 +35,10 @@
/* p 15-5: Precision control bits affect only the following: /* p 15-5: Precision control bits affect only the following:
ADD, SUB(R), MUL, DIV(R), and SQRT */ ADD, SUB(R), MUL, DIV(R), and SQRT */
#define PR_24_BITS _Const_(0x000) #define PR_24_BITS _Const_(0x000)
#define PR_53_BITS _Const_(0x200) #define PR_53_BITS _Const_(0x200)
#define PR_64_BITS _Const_(0x300) #define PR_64_BITS _Const_(0x300)
#define PR_RESERVED_BITS _Const_(0x100)
/* FULL_PRECISION simulates all exceptions masked */ /* FULL_PRECISION simulates all exceptions masked */
#define FULL_PRECISION (PR_64_BITS | RC_RND | 0x3f) #define FULL_PRECISION (PR_64_BITS | RC_RND | 0x3f)
......
...@@ -261,6 +261,7 @@ static struct { ...@@ -261,6 +261,7 @@ static struct {
0x233 in reg_round.S 0x233 in reg_round.S
0x234 in reg_round.S 0x234 in reg_round.S
0x235 in reg_round.S 0x235 in reg_round.S
0x236 in reg_round.S
*/ */
void exception(int n) void exception(int n)
......
...@@ -81,6 +81,12 @@ extern char emulating; ...@@ -81,6 +81,12 @@ extern char emulating;
#define PREFIX_REPE 0xf3 #define PREFIX_REPE 0xf3
#define PREFIX_REPNE 0xf2 #define PREFIX_REPNE 0xf2
#define PREFIX_LOCK 0xf0 #define PREFIX_LOCK 0xf0
#define PREFIX_CS_ 1
#define PREFIX_DS_ 2
#define PREFIX_ES_ 3
#define PREFIX_FS_ 4
#define PREFIX_GS_ 5
#define PREFIX_SS_ 6
/* These are to defeat the default action, giving the instruction /* These are to defeat the default action, giving the instruction
no net effect: */ no net effect: */
......
...@@ -560,7 +560,7 @@ static int valid_prefix(unsigned char *Byte, unsigned char **fpu_eip, ...@@ -560,7 +560,7 @@ static int valid_prefix(unsigned char *Byte, unsigned char **fpu_eip,
unsigned char byte; unsigned char byte;
unsigned char *ip = *fpu_eip; unsigned char *ip = *fpu_eip;
*override = (overrides) { 0, 0, PREFIX_DS }; /* defaults */ *override = (overrides) { 0, 0, PREFIX_DS_ }; /* defaults */
RE_ENTRANT_CHECK_OFF; RE_ENTRANT_CHECK_OFF;
FPU_code_verify_area(1); FPU_code_verify_area(1);
...@@ -580,23 +580,23 @@ static int valid_prefix(unsigned char *Byte, unsigned char **fpu_eip, ...@@ -580,23 +580,23 @@ static int valid_prefix(unsigned char *Byte, unsigned char **fpu_eip,
goto do_next_byte; goto do_next_byte;
case PREFIX_CS: case PREFIX_CS:
override->segment = PREFIX_CS; override->segment = PREFIX_CS_;
goto do_next_byte; goto do_next_byte;
case PREFIX_ES: case PREFIX_ES:
override->segment = PREFIX_ES; override->segment = PREFIX_ES_;
goto do_next_byte; goto do_next_byte;
case PREFIX_SS: case PREFIX_SS:
override->segment = PREFIX_SS; override->segment = PREFIX_SS_;
goto do_next_byte; goto do_next_byte;
case PREFIX_FS: case PREFIX_FS:
override->segment = PREFIX_FS; override->segment = PREFIX_FS_;
goto do_next_byte; goto do_next_byte;
case PREFIX_GS: case PREFIX_GS:
override->segment = PREFIX_GS; override->segment = PREFIX_GS_;
goto do_next_byte; goto do_next_byte;
case PREFIX_DS: /* Redundant unless preceded by another override. */ case PREFIX_DS: /* Redundant unless preceded by another override. */
override->segment = PREFIX_DS; override->segment = PREFIX_DS_;
/* lock is not a valid prefix for FPU instructions, /* lock is not a valid prefix for FPU instructions,
let the cpu handle it to generate a SIGILL. */ let the cpu handle it to generate a SIGILL. */
...@@ -635,7 +635,7 @@ static int valid_prefix(unsigned char *Byte, unsigned char **fpu_eip, ...@@ -635,7 +635,7 @@ static int valid_prefix(unsigned char *Byte, unsigned char **fpu_eip,
} }
void __math_abort(struct info * info, unsigned int signal) void math_abort(struct info * info, unsigned int signal)
{ {
FPU_EIP = FPU_ORIG_EIP; FPU_EIP = FPU_ORIG_EIP;
current->tss.trap_no = 16; current->tss.trap_no = 16;
......
...@@ -52,7 +52,7 @@ extern void fstp_i(void); ...@@ -52,7 +52,7 @@ extern void fstp_i(void);
/* fpu_entry.c */ /* fpu_entry.c */
asmlinkage void math_emulate(long arg); asmlinkage void math_emulate(long arg);
extern void __math_abort(struct info *info, unsigned int signal); extern void math_abort(struct info *info, unsigned int signal);
/* fpu_etc.c */ /* fpu_etc.c */
extern void fp_etc(void); extern void fp_etc(void);
......
...@@ -25,10 +25,6 @@ ...@@ -25,10 +25,6 @@
#define FPU_CS (*(unsigned short *) &(FPU_info->___cs)) #define FPU_CS (*(unsigned short *) &(FPU_info->___cs))
#define FPU_SS (*(unsigned short *) &(FPU_info->___ss)) #define FPU_SS (*(unsigned short *) &(FPU_info->___ss))
#define FPU_DS (*(unsigned short *) &(FPU_info->___ds)) #define FPU_DS (*(unsigned short *) &(FPU_info->___ds))
#define FPU_VM86_ES ((&FPU_SS)[2])
#define FPU_VM86_DS ((&FPU_SS)[4])
#define FPU_VM86_FS ((&FPU_SS)[6])
#define FPU_VM86_GS ((&FPU_SS)[8])
#define FPU_EAX (FPU_info->___eax) #define FPU_EAX (FPU_info->___eax)
#define FPU_EFLAGS (FPU_info->___eflags) #define FPU_EFLAGS (FPU_info->___eflags)
#define FPU_EIP (FPU_info->___eip) #define FPU_EIP (FPU_info->___eip)
......
...@@ -39,6 +39,18 @@ static int reg_offset[] = { ...@@ -39,6 +39,18 @@ static int reg_offset[] = {
#define REG_(x) (*(long *)(reg_offset[(x)]+(char *) FPU_info)) #define REG_(x) (*(long *)(reg_offset[(x)]+(char *) FPU_info))
static int reg_offset_vm86[] = {
offsetof(struct info,___cs),
offsetof(struct info,___vm86_ds),
offsetof(struct info,___vm86_es),
offsetof(struct info,___vm86_fs),
offsetof(struct info,___vm86_gs),
offsetof(struct info,___ss)
};
#define VM86_REG_(x) (*(unsigned short *) \
(reg_offset_vm86[((unsigned)x)]+(char *) FPU_info))
/* Decode the SIB byte. This function assumes mod != 0 */ /* Decode the SIB byte. This function assumes mod != 0 */
static void *sib(int mod, unsigned long *fpu_eip) static void *sib(int mod, unsigned long *fpu_eip)
...@@ -94,32 +106,18 @@ static void *sib(int mod, unsigned long *fpu_eip) ...@@ -94,32 +106,18 @@ static void *sib(int mod, unsigned long *fpu_eip)
return (void *) offset; return (void *) offset;
} }
static unsigned long vm86_segment(char segment)
static unsigned long vm86_segment(unsigned char segment)
{ {
switch ( segment ) segment--;
#ifdef PARANOID
if ( segment > PREFIX_SS_ )
{ {
case PREFIX_CS:
return FPU_CS << 4;
break;
case PREFIX_SS:
return FPU_SS << 4;
break;
case PREFIX_ES:
return FPU_VM86_ES << 4;
break;
case PREFIX_DS:
return FPU_VM86_DS << 4;
break;
case PREFIX_FS:
return FPU_VM86_FS << 4;
break;
case PREFIX_GS:
return FPU_VM86_GS << 4;
break;
default:
EXCEPTION(EX_INTERNAL|0x130); EXCEPTION(EX_INTERNAL|0x130);
return 0; /* Keep gcc quiet. */ math_abort(FPU_info,SIGSEGV);
} }
#endif PARANOID
return (unsigned long)VM86_REG_(segment) << 4;
} }
...@@ -156,7 +154,7 @@ void get_address(unsigned char FPU_modrm, unsigned long *fpu_eip, ...@@ -156,7 +154,7 @@ void get_address(unsigned char FPU_modrm, unsigned long *fpu_eip,
in 32 bit protected mode. */ in 32 bit protected mode. */
#define FPU_WRITE_BIT 0x10 #define FPU_WRITE_BIT 0x10
if ( !addr_modes.vm86 && (FPU_modrm & FPU_WRITE_BIT) if ( !addr_modes.vm86 && (FPU_modrm & FPU_WRITE_BIT)
&& (addr_modes.override.segment == PREFIX_CS) ) && (addr_modes.override.segment == PREFIX_CS_) )
{ {
math_abort(FPU_info,SIGSEGV); math_abort(FPU_info,SIGSEGV);
} }
...@@ -235,7 +233,7 @@ void get_address_16(unsigned char FPU_modrm, unsigned long *fpu_eip, ...@@ -235,7 +233,7 @@ void get_address_16(unsigned char FPU_modrm, unsigned long *fpu_eip,
in 32 bit protected mode. */ in 32 bit protected mode. */
#define FPU_WRITE_BIT 0x10 #define FPU_WRITE_BIT 0x10
if ( !addr_modes.vm86 && (FPU_modrm & FPU_WRITE_BIT) if ( !addr_modes.vm86 && (FPU_modrm & FPU_WRITE_BIT)
&& (addr_modes.override.segment == PREFIX_CS) ) && (addr_modes.override.segment == PREFIX_CS_) )
{ {
math_abort(FPU_info,SIGSEGV); math_abort(FPU_info,SIGSEGV);
} }
......
...@@ -1205,6 +1205,10 @@ char *fldenv(fpu_addr_modes addr_modes) ...@@ -1205,6 +1205,10 @@ char *fldenv(fpu_addr_modes addr_modes)
s += 0x1c; s += 0x1c;
} }
#ifdef PECULIAR_486
control_word &= ~0xe080;
#endif PECULIAR_486
top = (partial_status >> SW_Top_Shift) & 7; top = (partial_status >> SW_Top_Shift) & 7;
if ( partial_status & ~control_word & CW_Exceptions ) if ( partial_status & ~control_word & CW_Exceptions )
...@@ -1318,7 +1322,11 @@ char *fstenv(fpu_addr_modes addr_modes) ...@@ -1318,7 +1322,11 @@ char *fstenv(fpu_addr_modes addr_modes)
{ {
RE_ENTRANT_CHECK_OFF; RE_ENTRANT_CHECK_OFF;
FPU_verify_area(VERIFY_WRITE,d,14); FPU_verify_area(VERIFY_WRITE,d,14);
#ifdef PECULIAR_486
put_fs_long(control_word & ~0xe080, (unsigned short *) d);
#else
put_fs_word(control_word, (unsigned short *) d); put_fs_word(control_word, (unsigned short *) d);
#endif PECULIAR_486
put_fs_word(status_word(), (unsigned short *) (d+2)); put_fs_word(status_word(), (unsigned short *) (d+2));
put_fs_word(tag_word(), (unsigned short *) (d+4)); put_fs_word(tag_word(), (unsigned short *) (d+4));
put_fs_word(ip_offset, (unsigned short *) (d+6)); put_fs_word(ip_offset, (unsigned short *) (d+6));
......
...@@ -156,9 +156,19 @@ xDenorm_done: ...@@ -156,9 +156,19 @@ xDenorm_done:
cmpl PR_24_BITS,%ecx cmpl PR_24_BITS,%ecx
je LRound_To_24 je LRound_To_24
#ifdef PECULIAR_486
/* With the precision control bits set to 01 "(reserved)", a real 80486
behaves as if the precision control bits were set to 11 "64 bits" */
cmpl PR_RESERVED_BITS,%ecx
je LRound_To_64
#ifdef PARANOID
jmp L_bugged_denorm_486
#endif PARANOID
#else
#ifdef PARANOID #ifdef PARANOID
jmp L_bugged_denorm /* There is no bug, just a bad control word */ jmp L_bugged_denorm /* There is no bug, just a bad control word */
#endif PARANOID #endif PARANOID
#endif PECULIAR_486
/* Round etc to 24 bit precision */ /* Round etc to 24 bit precision */
...@@ -643,12 +653,19 @@ xDo_unmasked_underflow: ...@@ -643,12 +653,19 @@ xDo_unmasked_underflow:
#ifdef PARANOID #ifdef PARANOID
/* If we ever get here then we have problems! */ #ifdef PECULIAR_486
L_bugged_denorm_486:
pushl EX_INTERNAL|0x236
call EXCEPTION
popl %ebx
jmp L_exception_exit
#else
L_bugged_denorm: L_bugged_denorm:
pushl EX_INTERNAL|0x230 pushl EX_INTERNAL|0x230
call EXCEPTION call EXCEPTION
popl %ebx popl %ebx
jmp L_exception_exit jmp L_exception_exit
#endif PECULIAR_486
L_bugged_round24: L_bugged_round24:
pushl EX_INTERNAL|0x231 pushl EX_INTERNAL|0x231
......
...@@ -258,7 +258,13 @@ static void rs_stop(struct tty_struct *tty) ...@@ -258,7 +258,13 @@ static void rs_stop(struct tty_struct *tty)
struct async_struct *info; struct async_struct *info;
info = rs_table + DEV_TO_SL(tty->line); info = rs_table + DEV_TO_SL(tty->line);
if (info->flags & ASYNC_CLOSING) {
tty->stopped = 0;
tty->hw_stopped = 0;
return;
}
info->IER = UART_IER_MSI | UART_IER_RLSI | UART_IER_RDI; info->IER = UART_IER_MSI | UART_IER_RLSI | UART_IER_RDI;
#ifdef ISR_HACK #ifdef ISR_HACK
serial_out(info, UART_IER, info->IER); serial_out(info, UART_IER, info->IER);
...@@ -431,7 +437,7 @@ static inline int check_modem_status(struct async_struct *info) ...@@ -431,7 +437,7 @@ static inline int check_modem_status(struct async_struct *info)
rs_sched_event(info, RS_EVENT_HANGUP); rs_sched_event(info, RS_EVENT_HANGUP);
} }
} }
if (C_CRTSCTS(info->tty)) { if (C_CRTSCTS(info->tty) && !(info->flags & ASYNC_CLOSING)) {
if (info->tty->hw_stopped) { if (info->tty->hw_stopped) {
if (status & UART_MSR_CTS) { if (status & UART_MSR_CTS) {
#ifdef SERIAL_DEBUG_INTR #ifdef SERIAL_DEBUG_INTR
...@@ -1029,9 +1035,11 @@ void rs_write(struct tty_struct * tty) ...@@ -1029,9 +1035,11 @@ void rs_write(struct tty_struct * tty)
if (!tty || tty->stopped || tty->hw_stopped) if (!tty || tty->stopped || tty->hw_stopped)
return; return;
info = rs_table + DEV_TO_SL(tty->line); info = rs_table + DEV_TO_SL(tty->line);
if (!info || !info->tty || !(info->flags & ASYNC_INITIALIZED))
return;
cli(); cli();
if (!info || !info->tty || !(info->flags & ASYNC_INITIALIZED)) {
sti();
return;
}
restart_port(info); restart_port(info);
info->IER = (UART_IER_MSI | UART_IER_RLSI | info->IER = (UART_IER_MSI | UART_IER_RLSI |
UART_IER_THRI | UART_IER_RDI); UART_IER_THRI | UART_IER_RDI);
......
...@@ -1816,7 +1816,7 @@ static int tape_qic02_read(struct inode * inode, struct file * filp, char * buf, ...@@ -1816,7 +1816,7 @@ static int tape_qic02_read(struct inode * inode, struct file * filp, char * buf,
int stat; int stat;
if (TP_DIAGS(current_tape_dev)) if (TP_DIAGS(current_tape_dev))
printk(TPQIC_NAME ": request READ, minor=%x, buf=%lx, count=%x, pos=%x, flags=%x\n", printk(TPQIC_NAME ": request READ, minor=%x, buf=%p, count=%x, pos=%x, flags=%x\n",
MINOR(dev), buf, count, filp->f_pos, flags); MINOR(dev), buf, count, filp->f_pos, flags);
if (count % TAPE_BLKSIZE) { /* Only allow mod 512 bytes at a time. */ if (count % TAPE_BLKSIZE) { /* Only allow mod 512 bytes at a time. */
...@@ -1833,7 +1833,7 @@ static int tape_qic02_read(struct inode * inode, struct file * filp, char * buf, ...@@ -1833,7 +1833,7 @@ static int tape_qic02_read(struct inode * inode, struct file * filp, char * buf,
/* Make sure buffer is safe to write into. */ /* Make sure buffer is safe to write into. */
error = verify_area(VERIFY_WRITE, buf, count); error = verify_area(VERIFY_WRITE, buf, count);
if (error) { if (error) {
printk(TPQIC_NAME ": read: verify_area(WRITE, %lx, %x) failed\n", buf, count); printk(TPQIC_NAME ": read: verify_area(WRITE, %p, %x) failed\n", buf, count);
return error; return error;
} }
...@@ -1985,7 +1985,7 @@ static int tape_qic02_write(struct inode * inode, struct file * filp, char * buf ...@@ -1985,7 +1985,7 @@ static int tape_qic02_write(struct inode * inode, struct file * filp, char * buf
unsigned long bytes_todo, bytes_done, total_bytes_done = 0; unsigned long bytes_todo, bytes_done, total_bytes_done = 0;
if (TP_DIAGS(current_tape_dev)) if (TP_DIAGS(current_tape_dev))
printk(TPQIC_NAME ": request WRITE, minor=%x, buf=%lx, count=%x, pos=%x, flags=%x\n", printk(TPQIC_NAME ": request WRITE, minor=%x, buf=%p, count=%x, pos=%x, flags=%x\n",
MINOR(dev), buf, count, filp->f_pos, flags); MINOR(dev), buf, count, filp->f_pos, flags);
if (count % TAPE_BLKSIZE) { /* only allow mod 512 bytes at a time */ if (count % TAPE_BLKSIZE) { /* only allow mod 512 bytes at a time */
...@@ -2010,7 +2010,7 @@ static int tape_qic02_write(struct inode * inode, struct file * filp, char * buf ...@@ -2010,7 +2010,7 @@ static int tape_qic02_write(struct inode * inode, struct file * filp, char * buf
/* Make sure buffer is safe to read from. */ /* Make sure buffer is safe to read from. */
error = verify_area(VERIFY_READ, buf, count); error = verify_area(VERIFY_READ, buf, count);
if (error) { if (error) {
printk(TPQIC_NAME ": write: verify_area(READ, %lx, %x) failed\n", buf, count); printk(TPQIC_NAME ": write: verify_area(READ, %p, %x) failed\n", buf, count);
return error; return error;
} }
...@@ -2107,7 +2107,7 @@ static int tape_qic02_write(struct inode * inode, struct file * filp, char * buf ...@@ -2107,7 +2107,7 @@ static int tape_qic02_write(struct inode * inode, struct file * filp, char * buf
} }
} }
tpqputs("write request for <0 bytes"); tpqputs("write request for <0 bytes");
printk(TPQIC_NAME ": status_bytes_wr %x, buf %x, total_bytes_done %x, count %x\n", status_bytes_wr, buf, total_bytes_done, count); printk(TPQIC_NAME ": status_bytes_wr %x, buf %p, total_bytes_done %x, count %x\n", status_bytes_wr, buf, total_bytes_done, count);
return -EINVAL; return -EINVAL;
} /* tape_qic02_write */ } /* tape_qic02_write */
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
* Alan Cox : Honours the old SL_COMPRESSED flag * Alan Cox : Honours the old SL_COMPRESSED flag
* Alan Cox : KISS AX.25 and AXUI IP support * Alan Cox : KISS AX.25 and AXUI IP support
* Michael Riepe : Automatic CSLIP recognition added * Michael Riepe : Automatic CSLIP recognition added
* Charles Hedrick : CSLIP header length problem fix.
*/ */
#include <asm/segment.h> #include <asm/segment.h>
...@@ -522,6 +523,8 @@ sl_xmit(struct sk_buff *skb, struct device *dev) ...@@ -522,6 +523,8 @@ sl_xmit(struct sk_buff *skb, struct device *dev)
{ {
struct tty_struct *tty; struct tty_struct *tty;
struct slip *sl; struct slip *sl;
int size;
/* Find the correct SLIP channel to use. */ /* Find the correct SLIP channel to use. */
sl = &sl_ctrl[dev->base_addr]; sl = &sl_ctrl[dev->base_addr];
...@@ -555,8 +558,19 @@ sl_xmit(struct sk_buff *skb, struct device *dev) ...@@ -555,8 +558,19 @@ sl_xmit(struct sk_buff *skb, struct device *dev)
} }
#endif #endif
sl_lock(sl); sl_lock(sl);
/* sl_hex_dump(skb->data,skb->len);*/
sl_encaps(sl, skb->data, skb->len); size=skb->len;
if(size<sizeof(struct iphdr))
{
printk("Runt IP frame fed to slip!\n");
}
else
{
size=((struct iphdr *)(skb->data))->tot_len;
size=ntohs(size);
/* sl_hex_dump(skb->data,skb->len);*/
sl_encaps(sl, skb->data, size);
}
if (skb->free) kfree_skb(skb, FREE_WRITE); if (skb->free) kfree_skb(skb, FREE_WRITE);
} }
return(0); return(0);
......
...@@ -675,7 +675,7 @@ static int aha1542_mbenable(int base) ...@@ -675,7 +675,7 @@ static int aha1542_mbenable(int base)
WAIT(INTRFLAGS(base),INTRMASK,HACC,0); WAIT(INTRFLAGS(base),INTRMASK,HACC,0);
aha1542_intr_reset(base); aha1542_intr_reset(base);
if (mbenable_result[0] & 0x08) { if ((mbenable_result[0] & 0x08) || mbenable_result[1]) {
mbenable_cmd[0]=CMD_MBENABLE; mbenable_cmd[0]=CMD_MBENABLE;
mbenable_cmd[1]=0; mbenable_cmd[1]=0;
mbenable_cmd[2]=mbenable_result[1]; mbenable_cmd[2]=mbenable_result[1];
......
...@@ -18,7 +18,7 @@ static const char unknown[] = "UNKNOWN"; ...@@ -18,7 +18,7 @@ static const char unknown[] = "UNKNOWN";
#ifdef CONSTANTS #ifdef CONSTANTS
#undef CONSTANTS #undef CONSTANTS
#endif #endif
#define CONSTANTS (CONST_CMD | CONST_STATUS | CONST_SENSE | CONST_XSENSE) #define CONSTANTS (CONST_COMMAND | CONST_STATUS | CONST_SENSE | CONST_XSENSE)
#endif #endif
#if (CONSTANTS & CONST_COMMAND) #if (CONSTANTS & CONST_COMMAND)
......
...@@ -484,17 +484,15 @@ struct buffer_head * getblk(dev_t dev, int block, int size) ...@@ -484,17 +484,15 @@ struct buffer_head * getblk(dev_t dev, int block, int size)
#endif #endif
} }
if (!bh && nr_free_pages > 5) {
if (grow_buffers(GFP_BUFFER, size))
goto repeat;
}
/* and repeat until we find something good */
if (!bh) { if (!bh) {
if (nr_free_pages > 5)
if (grow_buffers(GFP_BUFFER, size))
goto repeat;
if (!grow_buffers(GFP_ATOMIC, size)) if (!grow_buffers(GFP_ATOMIC, size))
sleep_on(&buffer_wait); sleep_on(&buffer_wait);
goto repeat; goto repeat;
} }
wait_on_buffer(bh); wait_on_buffer(bh);
if (bh->b_count || bh->b_size != size) if (bh->b_count || bh->b_size != size)
goto repeat; goto repeat;
...@@ -920,7 +918,7 @@ static int try_to_free(struct buffer_head * bh, struct buffer_head ** bhp) ...@@ -920,7 +918,7 @@ static int try_to_free(struct buffer_head * bh, struct buffer_head ** bhp)
do { do {
if (!tmp) if (!tmp)
return 0; return 0;
if (tmp->b_count || tmp->b_dirt || tmp->b_lock) if (tmp->b_count || tmp->b_dirt || tmp->b_lock || tmp->b_wait)
return 0; return 0;
tmp = tmp->b_this_page; tmp = tmp->b_this_page;
} while (tmp != bh); } while (tmp != bh);
......
...@@ -134,7 +134,11 @@ int core_dump(long signr, struct pt_regs * regs) ...@@ -134,7 +134,11 @@ int core_dump(long signr, struct pt_regs * regs)
fs = get_fs(); fs = get_fs();
set_fs(KERNEL_DS); set_fs(KERNEL_DS);
memcpy(corefile,"core.",5); memcpy(corefile,"core.",5);
#if 0
memcpy(corefile+5,current->comm,sizeof(current->comm)); memcpy(corefile+5,current->comm,sizeof(current->comm));
#else
corefile[4] = '\0';
#endif
if (open_namei(corefile,O_CREAT | 2 | O_TRUNC,0600,&inode,NULL)) { if (open_namei(corefile,O_CREAT | 2 | O_TRUNC,0600,&inode,NULL)) {
inode = NULL; inode = NULL;
goto end_coredump; goto end_coredump;
......
...@@ -42,9 +42,9 @@ static int read_core(struct inode * inode, struct file * file,char * buf, int co ...@@ -42,9 +42,9 @@ static int read_core(struct inode * inode, struct file * file,char * buf, int co
if (count < 0) if (count < 0)
return -EINVAL; return -EINVAL;
if (p >= high_memory) if (p >= high_memory + PAGE_SIZE)
return 0; return 0;
if (count > high_memory - p) if (count > high_memory + PAGE_SIZE - p)
count = high_memory - p; count = high_memory - p;
read = 0; read = 0;
......
...@@ -320,12 +320,13 @@ extern int getname(const char * filename, char **result); ...@@ -320,12 +320,13 @@ extern int getname(const char * filename, char **result);
extern void putname(char * name); extern void putname(char * name);
extern int register_blkdev(unsigned int, const char *, struct file_operations *); extern int register_blkdev(unsigned int, const char *, struct file_operations *);
extern int unregister_blkdev(unsigned int major, const char * name);
extern int blkdev_open(struct inode * inode, struct file * filp); extern int blkdev_open(struct inode * inode, struct file * filp);
extern struct file_operations def_blk_fops; extern struct file_operations def_blk_fops;
extern struct inode_operations blkdev_inode_operations; extern struct inode_operations blkdev_inode_operations;
extern int register_chrdev(unsigned int, const char *, struct file_operations *); extern int register_chrdev(unsigned int, const char *, struct file_operations *);
extern int unregister_chrdev( unsigned int major, const char * name); extern int unregister_chrdev(unsigned int major, const char * name);
extern int chrdev_open(struct inode * inode, struct file * filp); extern int chrdev_open(struct inode * inode, struct file * filp);
extern struct file_operations def_chr_fops; extern struct file_operations def_chr_fops;
extern struct inode_operations chrdev_inode_operations; extern struct inode_operations chrdev_inode_operations;
......
...@@ -9,6 +9,11 @@ struct fpu_reg { ...@@ -9,6 +9,11 @@ struct fpu_reg {
unsigned sigh; unsigned sigh;
}; };
/* This structure matches the layout of the data saved to the stack
following a device-not-present interrupt, part of it saved
automatically by the 80386/80486.
*/
struct info { struct info {
long ___orig_eip; long ___orig_eip;
long ___ret_from_system_call; long ___ret_from_system_call;
...@@ -29,30 +34,10 @@ struct info { ...@@ -29,30 +34,10 @@ struct info {
long ___eflags; long ___eflags;
long ___esp; long ___esp;
long ___ss; long ___ss;
long ___vm86_es; /* This and the following only in vm86 mode */
long ___vm86_ds;
long ___vm86_fs;
long ___vm86_gs;
}; };
#if 0
#define EAX (info->___eax)
#define EBX (info->___ebx)
#define ECX (info->___ecx)
#define EDX (info->___edx)
#define ESI (info->___esi)
#define EDI (info->___edi)
#define EBP (info->___ebp)
#define ESP (info->___esp)
#define EIP (info->___eip)
#define ORIG_EIP (info->___orig_eip)
#define EFLAGS (info->___eflags)
#define DS (*(unsigned short *) &(info->___ds))
#define ES (*(unsigned short *) &(info->___es))
#define FS (*(unsigned short *) &(info->___fs))
#define CS (*(unsigned short *) &(info->___cs))
#define SS (*(unsigned short *) &(info->___ss))
#endif
void __math_abort(struct info *, unsigned int);
#define math_abort(x,y) \
(((volatile void (*)(struct info *,unsigned int)) __math_abort)((x),(y)))
#endif #endif
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
int __verify_write(unsigned long addr, unsigned long count); int __verify_write(unsigned long addr, unsigned long count);
extern inline int verify_area(int type, void * addr, unsigned long size) extern inline int verify_area(int type, const void * addr, unsigned long size)
{ {
if (TASK_SIZE <= (unsigned long) addr) if (TASK_SIZE <= (unsigned long) addr)
return -EFAULT; return -EFAULT;
......
...@@ -9,6 +9,8 @@ ...@@ -9,6 +9,8 @@
_register_chrdev _register_chrdev
_unregister_chrdev _unregister_chrdev
_register_blkdev
_unregister_blkdev
_wake_up_interruptible _wake_up_interruptible
_wp_works_ok _wp_works_ok
......
...@@ -235,11 +235,13 @@ if (!(context.x & 0xfffc) || (context.x & 3) != 3) goto badframe; COPY(x); ...@@ -235,11 +235,13 @@ if (!(context.x & 0xfffc) || (context.x & 3) != 3) goto badframe; COPY(x);
COPY_SEG(gs); COPY_SEG(gs);
COPY_SEG_STRICT(ss); COPY_SEG_STRICT(ss);
COPY_SEG_STRICT(cs); COPY_SEG_STRICT(cs);
COPY(eip); COPY(eflags); COPY(eip);
COPY(ecx); COPY(edx); COPY(ecx); COPY(edx);
COPY(ebx); COPY(ebx);
COPY(esp); COPY(ebp); COPY(esp); COPY(ebp);
COPY(edi); COPY(esi); COPY(edi); COPY(esi);
regs->eflags &= ~0xCD5;
regs->eflags |= context.eflags & 0xCD5;
regs->orig_eax = -1; /* disable syscall checks */ regs->orig_eax = -1; /* disable syscall checks */
return context.eax; return context.eax;
badframe: badframe:
......
...@@ -59,6 +59,7 @@ ...@@ -59,6 +59,7 @@
* Alan Cox : Added a couple of small NET2E timer fixes * Alan Cox : Added a couple of small NET2E timer fixes
* Charles Hedrick : TCP fixes * Charles Hedrick : TCP fixes
* Toomas Tamm : TCP window fixes * Toomas Tamm : TCP window fixes
* Alan Cox : Small URG fix to rlogin ^C ack fight
* *
* *
* To Fix: * To Fix:
...@@ -1314,6 +1315,8 @@ tcp_read_urg(struct sock * sk, int nonblock, ...@@ -1314,6 +1315,8 @@ tcp_read_urg(struct sock * sk, int nonblock,
do { do {
int amt; int amt;
if (before(sk->copied_seq+1, skb->h.th->seq))
break;
if (skb->h.th->urg && !skb->urg_used) { if (skb->h.th->urg && !skb->urg_used) {
if (skb->h.th->urg_ptr == 0) { if (skb->h.th->urg_ptr == 0) {
skb->h.th->urg_ptr = ntohs(skb->len); skb->h.th->urg_ptr = ntohs(skb->len);
...@@ -1329,6 +1332,7 @@ tcp_read_urg(struct sock * sk, int nonblock, ...@@ -1329,6 +1332,7 @@ tcp_read_urg(struct sock * sk, int nonblock,
skb->urg_used = 1; skb->urg_used = 1;
sk->urg--; sk->urg--;
} }
cleanup_rbuf(sk);
release_sock(sk); release_sock(sk);
copied += amt; copied += amt;
return(copied); return(copied);
...@@ -1337,6 +1341,7 @@ tcp_read_urg(struct sock * sk, int nonblock, ...@@ -1337,6 +1341,7 @@ tcp_read_urg(struct sock * sk, int nonblock,
} while(skb != sk->rqueue); } while(skb != sk->rqueue);
} }
/*sk->urg = 0;*/ /*sk->urg = 0;*/
cleanup_rbuf(sk);
release_sock(sk); release_sock(sk);
return(0); return(0);
} }
......
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