GPR_K1
UASM_i_ADDIU(&p, GPR_K1, GPR_SP, -(int)sizeof(struct pt_regs));
UASM_i_SW(&p, i, offsetof(struct pt_regs, regs[i]), GPR_K1);
UASM_i_SW(&p, GPR_V0, offsetof(struct pt_regs, cp0_status), GPR_K1);
kvm_mips_build_save_scratch(&p, GPR_V1, GPR_K1);
UASM_i_ADDIU(&p, GPR_K1, GPR_A0, offsetof(struct kvm_vcpu, arch));
UASM_i_SW(&p, GPR_SP, offsetof(struct kvm_vcpu_arch, host_stack), GPR_K1);
UASM_i_SW(&p, GPR_GP, offsetof(struct kvm_vcpu_arch, host_gp), GPR_K1);
UASM_i_LW(&p, GPR_K0, offsetof(struct kvm_vcpu_arch, guest_ebase), GPR_K1);
UASM_i_LW(&p, GPR_T0, offsetof(struct kvm_vcpu_arch, pc), GPR_K1);
UASM_i_SW(&p, GPR_K0, offsetof(struct kvm_vcpu_arch, host_pgd), GPR_K1);
(int)offsetof(struct kvm_vcpu, arch), GPR_K1);
GPR_K1);
if (i == GPR_K0 || i == GPR_K1)
UASM_i_LW(&p, i, offsetof(struct kvm_vcpu_arch, gprs[i]), GPR_K1);
UASM_i_LW(&p, GPR_K0, offsetof(struct kvm_vcpu_arch, hi), GPR_K1);
UASM_i_LW(&p, GPR_K0, offsetof(struct kvm_vcpu_arch, lo), GPR_K1);
UASM_i_LW(&p, GPR_K0, offsetof(struct kvm_vcpu_arch, gprs[GPR_K0]), GPR_K1);
UASM_i_LW(&p, GPR_K1, offsetof(struct kvm_vcpu_arch, gprs[GPR_K1]), GPR_K1);
UASM_i_MTC0(&p, GPR_K1, scratch_tmp[0], scratch_tmp[1]);
UASM_i_MFC0(&p, GPR_K1, scratch_vcpu[0], scratch_vcpu[1]);
UASM_i_SW(&p, GPR_K0, offsetof(struct kvm_vcpu, arch.gprs[GPR_K0]), GPR_K1);
UASM_i_MFC0(&p, GPR_K1, C0_PGD);
uasm_i_lddir(&p, GPR_K0, GPR_K1, 3); /* global page dir */
uasm_i_lddir(&p, GPR_K1, GPR_K0, 1); /* middle page dir */
uasm_i_ldpte(&p, GPR_K1, 0); /* even */
uasm_i_ldpte(&p, GPR_K1, 1); /* odd */
build_get_pmde64(&p, &l, &r, GPR_K0, GPR_K1); /* get pmd in GPR_K1 */
build_get_pgde32(&p, GPR_K0, GPR_K1); /* get pgd in GPR_K1 */
build_get_ptep(&p, GPR_K0, GPR_K1);
build_update_entries(&p, GPR_K0, GPR_K1);
UASM_i_MFC0(&p, GPR_K1, scratch_vcpu[0], scratch_vcpu[1]);
UASM_i_LW(&p, GPR_K0, offsetof(struct kvm_vcpu, arch.gprs[GPR_K0]), GPR_K1);
UASM_i_MFC0(&p, GPR_K1, scratch_tmp[0], scratch_tmp[1]);
UASM_i_MTC0(&p, GPR_K1, scratch_tmp[0], scratch_tmp[1]);
UASM_i_MFC0(&p, GPR_K1, scratch_vcpu[0], scratch_vcpu[1]);
UASM_i_ADDIU(&p, GPR_K1, GPR_K1, offsetof(struct kvm_vcpu, arch));
UASM_i_SW(&p, GPR_K0, offsetof(struct kvm_vcpu_arch, gprs[GPR_K0]), GPR_K1);
if (i == GPR_K0 || i == GPR_K1)
UASM_i_SW(&p, i, offsetof(struct kvm_vcpu_arch, gprs[i]), GPR_K1);
UASM_i_SW(&p, GPR_T0, offsetof(struct kvm_vcpu_arch, hi), GPR_K1);
UASM_i_SW(&p, GPR_T0, offsetof(struct kvm_vcpu_arch, lo), GPR_K1);
UASM_i_SW(&p, GPR_T0, offsetof(struct kvm_vcpu_arch, gprs[GPR_K1]), GPR_K1);
UASM_i_SW(&p, GPR_K0, offsetof(struct kvm_vcpu_arch, pc), GPR_K1);
GPR_K1);
uasm_i_sw(&p, GPR_K0, offsetof(struct kvm_vcpu_arch, host_cp0_cause), GPR_K1);
host_cp0_badinstr), GPR_K1);
host_cp0_badinstrp), GPR_K1);
GPR_K1);
GPR_K1);
GPR_K1);
offsetof(struct kvm_vcpu_arch, host_pgd), GPR_K1);
offsetof(struct kvm_vcpu_arch, host_cp0_guestctl0), GPR_K1);
UASM_i_LW(&p, GPR_GP, offsetof(struct kvm_vcpu_arch, host_gp), GPR_K1);
UASM_i_LW(&p, GPR_SP, offsetof(struct kvm_vcpu_arch, host_stack), GPR_K1);
uasm_i_move(&p, GPR_K1, GPR_S0);
UASM_i_ADDIU(&p, GPR_K1, GPR_K1, offsetof(struct kvm_vcpu, arch));
UASM_i_LW(&p, GPR_T0, offsetof(struct kvm_vcpu_arch, guest_ebase), GPR_K1);
UASM_i_LW(&p, GPR_K1, offsetof(struct kvm_vcpu_arch, host_stack), GPR_K1);
UASM_i_ADDIU(&p, GPR_K1, GPR_K1, -(int)sizeof(struct pt_regs));
UASM_i_LW(&p, i, offsetof(struct pt_regs, regs[i]), GPR_K1);
UASM_i_LW(&p, GPR_RA, offsetof(struct pt_regs, regs[GPR_RA]), GPR_K1);
htlb_info = build_fast_tlb_refill_handler(&p, &l, &r, GPR_K0, GPR_K1,
uasm_i_dmfc0(&p, GPR_K1, C0_ENTRYHI);
uasm_i_xor(&p, GPR_K0, GPR_K0, GPR_K1);
uasm_i_dsrl_safe(&p, GPR_K1, GPR_K0, 62);
uasm_i_or(&p, GPR_K0, GPR_K0, GPR_K1);
build_get_pmde64(&p, &l, &r, GPR_K0, GPR_K1); /* get pmd in GPR_K1 */
build_get_pgde32(&p, GPR_K0, GPR_K1); /* get pgd in GPR_K1 */
build_is_huge_pte(&p, &r, GPR_K0, GPR_K1, label_tlb_huge_update);
build_get_ptep(&p, GPR_K0, GPR_K1);
build_update_entries(&p, GPR_K0, GPR_K1);
UASM_i_LW(&p, htlb_info.huge_pte, 0, GPR_K1);
build_huge_update_entries(&p, htlb_info.huge_pte, GPR_K1);
build_get_pgd_vmalloc64(&p, &l, &r, GPR_K0, GPR_K1, vmalloc_mode);
uasm_i_dsrl_safe(&p, GPR_K1, GPR_K0,
uasm_il_beqz(&p, &r, GPR_K1, label_vmalloc);
uasm_i_dmfc0(&p, GPR_K1, C0_PGD);
uasm_i_lddir(&p, GPR_K0, GPR_K1, 3); /* global page dir */
uasm_i_lddir(&p, GPR_K1, GPR_K0, 1); /* middle page dir */
uasm_i_ldpte(&p, GPR_K1, 0); /* even */
uasm_i_ldpte(&p, GPR_K1, 1); /* odd */
UASM_i_LA(&p, GPR_K1, (unsigned long)tlb_do_page_fault_0);
uasm_i_jr(&p, GPR_K1);
build_r3000_tlbchange_handler_head(&p, GPR_K0, GPR_K1);
build_pte_present(&p, &r, GPR_K0, GPR_K1, -1, label_nopage_tlbl);
build_make_valid(&p, &r, GPR_K0, GPR_K1, -1);
build_r3000_tlb_reload_write(&p, &l, &r, GPR_K0, GPR_K1);
build_r3000_tlbchange_handler_head(&p, GPR_K0, GPR_K1);
build_pte_writable(&p, &r, GPR_K0, GPR_K1, -1, label_nopage_tlbs);
build_make_write(&p, &r, GPR_K0, GPR_K1, -1);
build_r3000_tlb_reload_write(&p, &l, &r, GPR_K0, GPR_K1);
build_r3000_tlbchange_handler_head(&p, GPR_K0, GPR_K1);
build_pte_modifiable(&p, &r, GPR_K0, GPR_K1, -1, label_nopage_tlbm);
build_make_write(&p, &r, GPR_K0, GPR_K1, -1);
build_r3000_pte_reload_tlbwi(&p, GPR_K0, GPR_K1);
uasm_i_dmfc0(&p, GPR_K1, C0_ENTRYHI);
uasm_i_xor(&p, GPR_K0, GPR_K0, GPR_K1);
uasm_i_dsrl_safe(&p, GPR_K1, GPR_K0, 62);
uasm_i_or(&p, GPR_K0, GPR_K0, GPR_K1);
r.r2 = GPR_K1;
UASM_i_LA(p, GPR_K1, (long)&handler_reg_save);
UASM_i_ADDU(p, GPR_K0, GPR_K0, GPR_K1);
r.r1 = GPR_K1;
uasm_i_lui(&p, GPR_K1, uasm_rel_hi(pgdc)); /* cp0 delay */
uasm_i_lw(&p, GPR_K1, uasm_rel_lo(pgdc), GPR_K1);
uasm_i_addu(&p, GPR_K1, GPR_K1, GPR_K0);
uasm_i_lw(&p, GPR_K1, 0, GPR_K1); /* cp0 delay */
uasm_i_addu(&p, GPR_K1, GPR_K1, GPR_K0);
uasm_i_lw(&p, GPR_K0, 0, GPR_K1);
uasm_i_mfc0(&p, GPR_K1, C0_EPC); /* cp0 delay */
uasm_i_jr(&p, GPR_K1);