Hello all, I have a quick question that I hope somebody can shed some light on. Inside of helper functions, can you have a page fault that must be serviced by the OS? I ask because I cannot see how the cpu state is restored inside of a helper function. Inside tlb_fill, when invoked not from a helper but from the translated code, the retaddr is correct and the cpu_restore_state will be successful. However, when invoked from a helper function, the retaddr will be that of ldq_kernel or whatever function calls __ld version of the function in softmmu_template.h and softmmu_header.h. So surely tb will not be found and the cpu state will not be restored. Can somebody shed some more light on this, or should accesses that may cause a page fault be avoided in helper code.
void tlb_fill(target_ulong addr, int is_write, int mmu_idx, void *retaddr) { TranslationBlock *tb; int ret; unsigned long pc; CPUX86State *saved_env; /* XXX: hack to restore env in all cases, even if not called from generated code */ saved_env = env; env = cpu_single_env; ret = cpu_x86_handle_mmu_fault(env, addr, is_write, mmu_idx, 1); if (ret) { if (retaddr) { /* now we have a real cpu fault */ pc = (unsigned long)retaddr; tb = tb_find_pc(pc); if (tb) { /* the PC is inside the translated code. It means that we have a virtual CPU fault */ cpu_restore_state(tb, env, pc, NULL); } } raise_exception_err(env->exception_index, env->error_code); } env = saved_env; } Thanks, -Jim