RASCSI/cpp/devices
Klaus Kämpf ad5eae93e7
Multiple fixes for ModeSelect (#1405)
* Allow 'empty' ModeSelect6

tl;dr

Treat a computed length of 0 as `has_valid_page_code`.

Details:

The SRM console (aka 'BIOS') of DEC Alpha sends an empty
ModeSelect6 with the following data:
~~~
ModeSelect6, CDB $151000000c00
~~~

That makes 12 byte(s) as follows
~~~
  0  1  2  3   4   5  6  7   8   9 10 11
 00 00 00 08  00  00 00 00  00  00 02 00
~~~

decoding it (accoring to [1], Section 8.3.3, Table 94) gives us

Mode Data Length 0
Medium Type      0
Device-specific  0
Block desc len   8

Density Code     0
Number of blks   0
Reserved         0
Block length     512

`scsi_command_util::ModeSelect` computes
~~~
offset = 4 + buf[3];
~~~

giving 12 and

~~~
length -= offset;
~~~

giving 0.

Thus it never enters the `while` loop and `has_valid_page_code` stays
`false`, raising an error.

[1] [Small Computer System Interface - 2 rev 10L.pdf](https://dn790004.ca.archive.org/0/items/SCSISpecificationDocumentsSCSIDocuments/Small%20Computer%20System%20Interface%20-%202%20rev%2010L.pdf)

Signed-off-by: Klaus Kämpf <kkaempf@gmail.com>

* Allow ModeSelect with page code 1

OpenVMS Alpha (the operating system, not the SRM BIOS) uses
ModeSelect6 with a page code of 1.

The semantics are unknown, just accepting it works for me.

Signed-off-by: Klaus Kämpf <kkaempf@gmail.com>

* Fix page length computation in ModeSelect

tl;dr

The 'skip to next ModeSelect page' computation was off-by-one, either not
taking the page code itself into account or missing the fact that the
page length is given as `n - 1`.

Fix:

Add 1 to the computed length.

Details:

OpenVMS Alpha sends a ModeSelect6 as follows
~~~
command:

ModeSelect6, CDB $151000001900

payload:

 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
00 00 00 08 00 00 00 00 00 00 02 00 01 0a 24 00 00 00 00 00 00 00 00 00 00
~~~

This translates to (accoring to [1], Section 8.3.3)

~~~
Mode Data Length 0
Medium Type      0
Device-specific  0
Block desc len   8
~~~

with the following offset / length computation _before_ the `while` loop
~~~
offset = 12
length = 13
~~~

The first payload section is
~~~
 4  5  6  7  8  9 10 11
00 00 00 00 00 00 02 00
~~~

translating to

~~~
Density Code     0
Number of blks   0
Reserved         0
Block length   0x200 512
~~~

Then follows a pagecode 1 as
~~~
12 13 14 15 16 17 18 19 20 21 22 23 24
01 0a 24 00 00 00 00 00 00 00 00 00 00
~~~

translating to
~~~~
Page code        1
Page length -1  10
Mode parameters 24 00 00 00 00 00 00 00 00 00 00
~~~

computing (inside the `while` loop, as `// Advance to the next page`)

~~~
size =  10 + 2 = 12
~~~

followed by new `offset` and `length` values

~~~
offset = 25
length = 1
~~~

So it stays in the `while` loop (and has a larger-than-buffer `offset`
value)

Signed-off-by: Klaus Kämpf <kkaempf@gmail.com>
2024-01-07 15:06:35 +09:00
..
interfaces Issues 1179 and 1182 (#1232) 2023-10-15 08:38:15 +02:00
cd_track.cpp
cd_track.h Issues 1179 and 1182 (#1232) 2023-10-15 08:38:15 +02:00
cfilesystem.cpp Issues 1179 and 1182 (#1232) 2023-10-15 08:38:15 +02:00
cfilesystem.h Issues 1179 and 1182 (#1232) 2023-10-15 08:38:15 +02:00
ctapdriver.cpp Fix daynaport emulation regression (#1306) (#1318) 2023-11-09 00:39:00 +01:00
ctapdriver.h Move default device parameters from DeviceFactory to the respective devices #1257 (#1259) 2023-10-30 11:24:18 +01:00
device_factory.cpp Move sector sizes lists from DeviceFactory to the respective devices (#1323) 2023-11-14 15:32:46 +01:00
device_factory.h Move sector sizes lists from DeviceFactory to the respective devices (#1323) 2023-11-14 15:32:46 +01:00
device_logger.cpp Fix missing logging for a LUN when the LUN is explicitly specified (#1379) 2023-11-26 13:25:54 +09:00
device_logger.h Issues 1179 and 1182 (#1232) 2023-10-15 08:38:15 +02:00
device.cpp Move default device parameters from DeviceFactory to the respective devices #1257 (#1259) 2023-10-30 11:24:18 +01:00
device.h Move default device parameters from DeviceFactory to the respective devices #1257 (#1259) 2023-10-30 11:24:18 +01:00
disk_cache.cpp Add statistics and make scsictl accept generic key/value parameters (#1237/#1238) (#1262) 2023-10-30 13:32:45 +01:00
disk_cache.h Add statistics and make scsictl accept generic key/value parameters (#1237/#1238) (#1262) 2023-10-30 13:32:45 +01:00
disk_track.cpp Add statistics and make scsictl accept generic key/value parameters (#1237/#1238) (#1262) 2023-10-30 13:32:45 +01:00
disk_track.h Add statistics and make scsictl accept generic key/value parameters (#1237/#1238) (#1262) 2023-10-30 13:32:45 +01:00
disk.cpp Move sector sizes lists from DeviceFactory to the respective devices (#1323) 2023-11-14 15:32:46 +01:00
disk.h Move sector sizes lists from DeviceFactory to the respective devices (#1323) 2023-11-14 15:32:46 +01:00
host_services.cpp Issues 1179 and 1182 (#1232) 2023-10-15 08:38:15 +02:00
host_services.h Issues 1179 and 1182 (#1232) 2023-10-15 08:38:15 +02:00
mode_page_device.cpp Issues 1179 and 1182 (#1232) 2023-10-15 08:38:15 +02:00
mode_page_device.h Issues 1179 and 1182 (#1232) 2023-10-15 08:38:15 +02:00
primary_device.cpp Issues 1179 and 1182 (#1232) 2023-10-15 08:38:15 +02:00
primary_device.h Add statistics and make scsictl accept generic key/value parameters (#1237/#1238) (#1262) 2023-10-30 13:32:45 +01:00
scsi_command_util.cpp Multiple fixes for ModeSelect (#1405) 2024-01-07 15:06:35 +09:00
scsi_command_util.h Issues 1179 and 1182 (#1232) 2023-10-15 08:38:15 +02:00
scsi_daynaport.cpp NetBSD compatibility: Increase daynaport minimum packet size to 128 bytes (#1334) (#1335) 2023-11-14 16:13:14 +01:00
scsi_daynaport.h NetBSD compatibility: Increase daynaport minimum packet size to 128 bytes (#1334) (#1335) 2023-11-14 16:13:14 +01:00
scsi_host_bridge.cpp Move default device parameters from DeviceFactory to the respective devices #1257 (#1259) 2023-10-30 11:24:18 +01:00
scsi_host_bridge.h Move default device parameters from DeviceFactory to the respective devices #1257 (#1259) 2023-10-30 11:24:18 +01:00
scsi_printer.cpp Fix error count calculation (#1356) 2023-11-14 15:16:23 +01:00
scsi_printer.h Add statistics and make scsictl accept generic key/value parameters (#1237/#1238) (#1262) 2023-10-30 13:32:45 +01:00
scsicd.cpp Move sector sizes lists from DeviceFactory to the respective devices (#1323) 2023-11-14 15:32:46 +01:00
scsicd.h Move sector sizes lists from DeviceFactory to the respective devices (#1323) 2023-11-14 15:32:46 +01:00
scsihd_nec.cpp Issues 1179 and 1182 (#1232) 2023-10-15 08:38:15 +02:00
scsihd_nec.h Move sector sizes lists from DeviceFactory to the respective devices (#1323) 2023-11-14 15:32:46 +01:00
scsihd.cpp Move sector sizes lists from DeviceFactory to the respective devices (#1323) 2023-11-14 15:32:46 +01:00
scsihd.h Move sector sizes lists from DeviceFactory to the respective devices (#1323) 2023-11-14 15:32:46 +01:00
scsimo.cpp Move sector sizes lists from DeviceFactory to the respective devices (#1323) 2023-11-14 15:32:46 +01:00
scsimo.h Move sector sizes lists from DeviceFactory to the respective devices (#1323) 2023-11-14 15:32:46 +01:00
storage_device.cpp Issues 1179 and 1182 (#1232) 2023-10-15 08:38:15 +02:00
storage_device.h Issues 1179 and 1182 (#1232) 2023-10-15 08:38:15 +02:00