Commit ccec108f authored by Linus Torvalds's avatar Linus Torvalds

Import 1.1.9

parent eaca2b6e
...@@ -614,9 +614,10 @@ S: New York, New York 10025 ...@@ -614,9 +614,10 @@ S: New York, New York 10025
S: USA S: USA
N: Eric Youngdale N: Eric Youngdale
E: ericy@cais.com
E: eric@tantalus.nrl.navy.mil E: eric@tantalus.nrl.navy.mil
D: General kernel hacker D: General kernel hacker
D: SCSI iso9660 and ELF D: SCSI, iso9660, ELF, ibcs2, clustering in buffer cache, generalized mmap.
S: 17 Canterbury Square #101 S: 17 Canterbury Square #101
S: Alexandria, Virginia 22304 S: Alexandria, Virginia 22304
S: USA S: USA
......
VERSION = 1 VERSION = 1
PATCHLEVEL = 1 PATCHLEVEL = 1
SUBLEVEL = 8 SUBLEVEL = 9
all: Version zImage all: Version zImage
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
* and for "no-sound" interfaces like Lasermate and the * and for "no-sound" interfaces like Lasermate and the
* Panasonic CI-101P. * Panasonic CI-101P.
* *
* NOTE: This is release 1.4. * NOTE: This is release 1.5.
* It works with my SbPro & drive CR-521 V2.11 from 2/92 * It works with my SbPro & drive CR-521 V2.11 from 2/92
* and with the new CR-562-B V0.75 on a "naked" Panasonic * and with the new CR-562-B V0.75 on a "naked" Panasonic
* CI-101P interface. And vice versa. * CI-101P interface. And vice versa.
...@@ -72,6 +72,10 @@ ...@@ -72,6 +72,10 @@
* Added some debugging printout for the UPC/EAN code - but my drives * Added some debugging printout for the UPC/EAN code - but my drives
* return only zeroes. Is there no UPC/EAN code written? * return only zeroes. Is there no UPC/EAN code written?
* *
* 1.5 Laborate with UPC/EAN code (not better yet).
* Adapt to kernel 1.1.8 change (have to explicitely include
* <linux/string.h> now).
*
* special thanks to Kai Makisara (kai.makisara@vtt.fi) for his fine * special thanks to Kai Makisara (kai.makisara@vtt.fi) for his fine
* elaborated speed-up experiments (and the fabulous results!), for * elaborated speed-up experiments (and the fabulous results!), for
* the "push" towards load-free wait loops, and for the extensive mail * the "push" towards load-free wait loops, and for the extensive mail
...@@ -113,6 +117,7 @@ ...@@ -113,6 +117,7 @@
#include <linux/cdrom.h> #include <linux/cdrom.h>
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/sbpcd.h> #include <linux/sbpcd.h>
#include <linux/string.h>
#if SBPCD_USE_IRQ #if SBPCD_USE_IRQ
#include <linux/signal.h> #include <linux/signal.h>
...@@ -129,7 +134,7 @@ ...@@ -129,7 +134,7 @@
#define MAJOR_NR MATSUSHITA_CDROM_MAJOR #define MAJOR_NR MATSUSHITA_CDROM_MAJOR
#include "blk.h" #include "blk.h"
#define VERSION "1.4 Eberhard Moenkeberg <emoenke@gwdg.de>" #define VERSION "1.5 Eberhard Moenkeberg <emoenke@gwdg.de>"
#define SBPCD_DEBUG #define SBPCD_DEBUG
...@@ -149,6 +154,8 @@ ...@@ -149,6 +154,8 @@
#undef XA_TEST1 #undef XA_TEST1
#define XA_TEST2 #define XA_TEST2
#define TEST_UPC 0
/*==========================================================================*/ /*==========================================================================*/
/*==========================================================================*/ /*==========================================================================*/
...@@ -238,6 +245,7 @@ static int sbp_data(void); ...@@ -238,6 +245,7 @@ static int sbp_data(void);
* (1<<DBG_UPC) show UPC info * (1<<DBG_UPC) show UPC info
* (1<<DBG_XA) XA mode debugging * (1<<DBG_XA) XA mode debugging
* (1<<DBG_LCK) door (un)lock info * (1<<DBG_LCK) door (un)lock info
* (1<<DBG_SQ) dump SubQ frame
* (1<<DBG_000) unnecessary information * (1<<DBG_000) unnecessary information
*/ */
#if 1 #if 1
...@@ -249,6 +257,7 @@ static int sbpcd_debug = (1<<DBG_INF) | ...@@ -249,6 +257,7 @@ static int sbpcd_debug = (1<<DBG_INF) |
(1<<DBG_IOC) | (1<<DBG_IOC) |
(1<<DBG_XA) | (1<<DBG_XA) |
(1<<DBG_LCK) | (1<<DBG_LCK) |
(1<<DBG_SQ) |
(1<<DBG_IOX); (1<<DBG_IOX);
#endif #endif
static int sbpcd_ioaddr = CDROM_PORT; /* default I/O base address */ static int sbpcd_ioaddr = CDROM_PORT; /* default I/O base address */
...@@ -287,7 +296,8 @@ static u_int flags_cmd_out; ...@@ -287,7 +296,8 @@ static u_int flags_cmd_out;
static u_char cmd_type=0; static u_char cmd_type=0;
static u_char drvcmd[7]; static u_char drvcmd[7];
static u_char infobuf[20]; static u_char infobuf[20];
static u_char scratch_buf[CD_XA_TAIL]; static u_char xa_head_buf[CD_XA_HEAD];
static u_char xa_tail_buf[CD_XA_TAIL];
static u_char timed_out=0; static u_char timed_out=0;
static u_int datarate= 1000000; static u_int datarate= 1000000;
...@@ -354,7 +364,6 @@ static struct { ...@@ -354,7 +364,6 @@ static struct {
u_char vol_ctrl3; u_char vol_ctrl3;
#endif 000 #endif 000
u_char SubQ_audio;
u_char SubQ_ctl_adr; u_char SubQ_ctl_adr;
u_char SubQ_trk; u_char SubQ_trk;
u_char SubQ_pnt_idx; u_char SubQ_pnt_idx;
...@@ -1153,6 +1162,8 @@ static int xx_ReadSubQ(void) ...@@ -1153,6 +1162,8 @@ static int xx_ReadSubQ(void)
int i,j; int i,j;
DS[d].diskstate_flags &= ~subq_bit; DS[d].diskstate_flags &= ~subq_bit;
for (j=255;j>0;j--)
{
clr_cmdbuf(); clr_cmdbuf();
if (new_drive) if (new_drive)
{ {
...@@ -1167,19 +1178,22 @@ static int xx_ReadSubQ(void) ...@@ -1167,19 +1178,22 @@ static int xx_ReadSubQ(void)
flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check; flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check;
response_count=13; response_count=13;
} }
for (j=0;j<255;j++)
{
i=cmd_out(); i=cmd_out();
if (i<0) return (i); if (i<0) return (i);
DPRINTF((DBG_SQ,"SBPCD: xx_ReadSubQ:"));
for (i=0;i<(new_drive?11:13);i++)
{
DPRINTF((DBG_SQ," %02X", infobuf[i]));
}
DPRINTF((DBG_SQ,"\n"));
if (infobuf[0]!=0) break; if (infobuf[0]!=0) break;
if (!st_spinning) if ((!st_spinning) || (j==1))
{ {
DS[d].SubQ_ctl_adr=DS[d].SubQ_trk=DS[d].SubQ_pnt_idx=DS[d].SubQ_whatisthis=0; DS[d].SubQ_ctl_adr=DS[d].SubQ_trk=DS[d].SubQ_pnt_idx=DS[d].SubQ_whatisthis=0;
DS[d].SubQ_run_tot=DS[d].SubQ_run_trk=0; DS[d].SubQ_run_tot=DS[d].SubQ_run_trk=0;
return (0); return (0);
} }
} }
DS[d].SubQ_audio=infobuf[0];
DS[d].SubQ_ctl_adr=swap_nibbles(infobuf[1]); DS[d].SubQ_ctl_adr=swap_nibbles(infobuf[1]);
DS[d].SubQ_trk=byt2bcd(infobuf[2]); DS[d].SubQ_trk=byt2bcd(infobuf[2]);
DS[d].SubQ_pnt_idx=byt2bcd(infobuf[3]); DS[d].SubQ_pnt_idx=byt2bcd(infobuf[3]);
...@@ -1479,18 +1493,35 @@ static int convert_UPC(u_char *p) ...@@ -1479,18 +1493,35 @@ static int convert_UPC(u_char *p)
static int xx_ReadUPC(void) static int xx_ReadUPC(void)
{ {
int i; int i;
#if TEST_UPC
int block, checksum;
#endif TEST_UPC
DS[d].diskstate_flags &= ~upc_bit; DS[d].diskstate_flags &= ~upc_bit;
#if TEST_UPC
for (block=CD_BLOCK_OFFSET+1;block<CD_BLOCK_OFFSET+200;block++)
{
#endif TEST_UPC
clr_cmdbuf(); clr_cmdbuf();
if (new_drive) if (new_drive)
{ {
drvcmd[0]=0x88; drvcmd[0]=0x88;
#if TEST_UPC
drvcmd[1]=(block>>16)&0xFF;
drvcmd[2]=(block>>8)&0xFF;
drvcmd[3]=block&0xFF;
#endif TEST_UPC
response_count=8; response_count=8;
flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check; flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
} }
else else
{ {
drvcmd[0]=0x08; drvcmd[0]=0x08;
#if TEST_UPC
drvcmd[2]=(block>>16)&0xFF;
drvcmd[3]=(block>>8)&0xFF;
drvcmd[4]=block&0xFF;
#endif TEST_UPC
response_count=0; response_count=0;
flags_cmd_out=f_putcmd|f_lopsta|f_getsta|f_ResponseStatus|f_obey_p_check|f_bit1; flags_cmd_out=f_putcmd|f_lopsta|f_getsta|f_ResponseStatus|f_obey_p_check|f_bit1;
} }
...@@ -1502,14 +1533,22 @@ static int xx_ReadUPC(void) ...@@ -1502,14 +1533,22 @@ static int xx_ReadUPC(void)
i=xx_ReadPacket(); i=xx_ReadPacket();
if (i<0) return (i); if (i<0) return (i);
} }
#if TEST_UPC
checksum=0;
#endif TEST_UPC
DPRINTF((DBG_UPC,"SBPCD: UPC info: ")); DPRINTF((DBG_UPC,"SBPCD: UPC info: "));
for (i=0;i<(new_drive?8:16);i++) for (i=0;i<(new_drive?8:16);i++)
{ {
#if TEST_UPC
checksum |= infobuf[i];
#endif TEST_UPC
DPRINTF((DBG_UPC,"%02X ", infobuf[i])); DPRINTF((DBG_UPC,"%02X ", infobuf[i]));
} }
DPRINTF((DBG_UPC,"\n")); DPRINTF((DBG_UPC,"\n"));
#if TEST_UPC
if ((checksum&0x7F)!=0) break;
}
#endif TEST_UPC
DS[d].UPC_ctl_adr=0; DS[d].UPC_ctl_adr=0;
if (new_drive) i=0; if (new_drive) i=0;
else i=2; else i=2;
...@@ -1559,6 +1598,31 @@ static int yy_CheckMultiSession(void) ...@@ -1559,6 +1598,31 @@ static int yy_CheckMultiSession(void)
return (0); return (0);
} }
/*==========================================================================*/ /*==========================================================================*/
#if FUTURE
static int yy_SubChanInfo(int frame, int count, u_char *buffer)
/* "frame" is a RED BOOK address */
{
int i;
if (!new_drive) return (-3);
#if 0
if (DS[d].audio_state!=audio_playing) return (-2);
#endif
clr_cmdbuf();
drvcmd[0]=0x11;
drvcmd[1]=(frame>>16)&0xFF;
drvcmd[2]=(frame>>8)&0xFF;
drvcmd[3]=frame&0xFF;
drvcmd[5]=(count>>8)&0xFF;
drvcmd[6]=count&0xFF;
flags_cmd_out=f_putcmd|f_respo2|f_ResponseStatus|f_obey_p_check;
cmd_type=READ_SC;
DS[d].frame_size=CD_FRAMESIZE_SUB;
i=cmd_out(); /* read directly into user's buffer */
return (i);
}
#endif FUTURE
/*==========================================================================*/
static void check_datarate(void) static void check_datarate(void)
{ {
#ifdef CDMKE #ifdef CDMKE
...@@ -2290,9 +2354,6 @@ static int sbpcd_ioctl(struct inode *inode,struct file *file, ...@@ -2290,9 +2354,6 @@ static int sbpcd_ioctl(struct inode *inode,struct file *file,
st=verify_area(VERIFY_WRITE, (void *) arg, sizeof(struct cdrom_subchnl)); st=verify_area(VERIFY_WRITE, (void *) arg, sizeof(struct cdrom_subchnl));
if (st) return (st); if (st) return (st);
memcpy_fromfs(&SC, (void *) arg, sizeof(struct cdrom_subchnl)); memcpy_fromfs(&SC, (void *) arg, sizeof(struct cdrom_subchnl));
#if 0
if (DS[d].SubQ_audio==0x80) DS[d].SubQ_audio=CDROM_AUDIO_NO_STATUS;
#endif
switch (DS[d].audio_state) switch (DS[d].audio_state)
{ {
case audio_playing: case audio_playing:
...@@ -2634,7 +2695,7 @@ static int sbp_data(void) ...@@ -2634,7 +2695,7 @@ static int sbp_data(void)
u_int data_waits = 0; u_int data_waits = 0;
u_int data_retrying = 0; u_int data_retrying = 0;
int error_flag; int error_flag;
int xa_count;
error_flag=0; error_flag=0;
for (frame=DS[d].sbp_current;frame<DS[d].sbp_read_frames&&!error_flag; frame++) for (frame=DS[d].sbp_current;frame<DS[d].sbp_read_frames&&!error_flag; frame++)
...@@ -2687,12 +2748,18 @@ static int sbp_data(void) ...@@ -2687,12 +2748,18 @@ static int sbp_data(void)
p = DS[d].sbp_buf + frame * CD_FRAMESIZE; p = DS[d].sbp_buf + frame * CD_FRAMESIZE;
if (sbpro_type) OUT(CDo_sel_d_i,0x01); if (sbpro_type) OUT(CDo_sel_d_i,0x01);
if (cmd_type==READ_M2) READ_DATA(CDi_data, scratch_buf, CD_XA_HEAD); if (cmd_type==READ_M2) READ_DATA(CDi_data, xa_head_buf, CD_XA_HEAD);
READ_DATA(CDi_data, p, CD_FRAMESIZE); READ_DATA(CDi_data, p, CD_FRAMESIZE);
if (cmd_type==READ_M2) READ_DATA(CDi_data, scratch_buf, CD_XA_TAIL); if (cmd_type==READ_M2) READ_DATA(CDi_data, xa_tail_buf, CD_XA_TAIL);
if (sbpro_type) OUT(CDo_sel_d_i,0x00); if (sbpro_type) OUT(CDo_sel_d_i,0x00);
DS[d].sbp_current++; DS[d].sbp_current++;
if (cmd_type==READ_M2)
{
DPRINTF((DBG_XA,"SBPCD: xa_head:"));
for (xa_count=0;xa_count<CD_XA_HEAD;xa_count++)
DPRINTF((DBG_XA," %02X", xa_head_buf[xa_count]));
DPRINTF((DBG_XA,"\n"));
}
data_tries++; data_tries++;
data_retrying = 0; data_retrying = 0;
if (data_tries >= 1000) if (data_tries >= 1000)
......
...@@ -73,7 +73,7 @@ ...@@ -73,7 +73,7 @@
int last_retran; int last_retran;
static unsigned char *encode(unsigned char *cp,int n); static unsigned char *encode(unsigned char *cp, unsigned short n);
static long decode(unsigned char **cpp); static long decode(unsigned char **cpp);
static unsigned char * put16(unsigned char *cp, unsigned short x); static unsigned char * put16(unsigned char *cp, unsigned short x);
static unsigned short pull16(unsigned char **cpp); static unsigned short pull16(unsigned char **cpp);
...@@ -160,7 +160,7 @@ slhc_free(struct slcompress *comp) ...@@ -160,7 +160,7 @@ slhc_free(struct slcompress *comp)
/* Put a short in host order into a char array in network order */ /* Put a short in host order into a char array in network order */
static unsigned char * static inline unsigned char *
put16(unsigned char *cp, unsigned short x) put16(unsigned char *cp, unsigned short x)
{ {
*cp++ = x >> 8; *cp++ = x >> 8;
...@@ -172,7 +172,7 @@ put16(unsigned char *cp, unsigned short x) ...@@ -172,7 +172,7 @@ put16(unsigned char *cp, unsigned short x)
/* Encode a number */ /* Encode a number */
unsigned char * unsigned char *
encode(unsigned char *cp, int n) encode(unsigned char *cp, unsigned short n)
{ {
if(n >= 256 || n == 0){ if(n >= 256 || n == 0){
*cp++ = 0; *cp++ = 0;
......
...@@ -16,10 +16,7 @@ ...@@ -16,10 +16,7 @@
* invalidate changed floppy-disk-caches. * invalidate changed floppy-disk-caches.
*/ */
#include <stdarg.h>
#include <linux/config.h> #include <linux/config.h>
#include <linux/errno.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/major.h> #include <linux/major.h>
...@@ -195,7 +192,7 @@ static int sync_buffers(dev_t dev, int wait) ...@@ -195,7 +192,7 @@ static int sync_buffers(dev_t dev, int wait)
if (wait && bh->b_req && !bh->b_lock && if (wait && bh->b_req && !bh->b_lock &&
!bh->b_dirt && !bh->b_uptodate) { !bh->b_dirt && !bh->b_uptodate) {
err = 1; err = 1;
printk("Weird - unlocked, clean and not uptodate buffer on list %d\n", nlist); printk("Weird - unlocked, clean and not uptodate buffer on list %d %x %lu\n", nlist, bh->b_dev, bh->b_blocknr);
continue; continue;
} }
/* Don't write clean buffers. Don't write ANY buffers /* Don't write clean buffers. Don't write ANY buffers
...@@ -1867,7 +1864,7 @@ asmlinkage int sys_bdflush(int func, int data) ...@@ -1867,7 +1864,7 @@ asmlinkage int sys_bdflush(int func, int data)
repeat: repeat:
bh = lru_list[nlist]; bh = lru_list[nlist];
if(bh) if(bh)
for (i = nr_buffers_type[nlist]; --i > 0 && ndirty < bdf_prm.b_un.ndirty; for (i = nr_buffers_type[nlist]; i-- > 0 && ndirty < bdf_prm.b_un.ndirty;
bh = next) { bh = next) {
/* We may have stalled while waiting for I/O to complete. */ /* We may have stalled while waiting for I/O to complete. */
if(bh->b_list != nlist) goto repeat; if(bh->b_list != nlist) goto repeat;
...@@ -1909,8 +1906,10 @@ asmlinkage int sys_bdflush(int func, int data) ...@@ -1909,8 +1906,10 @@ asmlinkage int sys_bdflush(int func, int data)
if(nr_buffers_type[BUF_DIRTY] < (nr_buffers - nr_buffers_type[BUF_SHARED]) * if(nr_buffers_type[BUF_DIRTY] < (nr_buffers - nr_buffers_type[BUF_SHARED]) *
bdf_prm.b_un.nfract/100) { bdf_prm.b_un.nfract/100) {
if (current->signal & (1 << (SIGKILL-1))) if (current->signal & (1 << (SIGKILL-1))) {
bdflush_running--;
return 0; return 0;
}
current->signal = 0; current->signal = 0;
interruptible_sleep_on(&bdflush_wait); interruptible_sleep_on(&bdflush_wait);
} }
......
...@@ -477,6 +477,15 @@ void isofs_read_inode(struct inode * inode) ...@@ -477,6 +477,15 @@ void isofs_read_inode(struct inode * inode)
brelse(bh); brelse(bh);
inode->i_op = NULL; inode->i_op = NULL;
/* A volume number of 0 is nonsense. Disable checking if we see
this */
if (inode->i_sb->u.isofs_sb.s_cruft == 'n' &&
isonum_723 (raw_inode->volume_sequence_number) == 0) {
printk("Warning: defective cdrom. Enabling \"cruft\" mount option.\n");
inode->i_sb->u.isofs_sb.s_cruft = 'y';
}
if (inode->i_sb->u.isofs_sb.s_cruft != 'y' && if (inode->i_sb->u.isofs_sb.s_cruft != 'y' &&
isonum_723 (raw_inode->volume_sequence_number) != 1) { isonum_723 (raw_inode->volume_sequence_number) != 1) {
printk("Multi volume CD somehow got mounted.\n"); printk("Multi volume CD somehow got mounted.\n");
......
...@@ -74,7 +74,8 @@ ...@@ -74,7 +74,8 @@
#define DBG_UPC 21 /* show UPC information */ #define DBG_UPC 21 /* show UPC information */
#define DBG_XA 22 /* XA mode debugging */ #define DBG_XA 22 /* XA mode debugging */
#define DBG_LCK 23 /* door (un)lock info */ #define DBG_LCK 23 /* door (un)lock info */
#define DBG_000 24 /* unnecessary information */ #define DBG_SQ 24 /* dump SubQ frame */
#define DBG_000 25 /* unnecessary information */
/*==========================================================================*/ /*==========================================================================*/
/*==========================================================================*/ /*==========================================================================*/
...@@ -215,6 +216,7 @@ ...@@ -215,6 +216,7 @@
#define CD_FRAMESIZE 2048 /* bytes per frame, data mode */ #define CD_FRAMESIZE 2048 /* bytes per frame, data mode */
#define CD_FRAMESIZE_XA 2340 /* bytes per frame, "xa" mode */ #define CD_FRAMESIZE_XA 2340 /* bytes per frame, "xa" mode */
#define CD_FRAMESIZE_RAW 2352 /* bytes per frame, "raw" mode */ #define CD_FRAMESIZE_RAW 2352 /* bytes per frame, "raw" mode */
#define CD_FRAMESIZE_SUB 96 /* subchannel data size */
#define CD_BLOCK_OFFSET 150 /* offset of first logical frame */ #define CD_BLOCK_OFFSET 150 /* offset of first logical frame */
#define CD_XA_HEAD 12 /* header size of XA frame */ #define CD_XA_HEAD 12 /* header size of XA frame */
#define CD_XA_TAIL 280 /* tail size of XA frame */ #define CD_XA_TAIL 280 /* tail size of XA frame */
......
...@@ -219,8 +219,10 @@ struct task_struct { ...@@ -219,8 +219,10 @@ struct task_struct {
unsigned short used_math; unsigned short used_math;
unsigned short rss; /* number of resident pages */ unsigned short rss; /* number of resident pages */
char comm[16]; char comm[16];
/* virtual 86 mode stuff */
struct vm86_struct * vm86_info; struct vm86_struct * vm86_info;
unsigned long screen_bitmap; unsigned long screen_bitmap;
unsigned long v86flags, v86mask, v86mode;
/* file system info */ /* file system info */
int link_count; int link_count;
int tty; /* -1 if no tty, so it must be signed */ int tty; /* -1 if no tty, so it must be signed */
...@@ -286,7 +288,7 @@ struct task_struct { ...@@ -286,7 +288,7 @@ struct task_struct {
/* math */ 0, \ /* math */ 0, \
/* rss */ 2, \ /* rss */ 2, \
/* comm */ "swapper", \ /* comm */ "swapper", \
/* vm86_info */ NULL, 0, \ /* vm86_info */ NULL, 0, 0, 0, 0, \
/* fs info */ 0,-1,0022,NULL,NULL,NULL,NULL, \ /* fs info */ 0,-1,0022,NULL,NULL,NULL,NULL, \
/* ipc */ NULL, NULL, \ /* ipc */ NULL, NULL, \
/* filp */ {NULL,}, \ /* filp */ {NULL,}, \
......
#ifndef _LINUX_VM86_H #ifndef _LINUX_VM86_H
#define _LINUX_VM86_H #define _LINUX_VM86_H
/*
* I'm guessing at the VIF/VIP flag usage, but hope that this is how
* the Pentium uses them. Linux will return from vm86 mode when both
* VIF and VIP is set.
*
* On a Pentium, we could probably optimize the virtual flags directly
* in the eflags register instead of doing it "by hand" in vflags...
*
* Linus
*/
#define TF_MASK 0x00000100 #define TF_MASK 0x00000100
#define IF_MASK 0x00000200 #define IF_MASK 0x00000200
#define IOPL_MASK 0x00003000 #define IOPL_MASK 0x00003000
#define NT_MASK 0x00004000 #define NT_MASK 0x00004000
#define VM_MASK 0x00020000 #define VM_MASK 0x00020000
#define AC_MASK 0x00040000 #define AC_MASK 0x00040000
#define VIF_MASK 0x00080000 /* virtual interrupt flag */
#define VIP_MASK 0x00100000 /* virtual interrupt pending */
#define ID_MASK 0x00200000
#define BIOSSEG 0x0f000 #define BIOSSEG 0x0f000
#define CPU_086 0
#define CPU_186 1
#define CPU_286 2 #define CPU_286 2
#define CPU_386 3 #define CPU_386 3
#define CPU_486 4 #define CPU_486 4
#define CPU_586 5
/*
* Return values for the 'vm86()' system call
*/
#define VM86_TYPE(retval) ((retval) & 0xff)
#define VM86_ARG(retval) ((retval) >> 8)
#define VM86_SIGNAL 0 /* return due to signal */
#define VM86_UNKNOWN 1 /* unhandled GP fault - IO-instruction or similar */
#define VM86_INTx 2 /* int3/int x instruction (ARG = x) */
#define VM86_STI 3 /* sti/popfl instruction enabled virtual interrupts */
/* /*
* This is the stack-layout when we have done a "SAVE_ALL" from vm86 * This is the stack-layout when we have done a "SAVE_ALL" from vm86
...@@ -53,26 +81,36 @@ struct vm86_regs { ...@@ -53,26 +81,36 @@ struct vm86_regs {
unsigned short gs, __gsh; unsigned short gs, __gsh;
}; };
struct revectored_struct {
unsigned long __map[8]; /* 256 bits */
};
struct vm86_struct { struct vm86_struct {
struct vm86_regs regs; struct vm86_regs regs;
unsigned long flags; unsigned long flags;
unsigned long screen_bitmap; unsigned long screen_bitmap;
unsigned long v_eflags;
unsigned long cpu_type; unsigned long cpu_type;
unsigned long return_if_iflag; struct revectored_struct int_revectored;
unsigned char int_revectored[0x100]; struct revectored_struct int21_revectored;
unsigned char int21_revectored[0x100];
}; };
/* /*
* flags masks * flags masks
*/ */
#define VM86_SCREEN_BITMAP 1 #define VM86_SCREEN_BITMAP 0x0001
#ifdef __KERNEL__ #ifdef __KERNEL__
void handle_vm86_fault(struct vm86_regs *, long); void handle_vm86_fault(struct vm86_regs *, long);
extern inline int is_revectored(int nr, struct revectored_struct * bitmap)
{
__asm__ __volatile__("btl %2,%%fs:%1\n\tsbbl %0,%0"
:"=r" (nr)
:"m" (*bitmap),"r" (nr));
return nr;
}
#endif #endif
#endif #endif
This diff is collapsed.
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