@@ -61,14 +61,22 @@ void dcd_int_handler(uint8_t rhport) {
6161
6262 // Choose if we want to generate a signal based on the fuzzed data.
6363 if (_fuzz_data_provider->ConsumeBool ()) {
64- dcd_event_bus_signal (
65- rhport,
66- // Choose a random event based on the fuzz data.
67- (dcd_eventid_t )_fuzz_data_provider->ConsumeIntegralInRange <uint8_t >(
68- DCD_EVENT_INVALID + 1 , DCD_EVENT_COUNT - 1 ),
69- // Identify trigger as either an interrupt or a syncrhonous call
70- // depending on fuzz data.
71- _fuzz_data_provider->ConsumeBool ());
64+ // Only generate bus signal events that don't carry additional union data.
65+ // DCD_EVENT_XFER_COMPLETE, DCD_EVENT_SOF, and DCD_EVENT_BUS_RESET need
66+ // properly initialized union fields; USBD_EVENT_FUNC_CALL is internal only.
67+ // Valid bus-signal-only events: UNPLUGGED(2), SUSPEND(4), RESUME(5).
68+ static const dcd_eventid_t bus_signal_events[] = {
69+ DCD_EVENT_UNPLUGGED, DCD_EVENT_SUSPEND, DCD_EVENT_RESUME};
70+ uint8_t idx = _fuzz_data_provider->ConsumeIntegralInRange <uint8_t >(0 , 2 );
71+ dcd_event_bus_signal (rhport, bus_signal_events[idx],
72+ _fuzz_data_provider->ConsumeBool ());
73+ }
74+
75+ // Optionally generate a BUS_RESET event with a valid speed value.
76+ if (_fuzz_data_provider->ConsumeBool ()) {
77+ tusb_speed_t speed = (tusb_speed_t )_fuzz_data_provider->ConsumeIntegralInRange <uint8_t >(
78+ TUSB_SPEED_FULL, TUSB_SPEED_HIGH);
79+ dcd_event_bus_reset (rhport, speed, _fuzz_data_provider->ConsumeBool ());
7280 }
7381
7482 if (_fuzz_data_provider->ConsumeBool ()) {
0 commit comments