remove [64] cleanup TODO
[trinity.git] / ioctls / scsi.c
blobb574246b96157f86a96a2f9a99add7c849de6be8
1 #include <stdlib.h>
2 #include <string.h>
3 #include <limits.h>
4 #include <scsi/scsi.h>
5 #include <scsi/scsi_ioctl.h>
6 #include <scsi/sg.h>
8 #include "arch.h" // page_size
9 #include "ioctls.h"
10 #include "maps.h"
11 #include "random.h"
12 #include "sanitise.h"
13 #include "shm.h"
14 #include "utils.h" // ARRAY_SIZE
16 #ifndef SCSI_IOCTL_GET_PCI
17 #define SCSI_IOCTL_GET_PCI 0x5387
18 #endif
20 #ifndef SG_GET_ACCESS_COUNT
21 #define SG_GET_ACCESS_COUNT 0x2289
22 #endif
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),
53 IOCTL(SG_SCSI_RESET),
54 IOCTL(SG_IO),
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),
63 IOCTL(SG_SET_DEBUG),
64 IOCTL(SG_NEXT_CMD_LEN),
67 static const char *const scsi_devs[] = {
68 "sd",
69 "sr",
72 struct sgio {
73 sg_io_hdr_t ioh;
74 unsigned char data[512];
75 unsigned char cmd[12];
76 unsigned char sense[252];
79 static void scsi_sg_io_sanitise(int childno)
81 struct sgio *sgio;
83 sgio = (struct sgio *) page_rand;
85 sgio->cmd[0] = 0x12;
86 sgio->cmd[3] = 0x2;
88 sgio->ioh.interface_id = 'S';
90 switch (rand() % 4) {
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;
95 default: 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;
104 default: 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]) {
123 case SG_IO:
124 scsi_sg_io_sanitise(childno);
125 break;
126 default:
127 break;
131 static const struct ioctl_group scsi_grp = {
132 .devtype = DEV_BLOCK,
133 .devs = scsi_devs,
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)