File: kpatch

package info (click to toggle)
hwtools 0.5-0.2
  • links: PTS
  • area: main
  • in suites: potato
  • size: 1,304 kB
  • ctags: 1,213
  • sloc: ansic: 9,522; tcl: 2,140; asm: 802; makefile: 295; sh: 262; cpp: 160; csh: 42
file content (93 lines) | stat: -rw-r--r-- 2,581 bytes parent folder | download | duplicates (12)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
*** scsi_ioctl.c.~2~	Sat Sep 11 18:19:39 1993
--- scsi_ioctl.c	Tue Sep 14 00:52:50 1993
***************
*** 214,219 ****
--- 214,278 ----
  #endif
  }
  
+ /* Only used for benchmarking the low-level scsi code.  This will use
+ the ramdisk as the temporary buffer */
+ 
+ extern char * rd_start;
+ extern int rd_length;
+ 
+ static int benchmark_ioctl_command(Scsi_Device *dev, void *buffer)
+ {
+ 	char * buf;
+ 	char cmd[12];
+ 	char * cmd_in;
+ 	Scsi_Cmnd * SCpnt;
+ 	unsigned char opcode;
+ 	int inlen, outlen, cmdlen;
+ 	int needed;
+ 	int result;
+ 
+ 	if (!buffer)
+ 		return -EINVAL;
+ 	
+ 	inlen = get_fs_long((unsigned long *) buffer);
+ 	outlen = get_fs_long( ((unsigned long *) buffer) + 1);
+ 
+ 	cmd_in = (char *) ( ((int *)buffer) + 2);
+ 	opcode = get_fs_byte(cmd_in); 
+ 
+ 	needed = (inlen > outlen ? inlen : outlen);
+ 	if(needed) {
+ 		if(needed > rd_length) return -EINVAL;
+ 		buf = rd_start;
+ 	} else
+ 		buf = NULL;
+ 
+ 	memcpy_fromfs ((void *) cmd,  cmd_in,  cmdlen = COMMAND_SIZE (opcode));
+ 	memcpy_fromfs ((void *) buf,  (void *) (cmd_in + cmdlen), inlen);
+ 
+ 	cmd[1] = ( cmd[1] & 0x1f ) | (dev->lun << 5);
+ 
+ 	SCpnt = allocate_device(NULL, dev->index, 1);
+ 
+ 	scsi_do_cmd(SCpnt,  cmd,  buf, outlen,  scsi_ioctl_done,  MAX_TIMEOUT, 
+ 			MAX_RETRIES);
+ 
+ 	if (SCpnt->request.dev != 0xfffe){
+ 	  SCpnt->request.waiting = current;
+ 	  current->state = TASK_UNINTERRUPTIBLE;
+ 	  while (SCpnt->request.dev != 0xfffe) schedule();
+ 	};
+ 
+ 	result = verify_area(VERIFY_WRITE, cmd_in, outlen);
+ 	if (result)
+ 		return result;
+ 	memcpy_tofs ((void *) cmd_in,  buf, outlen);
+ 	result = SCpnt->result;
+ 	SCpnt->request.dev = -1;  /* Mark as not busy */
+ 	wake_up(&scsi_devices[SCpnt->index].device_wait);
+ 	return result;
+ }
+ 
  	
  
  /*
***************
*** 236,241 ****
--- 295,302 ----
  			return 0;
  		case SCSI_IOCTL_PROBE_HOST:
  			return ioctl_probe(dev->host, arg);
+ 		case SCSI_IOCTL_BENCHMARK_COMMAND:
+ 			return benchmark_ioctl_command((Scsi_Device *) dev, arg);
  		case SCSI_IOCTL_SEND_COMMAND:
  			return ioctl_command((Scsi_Device *) dev, arg);
  		case SCSI_IOCTL_DOORLOCK:
*** scsi_ioctl.h.~1~	Tue Sep  7 01:38:47 1993
--- scsi_ioctl.h	Mon Sep 13 23:53:39 1993
***************
*** 4,9 ****
--- 4,10 ----
  #define SCSI_IOCTL_PROBE_HOST 0
  #define SCSI_IOCTL_SEND_COMMAND 1
  #define SCSI_IOCTL_TEST_UNIT_READY 2
+ #define SCSI_IOCTL_BENCHMARK_COMMAND 3
  /* The door lock/unlock constants are compatible with Sun constants for
     the cdrom */
  #define SCSI_IOCTL_DOORLOCK 0x5380		/* lock the eject mechanism */