MCPcopy Create free account
hub / github.com/danoon2/Boxedwine / syncFromException

Function syncFromException

platform/windows/platformThreads.cpp:152–264  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

150}
151
152void syncFromException(struct _EXCEPTION_POINTERS* ep) {
153 CPU* cpu = KThread::currentThread()->cpu;
154#ifdef _M_ARM64
155 for (U32 i = 0; i < 8; i++) {
156 if (regCache[i] != 0xFF) {
157 switch (regCache[i]) {
158 case 0: cpu->reg[i].u32 = (U32)ep->ContextRecord->X0; break;
159 case 1: cpu->reg[i].u32 = (U32)ep->ContextRecord->X1; break;
160 case 2: cpu->reg[i].u32 = (U32)ep->ContextRecord->X2; break;
161 case 3: cpu->reg[i].u32 = (U32)ep->ContextRecord->X3; break;
162 case 4: cpu->reg[i].u32 = (U32)ep->ContextRecord->X4; break;
163 case 5: cpu->reg[i].u32 = (U32)ep->ContextRecord->X5; break;
164 case 6: cpu->reg[i].u32 = (U32)ep->ContextRecord->X6; break;
165 case 7: cpu->reg[i].u32 = (U32)ep->ContextRecord->X7; break;
166 default:
167 kpanic("Windows ARM64 syncFromException");
168 }
169 }
170 }
171 for (U32 i = 0; i < 8; i++) {
172 if (xmmCache[i] != 0xFF) {
173 cpu->xmm[i].pi.u64[0] = ep->ContextRecord->V[xmmCache[i]].Low;
174 cpu->xmm[i].pi.u64[1] = ep->ContextRecord->V[xmmCache[i]].High;
175 }
176 }
177 cpu->flags = (U32)ep->ContextRecord->X8;
178 cpu->src.u32 = (U32)ep->ContextRecord->X16;
179 cpu->dst.u32 = (U32)ep->ContextRecord->X10;
180 cpu->result.u32 = (U32)ep->ContextRecord->X15;
181 cpu->lazyFlagType = (LazyFlagType)ep->ContextRecord->X11;
182
183#elif defined(BOXEDWINE_64)
184 for (U32 i = 0; i < 8; i++) {
185 if (regCache[i] != 0xFF) {
186 switch (regCache[i]) {
187 case 0: cpu->reg[i].u32 = (U32)ep->ContextRecord->Rax; break;
188 case 1: cpu->reg[i].u32 = (U32)ep->ContextRecord->Rcx; break;
189 case 2: cpu->reg[i].u32 = (U32)ep->ContextRecord->Rdx; break;
190 case 3: cpu->reg[i].u32 = (U32)ep->ContextRecord->Rbx; break;
191 case 10: cpu->reg[i].u32 = (U32)ep->ContextRecord->R10; break;
192 case 5: cpu->reg[i].u32 = (U32)ep->ContextRecord->Rbp; break;
193 case 6: cpu->reg[i].u32 = (U32)ep->ContextRecord->Rsi; break;
194 case 7: cpu->reg[i].u32 = (U32)ep->ContextRecord->Rdi; break;
195 default:
196 kpanic("Windows x86 syncFromException");
197 }
198 }
199 }
200 for (U32 i = 0; i < 8; i++) {
201 if (xmmCache[i] != 0xFF) {
202 switch (xmmCache[i]) {
203 case 0:
204 cpu->xmm[i].pi.u64[0] = ep->ContextRecord->Xmm0.Low;
205 cpu->xmm[i].pi.u64[1] = ep->ContextRecord->Xmm0.High;
206 break;
207 case 1:
208 cpu->xmm[i].pi.u64[0] = ep->ContextRecord->Xmm1.Low;
209 cpu->xmm[i].pi.u64[1] = ep->ContextRecord->Xmm1.High;

Callers 1

seh_filterFunction · 0.70

Calls 1

kpanicFunction · 0.85

Tested by

no test coverage detected