5 #include <scsi/scsi_ioctl.h>
8 #include "arch.h" // page_size
14 #include "utils.h" // ARRAY_SIZE
16 #ifndef SCSI_IOCTL_GET_PCI
17 #define SCSI_IOCTL_GET_PCI 0x5387
20 #ifndef SG_GET_ACCESS_COUNT
21 #define SG_GET_ACCESS_COUNT 0x2289
24 static const struct ioctl scsi_ioctls
[] = {
25 IOCTL(SCSI_IOCTL_GET_IDLUN
),
26 IOCTL(SCSI_IOCTL_TAGGED_ENABLE
),
27 IOCTL(SCSI_IOCTL_TAGGED_DISABLE
),
28 IOCTL(SCSI_IOCTL_PROBE_HOST
),
29 IOCTL(SCSI_IOCTL_GET_BUS_NUMBER
),
30 IOCTL(SCSI_IOCTL_GET_PCI
),
31 IOCTL(SCSI_IOCTL_SEND_COMMAND
),
32 IOCTL(SCSI_IOCTL_TEST_UNIT_READY
),
33 IOCTL(SCSI_IOCTL_BENCHMARK_COMMAND
),
34 IOCTL(SCSI_IOCTL_SYNC
),
35 IOCTL(SCSI_IOCTL_START_UNIT
),
36 IOCTL(SCSI_IOCTL_STOP_UNIT
),
37 IOCTL(SCSI_IOCTL_DOORLOCK
),
38 IOCTL(SCSI_IOCTL_DOORUNLOCK
),
40 IOCTL(SG_EMULATED_HOST
),
41 IOCTL(SG_SET_TRANSFORM
),
42 IOCTL(SG_GET_TRANSFORM
),
43 IOCTL(SG_SET_RESERVED_SIZE
),
44 IOCTL(SG_GET_RESERVED_SIZE
),
45 IOCTL(SG_GET_SCSI_ID
),
46 IOCTL(SG_SET_FORCE_LOW_DMA
),
47 IOCTL(SG_GET_LOW_DMA
),
48 IOCTL(SG_SET_FORCE_PACK_ID
),
49 IOCTL(SG_GET_PACK_ID
),
50 IOCTL(SG_GET_NUM_WAITING
),
51 IOCTL(SG_GET_SG_TABLESIZE
),
52 IOCTL(SG_GET_VERSION_NUM
),
55 IOCTL(SG_GET_REQUEST_TABLE
),
56 IOCTL(SG_SET_KEEP_ORPHAN
),
57 IOCTL(SG_GET_KEEP_ORPHAN
),
58 IOCTL(SG_GET_ACCESS_COUNT
),
59 IOCTL(SG_SET_TIMEOUT
),
60 IOCTL(SG_GET_TIMEOUT
),
61 IOCTL(SG_GET_COMMAND_Q
),
62 IOCTL(SG_SET_COMMAND_Q
),
64 IOCTL(SG_NEXT_CMD_LEN
),
67 static const char *const scsi_devs
[] = {
74 unsigned char data
[512];
75 unsigned char cmd
[12];
76 unsigned char sense
[252];
79 static void scsi_sg_io_sanitise(int childno
)
83 sgio
= (struct sgio
*) page_rand
;
88 sgio
->ioh
.interface_id
= 'S';
91 case 0: sgio
->ioh
.dxfer_direction
= SG_DXFER_NONE
; break;
92 case 1: sgio
->ioh
.dxfer_direction
= SG_DXFER_TO_DEV
; break;
93 case 2: sgio
->ioh
.dxfer_direction
= SG_DXFER_FROM_DEV
; break;
94 case 3: sgio
->ioh
.dxfer_direction
= SG_DXFER_TO_FROM_DEV
; break;
98 sgio
->ioh
.dxferp
= sgio
->data
;
100 switch (rand() % 3) {
101 case 0: sgio
->ioh
.dxfer_len
= rand() % page_size
; break;
102 case 1: sgio
->ioh
.dxfer_len
= (unsigned int) rand32(); break;
103 case 2: sgio
->ioh
.dxfer_len
= rand() % 512; break;
107 sgio
->ioh
.cmdp
= sgio
->cmd
;
108 sgio
->ioh
.cmd_len
= 6;
109 sgio
->ioh
.mx_sb_len
= sizeof(sgio
->sense
);
110 sgio
->ioh
.sbp
= sgio
->sense
;
111 sgio
->ioh
.timeout
= UINT_MAX
;
112 sgio
->ioh
.usr_ptr
= NULL
;
113 sgio
->ioh
.flags
|= SG_FLAG_DIRECT_IO
;
115 shm
->a3
[childno
] = (unsigned long) page_rand
;
118 static void scsi_sanitise(const struct ioctl_group
*grp
, int childno
)
120 pick_random_ioctl(grp
, childno
);
122 switch (shm
->a2
[childno
]) {
124 scsi_sg_io_sanitise(childno
);
131 static const struct ioctl_group scsi_grp
= {
132 .devtype
= DEV_BLOCK
,
134 .devs_cnt
= ARRAY_SIZE(scsi_devs
),
135 .sanitise
= scsi_sanitise
,
136 .ioctls
= scsi_ioctls
,
137 .ioctls_cnt
= ARRAY_SIZE(scsi_ioctls
),
140 REG_IOCTL_GROUP(scsi_grp
)