Lines Matching refs:emu

51 emu_alu(struct emu *emu, afuc_opc opc, uint32_t src1, uint32_t src2)  in emu_alu()  argument
57 emu->carry = tmp >> 32; in emu_alu()
60 return src1 + src2 + emu->carry; in emu_alu()
63 emu->carry = tmp >> 32; in emu_alu()
66 return src1 - src2 + emu->carry; in emu_alu()
112 load_store_addr(struct emu *emu, unsigned gpr) in load_store_addr() argument
116 uintptr_t addr = emu_get_reg32(emu, &LOAD_STORE_HI); in load_store_addr()
119 return addr + emu_get_gpr_reg(emu, gpr); in load_store_addr()
123 emu_instr(struct emu *emu, afuc_instr *instr) in emu_instr() argument
125 uint32_t rem = emu_get_gpr_reg(emu, REG_REM); in emu_instr()
135 uint32_t val = emu_alu(emu, opc, in emu_instr()
136 emu_get_gpr_reg(emu, instr->alui.src), in emu_instr()
138 emu_set_gpr_reg(emu, instr->alui.dst, val); in emu_instr()
143 emu_set_gpr_reg(emu, instr->movi.dst, val); in emu_instr()
147 uint32_t val = emu_alu(emu, instr->alu.alu, in emu_instr()
148 emu_get_gpr_reg(emu, instr->alu.src1), in emu_instr()
149 emu_get_gpr_reg(emu, instr->alu.src2)); in emu_instr()
150 emu_set_gpr_reg(emu, instr->alu.dst, val); in emu_instr()
158 emu_set_gpr_reg(emu, REG_REM, --rem); in emu_instr()
159 emu_dump_state_change(emu); in emu_instr()
160 emu_set_gpr_reg(emu, REG_DATA, in emu_instr()
161 emu_get_gpr_reg(emu, instr->alu.src2)); in emu_instr()
163 emu_set_gpr_reg(emu, REG_REM, --rem); in emu_instr()
164 emu_dump_state_change(emu); in emu_instr()
165 emu_set_gpr_reg(emu, REG_DATA, in emu_instr()
166 emu_get_gpr_reg(emu, instr->alu.src2)); in emu_instr()
167 emu_set_gpr_reg(emu, REG_REM, --rem); in emu_instr()
168 emu_dump_state_change(emu); in emu_instr()
169 emu_set_gpr_reg(emu, REG_DATA, in emu_instr()
170 emu_get_gpr_reg(emu, instr->alu.src2)); in emu_instr()
172 emu_set_gpr_reg(emu, REG_REM, --rem); in emu_instr()
173 emu_dump_state_change(emu); in emu_instr()
174 emu_set_gpr_reg(emu, REG_DATA, in emu_instr()
175 emu_get_gpr_reg(emu, instr->alu.src2)); in emu_instr()
176 emu_set_gpr_reg(emu, REG_REM, --rem); in emu_instr()
177 emu_dump_state_change(emu); in emu_instr()
178 emu_set_gpr_reg(emu, instr->alu.dst, in emu_instr()
179 emu_get_gpr_reg(emu, instr->alu.src2)); in emu_instr()
180 emu_set_gpr_reg(emu, REG_REM, --rem); in emu_instr()
181 emu_dump_state_change(emu); in emu_instr()
182 emu_set_gpr_reg(emu, REG_DATA, in emu_instr()
183 emu_get_gpr_reg(emu, instr->alu.src2)); in emu_instr()
189 uint32_t src1 = emu_get_gpr_reg(emu, instr->control.src1); in emu_instr()
190 uint32_t src2 = emu_get_gpr_reg(emu, instr->control.src2); in emu_instr()
193 emu_set_gpr_reg(emu, instr->control.src2, src2 + instr->control.uimm); in emu_instr()
194 } else if (instr->control.flags && !emu->quiet) { in emu_instr()
198 emu_set_control_reg(emu, src2 + instr->control.uimm, src1); in emu_instr()
202 uint32_t src2 = emu_get_gpr_reg(emu, instr->control.src2); in emu_instr()
205 emu_set_gpr_reg(emu, instr->control.src2, src2 + instr->control.uimm); in emu_instr()
206 } else if (instr->control.flags && !emu->quiet) { in emu_instr()
210 emu_set_gpr_reg(emu, instr->control.src1, in emu_instr()
211 emu_get_control_reg(emu, src2 + instr->control.uimm)); in emu_instr()
215 uintptr_t addr = load_store_addr(emu, instr->control.src2) + in emu_instr()
219 uint32_t src2 = emu_get_gpr_reg(emu, instr->control.src2); in emu_instr()
220 emu_set_gpr_reg(emu, instr->control.src2, src2 + instr->control.uimm); in emu_instr()
221 } else if (instr->control.flags && !emu->quiet) { in emu_instr()
225 uint32_t val = emu_mem_read_dword(emu, addr); in emu_instr()
227 emu_set_gpr_reg(emu, instr->control.src1, val); in emu_instr()
232 uintptr_t addr = load_store_addr(emu, instr->control.src2) + in emu_instr()
236 uint32_t src2 = emu_get_gpr_reg(emu, instr->control.src2); in emu_instr()
237 emu_set_gpr_reg(emu, instr->control.src2, src2 + instr->control.uimm); in emu_instr()
238 } else if (instr->control.flags && !emu->quiet) { in emu_instr()
242 uint32_t val = emu_get_gpr_reg(emu, instr->control.src1); in emu_instr()
244 emu_mem_write_dword(emu, addr, val); in emu_instr()
249 uint32_t off = emu->gpr_regs.pc + instr->br.ioff; in emu_instr()
250 uint32_t src = emu_get_gpr_reg(emu, instr->br.src); in emu_instr()
254 emu->branch_target = off; in emu_instr()
257 emu->branch_target = off; in emu_instr()
260 emu->branch_target = off; in emu_instr()
263 emu->branch_target = off; in emu_instr()
270 assert(emu->call_stack_idx > 0); in emu_instr()
273 emu->branch_target = emu->call_stack[--emu->call_stack_idx]; in emu_instr()
278 assert(emu->call_stack_idx < ARRAY_SIZE(emu->call_stack)); in emu_instr()
283 emu->call_stack[emu->call_stack_idx++] = emu->gpr_regs.pc + 2; in emu_instr()
284 emu->branch_target = instr->call.uoff; in emu_instr()
289 assert(!emu->branch_target); in emu_instr()
290 emu->run_mode = false; in emu_instr()
291 emu->waitin = true; in emu_instr()
307 emu_set_gpr_reg(emu, REG_REM, --rem); in emu_instr()
312 emu_step(struct emu *emu) in emu_step() argument
314 afuc_instr *instr = (void *)&emu->instrs[emu->gpr_regs.pc]; in emu_step()
318 emu_main_prompt(emu); in emu_step()
320 uint32_t branch_target = emu->branch_target; in emu_step()
321 emu->branch_target = 0; in emu_step()
323 bool waitin = emu->waitin; in emu_step()
324 emu->waitin = false; in emu_step()
330 if (!emu_get_gpr_reg(emu, REG_REM)) in emu_step()
333 emu_clear_state_change(emu); in emu_step()
334 emu_instr(emu, instr); in emu_step()
339 if (emu_get_gpr_reg(emu, REG_REM)) in emu_step()
340 emu_dump_state_change(emu); in emu_step()
343 emu_clear_state_change(emu); in emu_step()
344 emu_instr(emu, instr); in emu_step()
347 emu->gpr_regs.pc++; in emu_step()
350 emu->gpr_regs.pc = branch_target; in emu_step()
354 uint32_t hdr = emu_get_gpr_reg(emu, 1); in emu_step()
367 emu->gpr_regs.val[1] &= 0x0fffffff; in emu_step()
376 assert(id < ARRAY_SIZE(emu->jmptbl)); in emu_step()
378 emu_set_gpr_reg(emu, REG_REM, count); in emu_step()
379 emu->gpr_regs.pc = emu->jmptbl[id]; in emu_step()
382 emu_dump_state_change(emu); in emu_step()
386 emu_run_bootstrap(struct emu *emu) in emu_run_bootstrap() argument
390 emu->quiet = true; in emu_run_bootstrap()
391 emu->run_mode = true; in emu_run_bootstrap()
393 while (emu_get_reg32(emu, &PACKET_TABLE_WRITE_ADDR) < 0x80) { in emu_run_bootstrap()
394 emu_step(emu); in emu_run_bootstrap()
400 check_access(struct emu *emu, uintptr_t gpuaddr, unsigned sz) in check_access() argument
414 emu_mem_read_dword(struct emu *emu, uintptr_t gpuaddr) in emu_mem_read_dword() argument
416 check_access(emu, gpuaddr, 4); in emu_mem_read_dword()
417 return *(uint32_t *)(emu->gpumem + gpuaddr); in emu_mem_read_dword()
421 mem_write_dword(struct emu *emu, uintptr_t gpuaddr, uint32_t val) in mem_write_dword() argument
423 check_access(emu, gpuaddr, 4); in mem_write_dword()
424 *(uint32_t *)(emu->gpumem + gpuaddr) = val; in mem_write_dword()
428 emu_mem_write_dword(struct emu *emu, uintptr_t gpuaddr, uint32_t val) in emu_mem_write_dword() argument
430 mem_write_dword(emu, gpuaddr, val); in emu_mem_write_dword()
431 assert(emu->gpumem_written == ~0); in emu_mem_write_dword()
432 emu->gpumem_written = gpuaddr; in emu_mem_write_dword()
436 emu_init(struct emu *emu) in emu_init() argument
438 emu->gpumem = mmap(NULL, EMU_MEMORY_SIZE, in emu_init()
442 if (emu->gpumem == MAP_FAILED) { in emu_init()
448 for (unsigned i = 0; i < emu->sizedwords; i++) { in emu_init()
449 mem_write_dword(emu, EMU_INSTR_BASE + (4 * i), emu->instrs[i]); in emu_init()
456 if (emu->lpac) { in emu_init()
457 emu_set_reg64(emu, &CP_LPAC_SQE_INSTR_BASE, EMU_INSTR_BASE); in emu_init()
459 emu_set_reg64(emu, &CP_SQE_INSTR_BASE, EMU_INSTR_BASE); in emu_init()
462 if (emu->gpu_id == 660) { in emu_init()
463 emu_set_control_reg(emu, 0, 3 << 28); in emu_init()
464 } else if (emu->gpu_id == 650) { in emu_init()
465 emu_set_control_reg(emu, 0, 1 << 28); in emu_init()
470 emu_fini(struct emu *emu) in emu_fini() argument
472 uint32_t *instrs = emu->instrs; in emu_fini()
473 unsigned sizedwords = emu->sizedwords; in emu_fini()
474 unsigned gpu_id = emu->gpu_id; in emu_fini()
476 munmap(emu->gpumem, EMU_MEMORY_SIZE); in emu_fini()
477 memset(emu, 0, sizeof(*emu)); in emu_fini()
479 emu->instrs = instrs; in emu_fini()
480 emu->sizedwords = sizedwords; in emu_fini()
481 emu->gpu_id = gpu_id; in emu_fini()