* 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>
* Fix missing logging for a LUN when the LUN is explicitly specified
* Do not suppress controller messages when LUN is specified
* Fix misleading logging for DaynaPort
* Only build scsidump when building for the FULLSPEC board
* Only install scsidump manpage when building for the FULLSPEC board
* Only install scsidump binary when building for the FULLSPEC board
* Revert debug optimization back to -O0, -Og omits some information
* Improve how commands are internally executed
* Use const CommandContext for execution
* Update error handling
* Fix SonarQube issues
* Remove duplicate code
* Use mutex instead of atomic_bool
* Add hasher
* Add param_map
* Do not log unknown operations as an error for backward/foward compatibility
The Timer test isn't reliable on all variants of the Raspberry Pi. This will temporarily comment it out.
When the RPi5 support is being added, this test should be made optional and only triggered when a CLI option is present.