@@ -64,82 +64,87 @@ void psyqo::CDRomDevice::ActionBase::queueCallbackFromISR(bool success) {
64
64
}
65
65
66
66
void psyqo::CDRomDevice::irq () {
67
- Kernel::assert (m_action != nullptr , " CDRomDevice::irq() called with no action - spurious interrupt?" );
68
- uint8_t cause = Hardware::CDRom::Cause;
69
-
70
- if (cause & 7 ) {
71
- Hardware::CDRom::Cause = 7 ;
72
- }
67
+ bool ranOnce = false ;
68
+ while (true ) {
69
+ uint8_t cause = Hardware::CDRom::Cause;
70
+ if (ranOnce && ((cause & 15 ) == 0 )) break ;
71
+ ranOnce = true ;
72
+ Kernel::assert (m_action != nullptr , " CDRomDevice::irq() called with no action - spurious interrupt?" );
73
+
74
+ if (cause & 7 ) {
75
+ Hardware::CDRom::Cause = 7 ;
76
+ }
73
77
74
- if (cause & 0x18 ) {
75
- Hardware::CDRom::Cause = 0x18 ;
76
- }
78
+ if (cause & 0x18 ) {
79
+ Hardware::CDRom::Cause = 0x18 ;
80
+ }
77
81
78
- bool callCallback = false ;
79
- Response response;
80
- while ((Hardware::CDRom::Ctrl.access () & 0x20 ) && (response.size () < 16 )) {
81
- response.push_back (Hardware::CDRom::Response);
82
- }
82
+ bool callCallback = false ;
83
+ Response response;
84
+ while ((Hardware::CDRom::Ctrl.access () & 0x20 ) && (response.size () < 16 )) {
85
+ response.push_back (Hardware::CDRom::Response);
86
+ }
83
87
84
88
#ifdef DEBUG_CDROM_RESPONSES
85
- if (m_blocking) {
86
- ramsyscall_printf (" Got CD-Rom response:" );
87
- for (auto byte : response) {
88
- ramsyscall_printf (" %02x" , byte);
89
- }
90
- syscall_puts (" \n " );
91
- } else {
92
- Kernel::queueCallbackFromISR ([response]() {
89
+ if (m_blocking) {
93
90
ramsyscall_printf (" Got CD-Rom response:" );
94
91
for (auto byte : response) {
95
92
ramsyscall_printf (" %02x" , byte);
96
93
}
97
94
syscall_puts (" \n " );
98
- });
99
- }
100
- #endif
101
-
102
- switch (cause & 7 ) {
103
- case 1 :
104
- callCallback = m_action->dataReady (response);
105
- break ;
106
- case 2 :
107
- callCallback = m_action->complete (response);
108
- break ;
109
- case 3 :
110
- callCallback = m_action->acknowledge (response);
111
- break ;
112
- case 4 :
113
- callCallback = m_action->end (response);
114
- break ;
115
- case 5 : {
116
- m_success = false ;
117
- callCallback = true ;
118
- #ifdef DEBUG_CDROM_ERRORS
119
- m_callback = [callback = eastl::move (m_callback), name = m_action->name (),
120
- response = eastl::move (response)](bool ) {
121
- ramsyscall_printf (" Got CD-Rom error during action %s:" , name);
95
+ } else {
96
+ Kernel::queueCallbackFromISR ([response]() {
97
+ ramsyscall_printf (" Got CD-Rom response:" );
122
98
for (auto byte : response) {
123
99
ramsyscall_printf (" %02x" , byte);
124
100
}
125
101
syscall_puts (" \n " );
126
- callback ( false );
127
- };
102
+ } );
103
+ }
128
104
#endif
129
- } break ;
130
- default :
131
- Kernel::abort (" CDRomDevice::irq() invoked with unknown cause" );
132
- break ;
133
- }
134
105
135
- if (callCallback) {
136
- Kernel::assert (!!m_callback, " Wrong CDRomDevice state" );
137
- m_action = nullptr ;
138
- if (m_blocking) {
139
- actionComplete ();
140
- } else {
141
- eastl::atomic_signal_fence (eastl::memory_order_acquire);
142
- Kernel::queueCallbackFromISR ([this ]() { actionComplete (); });
106
+ switch (cause & 7 ) {
107
+ case 1 :
108
+ callCallback = m_action->dataReady (response);
109
+ break ;
110
+ case 2 :
111
+ callCallback = m_action->complete (response);
112
+ break ;
113
+ case 3 :
114
+ callCallback = m_action->acknowledge (response);
115
+ break ;
116
+ case 4 :
117
+ callCallback = m_action->end (response);
118
+ break ;
119
+ case 5 : {
120
+ m_success = false ;
121
+ callCallback = true ;
122
+ #ifdef DEBUG_CDROM_ERRORS
123
+ m_callback = [callback = eastl::move (m_callback), name = m_action->name (),
124
+ response = eastl::move (response)](bool ) {
125
+ ramsyscall_printf (" Got CD-Rom error during action %s:" , name);
126
+ for (auto byte : response) {
127
+ ramsyscall_printf (" %02x" , byte);
128
+ }
129
+ syscall_puts (" \n " );
130
+ callback (false );
131
+ };
132
+ #endif
133
+ } break ;
134
+ default :
135
+ Kernel::abort (" CDRomDevice::irq() invoked with unknown cause" );
136
+ break ;
137
+ }
138
+
139
+ if (callCallback) {
140
+ Kernel::assert (!!m_callback, " Wrong CDRomDevice state" );
141
+ m_action = nullptr ;
142
+ if (m_blocking) {
143
+ actionComplete ();
144
+ } else {
145
+ eastl::atomic_signal_fence (eastl::memory_order_acquire);
146
+ Kernel::queueCallbackFromISR ([this ]() { actionComplete (); });
147
+ }
143
148
}
144
149
}
145
150
}
0 commit comments