| 150 | } |
| 151 | |
| 152 | void 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; |