cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

pg.c (17088B)


      1/* 
      2	pg.c    (c) 1998  Grant R. Guenther <grant@torque.net>
      3			  Under the terms of the GNU General Public License.
      4
      5	The pg driver provides a simple character device interface for
      6	sending ATAPI commands to a device.  With the exception of the
      7	ATAPI reset operation, all operations are performed by a pair
      8	of read and write operations to the appropriate /dev/pgN device.
      9	A write operation delivers a command and any outbound data in
     10	a single buffer.  Normally, the write will succeed unless the
     11	device is offline or malfunctioning, or there is already another
     12	command pending.  If the write succeeds, it should be followed
     13	immediately by a read operation, to obtain any returned data and
     14	status information.  A read will fail if there is no operation
     15	in progress.
     16
     17	As a special case, the device can be reset with a write operation,
     18	and in this case, no following read is expected, or permitted.
     19
     20	There are no ioctl() operations.  Any single operation
     21	may transfer at most PG_MAX_DATA bytes.  Note that the driver must
     22	copy the data through an internal buffer.  In keeping with all
     23	current ATAPI devices, command packets are assumed to be exactly
     24	12 bytes in length.
     25
     26	To permit future changes to this interface, the headers in the
     27	read and write buffers contain a single character "magic" flag.
     28	Currently this flag must be the character "P".
     29
     30	By default, the driver will autoprobe for a single parallel
     31	port ATAPI device, but if their individual parameters are
     32	specified, the driver can handle up to 4 devices.
     33
     34	To use this device, you must have the following device 
     35	special files defined:
     36
     37		/dev/pg0 c 97 0
     38		/dev/pg1 c 97 1
     39		/dev/pg2 c 97 2
     40		/dev/pg3 c 97 3
     41
     42	(You'll need to change the 97 to something else if you use
     43	the 'major' parameter to install the driver on a different
     44	major number.)
     45
     46	The behaviour of the pg driver can be altered by setting
     47	some parameters from the insmod command line.  The following
     48	parameters are adjustable:
     49
     50	    drive0      These four arguments can be arrays of       
     51	    drive1      1-6 integers as follows:
     52	    drive2
     53	    drive3      <prt>,<pro>,<uni>,<mod>,<slv>,<dly>
     54
     55			Where,
     56
     57		<prt>   is the base of the parallel port address for
     58			the corresponding drive.  (required)
     59
     60		<pro>   is the protocol number for the adapter that
     61			supports this drive.  These numbers are
     62			logged by 'paride' when the protocol modules
     63			are initialised.  (0 if not given)
     64
     65		<uni>   for those adapters that support chained
     66			devices, this is the unit selector for the
     67			chain of devices on the given port.  It should
     68			be zero for devices that don't support chaining.
     69			(0 if not given)
     70
     71		<mod>   this can be -1 to choose the best mode, or one
     72			of the mode numbers supported by the adapter.
     73			(-1 if not given)
     74
     75		<slv>   ATAPI devices can be jumpered to master or slave.
     76			Set this to 0 to choose the master drive, 1 to
     77			choose the slave, -1 (the default) to choose the
     78			first drive found.
     79
     80		<dly>   some parallel ports require the driver to 
     81			go more slowly.  -1 sets a default value that
     82			should work with the chosen protocol.  Otherwise,
     83			set this to a small integer, the larger it is
     84			the slower the port i/o.  In some cases, setting
     85			this to zero will speed up the device. (default -1)
     86
     87	    major	You may use this parameter to override the
     88			default major number (97) that this driver
     89			will use.  Be sure to change the device
     90			name as well.
     91
     92	    name	This parameter is a character string that
     93			contains the name the kernel will use for this
     94			device (in /proc output, for instance).
     95			(default "pg").
     96
     97	    verbose     This parameter controls the amount of logging
     98			that is done by the driver.  Set it to 0 for 
     99			quiet operation, to 1 to enable progress
    100			messages while the driver probes for devices,
    101			or to 2 for full debug logging.  (default 0)
    102
    103	If this driver is built into the kernel, you can use 
    104	the following command line parameters, with the same values
    105	as the corresponding module parameters listed above:
    106
    107	    pg.drive0
    108	    pg.drive1
    109	    pg.drive2
    110	    pg.drive3
    111
    112	In addition, you can use the parameter pg.disable to disable
    113	the driver entirely.
    114
    115*/
    116
    117/* Changes:
    118
    119	1.01	GRG 1998.06.16	Bug fixes
    120	1.02    GRG 1998.09.24  Added jumbo support
    121
    122*/
    123
    124#define PG_VERSION      "1.02"
    125#define PG_MAJOR	97
    126#define PG_NAME		"pg"
    127#define PG_UNITS	4
    128
    129#ifndef PI_PG
    130#define PI_PG	4
    131#endif
    132
    133#include <linux/types.h>
    134/* Here are things one can override from the insmod command.
    135   Most are autoprobed by paride unless set here.  Verbose is 0
    136   by default.
    137
    138*/
    139
    140static int verbose;
    141static int major = PG_MAJOR;
    142static char *name = PG_NAME;
    143static int disable = 0;
    144
    145static int drive0[6] = { 0, 0, 0, -1, -1, -1 };
    146static int drive1[6] = { 0, 0, 0, -1, -1, -1 };
    147static int drive2[6] = { 0, 0, 0, -1, -1, -1 };
    148static int drive3[6] = { 0, 0, 0, -1, -1, -1 };
    149
    150static int (*drives[4])[6] = {&drive0, &drive1, &drive2, &drive3};
    151static int pg_drive_count;
    152
    153enum {D_PRT, D_PRO, D_UNI, D_MOD, D_SLV, D_DLY};
    154
    155/* end of parameters */
    156
    157#include <linux/module.h>
    158#include <linux/init.h>
    159#include <linux/fs.h>
    160#include <linux/delay.h>
    161#include <linux/slab.h>
    162#include <linux/mtio.h>
    163#include <linux/pg.h>
    164#include <linux/device.h>
    165#include <linux/sched.h>	/* current, TASK_* */
    166#include <linux/mutex.h>
    167#include <linux/jiffies.h>
    168
    169#include <linux/uaccess.h>
    170
    171module_param(verbose, int, 0644);
    172module_param(major, int, 0);
    173module_param(name, charp, 0);
    174module_param_array(drive0, int, NULL, 0);
    175module_param_array(drive1, int, NULL, 0);
    176module_param_array(drive2, int, NULL, 0);
    177module_param_array(drive3, int, NULL, 0);
    178
    179#include "paride.h"
    180
    181#define PG_SPIN_DEL     50	/* spin delay in micro-seconds  */
    182#define PG_SPIN         200
    183#define PG_TMO		HZ
    184#define PG_RESET_TMO	10*HZ
    185
    186#define STAT_ERR        0x01
    187#define STAT_INDEX      0x02
    188#define STAT_ECC        0x04
    189#define STAT_DRQ        0x08
    190#define STAT_SEEK       0x10
    191#define STAT_WRERR      0x20
    192#define STAT_READY      0x40
    193#define STAT_BUSY       0x80
    194
    195#define ATAPI_IDENTIFY		0x12
    196
    197static DEFINE_MUTEX(pg_mutex);
    198static int pg_open(struct inode *inode, struct file *file);
    199static int pg_release(struct inode *inode, struct file *file);
    200static ssize_t pg_read(struct file *filp, char __user *buf,
    201		       size_t count, loff_t * ppos);
    202static ssize_t pg_write(struct file *filp, const char __user *buf,
    203			size_t count, loff_t * ppos);
    204static int pg_detect(void);
    205
    206#define PG_NAMELEN      8
    207
    208struct pg {
    209	struct pi_adapter pia;	/* interface to paride layer */
    210	struct pi_adapter *pi;
    211	int busy;		/* write done, read expected */
    212	int start;		/* jiffies at command start */
    213	int dlen;		/* transfer size requested */
    214	unsigned long timeout;	/* timeout requested */
    215	int status;		/* last sense key */
    216	int drive;		/* drive */
    217	unsigned long access;	/* count of active opens ... */
    218	int present;		/* device present ? */
    219	char *bufptr;
    220	char name[PG_NAMELEN];	/* pg0, pg1, ... */
    221};
    222
    223static struct pg devices[PG_UNITS];
    224
    225static int pg_identify(struct pg *dev, int log);
    226
    227static char pg_scratch[512];	/* scratch block buffer */
    228
    229static struct class *pg_class;
    230static void *par_drv;		/* reference of parport driver */
    231
    232/* kernel glue structures */
    233
    234static const struct file_operations pg_fops = {
    235	.owner = THIS_MODULE,
    236	.read = pg_read,
    237	.write = pg_write,
    238	.open = pg_open,
    239	.release = pg_release,
    240	.llseek = noop_llseek,
    241};
    242
    243static void pg_init_units(void)
    244{
    245	int unit;
    246
    247	pg_drive_count = 0;
    248	for (unit = 0; unit < PG_UNITS; unit++) {
    249		int *parm = *drives[unit];
    250		struct pg *dev = &devices[unit];
    251		dev->pi = &dev->pia;
    252		clear_bit(0, &dev->access);
    253		dev->busy = 0;
    254		dev->present = 0;
    255		dev->bufptr = NULL;
    256		dev->drive = parm[D_SLV];
    257		snprintf(dev->name, PG_NAMELEN, "%s%c", name, 'a'+unit);
    258		if (parm[D_PRT])
    259			pg_drive_count++;
    260	}
    261}
    262
    263static inline int status_reg(struct pg *dev)
    264{
    265	return pi_read_regr(dev->pi, 1, 6);
    266}
    267
    268static inline int read_reg(struct pg *dev, int reg)
    269{
    270	return pi_read_regr(dev->pi, 0, reg);
    271}
    272
    273static inline void write_reg(struct pg *dev, int reg, int val)
    274{
    275	pi_write_regr(dev->pi, 0, reg, val);
    276}
    277
    278static inline u8 DRIVE(struct pg *dev)
    279{
    280	return 0xa0+0x10*dev->drive;
    281}
    282
    283static void pg_sleep(int cs)
    284{
    285	schedule_timeout_interruptible(cs);
    286}
    287
    288static int pg_wait(struct pg *dev, int go, int stop, unsigned long tmo, char *msg)
    289{
    290	int j, r, e, s, p, to;
    291
    292	dev->status = 0;
    293
    294	j = 0;
    295	while ((((r = status_reg(dev)) & go) || (stop && (!(r & stop))))
    296	       && time_before(jiffies, tmo)) {
    297		if (j++ < PG_SPIN)
    298			udelay(PG_SPIN_DEL);
    299		else
    300			pg_sleep(1);
    301	}
    302
    303	to = time_after_eq(jiffies, tmo);
    304
    305	if ((r & (STAT_ERR & stop)) || to) {
    306		s = read_reg(dev, 7);
    307		e = read_reg(dev, 1);
    308		p = read_reg(dev, 2);
    309		if (verbose > 1)
    310			printk("%s: %s: stat=0x%x err=0x%x phase=%d%s\n",
    311			       dev->name, msg, s, e, p, to ? " timeout" : "");
    312		if (to)
    313			e |= 0x100;
    314		dev->status = (e >> 4) & 0xff;
    315		return -1;
    316	}
    317	return 0;
    318}
    319
    320static int pg_command(struct pg *dev, char *cmd, int dlen, unsigned long tmo)
    321{
    322	int k;
    323
    324	pi_connect(dev->pi);
    325
    326	write_reg(dev, 6, DRIVE(dev));
    327
    328	if (pg_wait(dev, STAT_BUSY | STAT_DRQ, 0, tmo, "before command"))
    329		goto fail;
    330
    331	write_reg(dev, 4, dlen % 256);
    332	write_reg(dev, 5, dlen / 256);
    333	write_reg(dev, 7, 0xa0);	/* ATAPI packet command */
    334
    335	if (pg_wait(dev, STAT_BUSY, STAT_DRQ, tmo, "command DRQ"))
    336		goto fail;
    337
    338	if (read_reg(dev, 2) != 1) {
    339		printk("%s: command phase error\n", dev->name);
    340		goto fail;
    341	}
    342
    343	pi_write_block(dev->pi, cmd, 12);
    344
    345	if (verbose > 1) {
    346		printk("%s: Command sent, dlen=%d packet= ", dev->name, dlen);
    347		for (k = 0; k < 12; k++)
    348			printk("%02x ", cmd[k] & 0xff);
    349		printk("\n");
    350	}
    351	return 0;
    352fail:
    353	pi_disconnect(dev->pi);
    354	return -1;
    355}
    356
    357static int pg_completion(struct pg *dev, char *buf, unsigned long tmo)
    358{
    359	int r, d, n, p;
    360
    361	r = pg_wait(dev, STAT_BUSY, STAT_DRQ | STAT_READY | STAT_ERR,
    362		    tmo, "completion");
    363
    364	dev->dlen = 0;
    365
    366	while (read_reg(dev, 7) & STAT_DRQ) {
    367		d = (read_reg(dev, 4) + 256 * read_reg(dev, 5));
    368		n = ((d + 3) & 0xfffc);
    369		p = read_reg(dev, 2) & 3;
    370		if (p == 0)
    371			pi_write_block(dev->pi, buf, n);
    372		if (p == 2)
    373			pi_read_block(dev->pi, buf, n);
    374		if (verbose > 1)
    375			printk("%s: %s %d bytes\n", dev->name,
    376			       p ? "Read" : "Write", n);
    377		dev->dlen += (1 - p) * d;
    378		buf += d;
    379		r = pg_wait(dev, STAT_BUSY, STAT_DRQ | STAT_READY | STAT_ERR,
    380			    tmo, "completion");
    381	}
    382
    383	pi_disconnect(dev->pi);
    384
    385	return r;
    386}
    387
    388static int pg_reset(struct pg *dev)
    389{
    390	int i, k, err;
    391	int expect[5] = { 1, 1, 1, 0x14, 0xeb };
    392	int got[5];
    393
    394	pi_connect(dev->pi);
    395	write_reg(dev, 6, DRIVE(dev));
    396	write_reg(dev, 7, 8);
    397
    398	pg_sleep(20 * HZ / 1000);
    399
    400	k = 0;
    401	while ((k++ < PG_RESET_TMO) && (status_reg(dev) & STAT_BUSY))
    402		pg_sleep(1);
    403
    404	for (i = 0; i < 5; i++)
    405		got[i] = read_reg(dev, i + 1);
    406
    407	err = memcmp(expect, got, sizeof(got)) ? -1 : 0;
    408
    409	if (verbose) {
    410		printk("%s: Reset (%d) signature = ", dev->name, k);
    411		for (i = 0; i < 5; i++)
    412			printk("%3x", got[i]);
    413		if (err)
    414			printk(" (incorrect)");
    415		printk("\n");
    416	}
    417
    418	pi_disconnect(dev->pi);
    419	return err;
    420}
    421
    422static void xs(char *buf, char *targ, int len)
    423{
    424	char l = '\0';
    425	int k;
    426
    427	for (k = 0; k < len; k++) {
    428		char c = *buf++;
    429		if (c != ' ' && c != l)
    430			l = *targ++ = c;
    431	}
    432	if (l == ' ')
    433		targ--;
    434	*targ = '\0';
    435}
    436
    437static int pg_identify(struct pg *dev, int log)
    438{
    439	int s;
    440	char *ms[2] = { "master", "slave" };
    441	char mf[10], id[18];
    442	char id_cmd[12] = { ATAPI_IDENTIFY, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0 };
    443	char buf[36];
    444
    445	s = pg_command(dev, id_cmd, 36, jiffies + PG_TMO);
    446	if (s)
    447		return -1;
    448	s = pg_completion(dev, buf, jiffies + PG_TMO);
    449	if (s)
    450		return -1;
    451
    452	if (log) {
    453		xs(buf + 8, mf, 8);
    454		xs(buf + 16, id, 16);
    455		printk("%s: %s %s, %s\n", dev->name, mf, id, ms[dev->drive]);
    456	}
    457
    458	return 0;
    459}
    460
    461/*
    462 * returns  0, with id set if drive is detected
    463 *	   -1, if drive detection failed
    464 */
    465static int pg_probe(struct pg *dev)
    466{
    467	if (dev->drive == -1) {
    468		for (dev->drive = 0; dev->drive <= 1; dev->drive++)
    469			if (!pg_reset(dev))
    470				return pg_identify(dev, 1);
    471	} else {
    472		if (!pg_reset(dev))
    473			return pg_identify(dev, 1);
    474	}
    475	return -1;
    476}
    477
    478static int pg_detect(void)
    479{
    480	struct pg *dev = &devices[0];
    481	int k, unit;
    482
    483	printk("%s: %s version %s, major %d\n", name, name, PG_VERSION, major);
    484
    485	par_drv = pi_register_driver(name);
    486	if (!par_drv) {
    487		pr_err("failed to register %s driver\n", name);
    488		return -1;
    489	}
    490
    491	k = 0;
    492	if (pg_drive_count == 0) {
    493		if (pi_init(dev->pi, 1, -1, -1, -1, -1, -1, pg_scratch,
    494			    PI_PG, verbose, dev->name)) {
    495			if (!pg_probe(dev)) {
    496				dev->present = 1;
    497				k++;
    498			} else
    499				pi_release(dev->pi);
    500		}
    501
    502	} else
    503		for (unit = 0; unit < PG_UNITS; unit++, dev++) {
    504			int *parm = *drives[unit];
    505			if (!parm[D_PRT])
    506				continue;
    507			if (pi_init(dev->pi, 0, parm[D_PRT], parm[D_MOD],
    508				    parm[D_UNI], parm[D_PRO], parm[D_DLY],
    509				    pg_scratch, PI_PG, verbose, dev->name)) {
    510				if (!pg_probe(dev)) {
    511					dev->present = 1;
    512					k++;
    513				} else
    514					pi_release(dev->pi);
    515			}
    516		}
    517
    518	if (k)
    519		return 0;
    520
    521	pi_unregister_driver(par_drv);
    522	printk("%s: No ATAPI device detected\n", name);
    523	return -1;
    524}
    525
    526static int pg_open(struct inode *inode, struct file *file)
    527{
    528	int unit = iminor(inode) & 0x7f;
    529	struct pg *dev = &devices[unit];
    530	int ret = 0;
    531
    532	mutex_lock(&pg_mutex);
    533	if ((unit >= PG_UNITS) || (!dev->present)) {
    534		ret = -ENODEV;
    535		goto out;
    536	}
    537
    538	if (test_and_set_bit(0, &dev->access)) {
    539		ret = -EBUSY;
    540		goto out;
    541	}
    542
    543	if (dev->busy) {
    544		pg_reset(dev);
    545		dev->busy = 0;
    546	}
    547
    548	pg_identify(dev, (verbose > 1));
    549
    550	dev->bufptr = kmalloc(PG_MAX_DATA, GFP_KERNEL);
    551	if (dev->bufptr == NULL) {
    552		clear_bit(0, &dev->access);
    553		printk("%s: buffer allocation failed\n", dev->name);
    554		ret = -ENOMEM;
    555		goto out;
    556	}
    557
    558	file->private_data = dev;
    559
    560out:
    561	mutex_unlock(&pg_mutex);
    562	return ret;
    563}
    564
    565static int pg_release(struct inode *inode, struct file *file)
    566{
    567	struct pg *dev = file->private_data;
    568
    569	kfree(dev->bufptr);
    570	dev->bufptr = NULL;
    571	clear_bit(0, &dev->access);
    572
    573	return 0;
    574}
    575
    576static ssize_t pg_write(struct file *filp, const char __user *buf, size_t count, loff_t *ppos)
    577{
    578	struct pg *dev = filp->private_data;
    579	struct pg_write_hdr hdr;
    580	int hs = sizeof (hdr);
    581
    582	if (dev->busy)
    583		return -EBUSY;
    584	if (count < hs)
    585		return -EINVAL;
    586
    587	if (copy_from_user(&hdr, buf, hs))
    588		return -EFAULT;
    589
    590	if (hdr.magic != PG_MAGIC)
    591		return -EINVAL;
    592	if (hdr.dlen < 0 || hdr.dlen > PG_MAX_DATA)
    593		return -EINVAL;
    594	if ((count - hs) > PG_MAX_DATA)
    595		return -EINVAL;
    596
    597	if (hdr.func == PG_RESET) {
    598		if (count != hs)
    599			return -EINVAL;
    600		if (pg_reset(dev))
    601			return -EIO;
    602		return count;
    603	}
    604
    605	if (hdr.func != PG_COMMAND)
    606		return -EINVAL;
    607
    608	dev->start = jiffies;
    609	dev->timeout = hdr.timeout * HZ + HZ / 2 + jiffies;
    610
    611	if (pg_command(dev, hdr.packet, hdr.dlen, jiffies + PG_TMO)) {
    612		if (dev->status & 0x10)
    613			return -ETIME;
    614		return -EIO;
    615	}
    616
    617	dev->busy = 1;
    618
    619	if (copy_from_user(dev->bufptr, buf + hs, count - hs))
    620		return -EFAULT;
    621	return count;
    622}
    623
    624static ssize_t pg_read(struct file *filp, char __user *buf, size_t count, loff_t *ppos)
    625{
    626	struct pg *dev = filp->private_data;
    627	struct pg_read_hdr hdr;
    628	int hs = sizeof (hdr);
    629	int copy;
    630
    631	if (!dev->busy)
    632		return -EINVAL;
    633	if (count < hs)
    634		return -EINVAL;
    635
    636	dev->busy = 0;
    637
    638	if (pg_completion(dev, dev->bufptr, dev->timeout))
    639		if (dev->status & 0x10)
    640			return -ETIME;
    641
    642	memset(&hdr, 0, sizeof(hdr));
    643	hdr.magic = PG_MAGIC;
    644	hdr.dlen = dev->dlen;
    645	copy = 0;
    646
    647	if (hdr.dlen < 0) {
    648		hdr.dlen = -1 * hdr.dlen;
    649		copy = hdr.dlen;
    650		if (copy > (count - hs))
    651			copy = count - hs;
    652	}
    653
    654	hdr.duration = (jiffies - dev->start + HZ / 2) / HZ;
    655	hdr.scsi = dev->status & 0x0f;
    656
    657	if (copy_to_user(buf, &hdr, hs))
    658		return -EFAULT;
    659	if (copy > 0)
    660		if (copy_to_user(buf + hs, dev->bufptr, copy))
    661			return -EFAULT;
    662	return copy + hs;
    663}
    664
    665static int __init pg_init(void)
    666{
    667	int unit;
    668	int err;
    669
    670	if (disable){
    671		err = -EINVAL;
    672		goto out;
    673	}
    674
    675	pg_init_units();
    676
    677	if (pg_detect()) {
    678		err = -ENODEV;
    679		goto out;
    680	}
    681
    682	err = register_chrdev(major, name, &pg_fops);
    683	if (err < 0) {
    684		printk("pg_init: unable to get major number %d\n", major);
    685		for (unit = 0; unit < PG_UNITS; unit++) {
    686			struct pg *dev = &devices[unit];
    687			if (dev->present)
    688				pi_release(dev->pi);
    689		}
    690		goto out;
    691	}
    692	major = err;	/* In case the user specified `major=0' (dynamic) */
    693	pg_class = class_create(THIS_MODULE, "pg");
    694	if (IS_ERR(pg_class)) {
    695		err = PTR_ERR(pg_class);
    696		goto out_chrdev;
    697	}
    698	for (unit = 0; unit < PG_UNITS; unit++) {
    699		struct pg *dev = &devices[unit];
    700		if (dev->present)
    701			device_create(pg_class, NULL, MKDEV(major, unit), NULL,
    702				      "pg%u", unit);
    703	}
    704	err = 0;
    705	goto out;
    706
    707out_chrdev:
    708	unregister_chrdev(major, "pg");
    709out:
    710	return err;
    711}
    712
    713static void __exit pg_exit(void)
    714{
    715	int unit;
    716
    717	for (unit = 0; unit < PG_UNITS; unit++) {
    718		struct pg *dev = &devices[unit];
    719		if (dev->present)
    720			device_destroy(pg_class, MKDEV(major, unit));
    721	}
    722	class_destroy(pg_class);
    723	unregister_chrdev(major, name);
    724
    725	for (unit = 0; unit < PG_UNITS; unit++) {
    726		struct pg *dev = &devices[unit];
    727		if (dev->present)
    728			pi_release(dev->pi);
    729	}
    730}
    731
    732MODULE_LICENSE("GPL");
    733module_init(pg_init)
    734module_exit(pg_exit)