|
|
1.1 root 1: #include <assert.h> 1.1.1.2 ! root 2: #include "cpu.h" ! 3: #include "dyngen-exec.h" 1.1 root 4: #include "helper.h" 5: #include "host-utils.h" 6: 7: #include "hw/lm32_pic.h" 8: #include "hw/lm32_juart.h" 9: 10: #if !defined(CONFIG_USER_ONLY) 11: #define MMUSUFFIX _mmu 12: #define SHIFT 0 13: #include "softmmu_template.h" 14: #define SHIFT 1 15: #include "softmmu_template.h" 16: #define SHIFT 2 17: #include "softmmu_template.h" 18: #define SHIFT 3 19: #include "softmmu_template.h" 20: 21: void helper_raise_exception(uint32_t index) 22: { 23: env->exception_index = index; 24: cpu_loop_exit(env); 25: } 26: 27: void helper_hlt(void) 28: { 29: env->halted = 1; 30: env->exception_index = EXCP_HLT; 31: cpu_loop_exit(env); 32: } 33: 34: void helper_wcsr_im(uint32_t im) 35: { 36: lm32_pic_set_im(env->pic_state, im); 37: } 38: 39: void helper_wcsr_ip(uint32_t im) 40: { 41: lm32_pic_set_ip(env->pic_state, im); 42: } 43: 44: void helper_wcsr_jtx(uint32_t jtx) 45: { 46: lm32_juart_set_jtx(env->juart_state, jtx); 47: } 48: 49: void helper_wcsr_jrx(uint32_t jrx) 50: { 51: lm32_juart_set_jrx(env->juart_state, jrx); 52: } 53: 54: uint32_t helper_rcsr_im(void) 55: { 56: return lm32_pic_get_im(env->pic_state); 57: } 58: 59: uint32_t helper_rcsr_ip(void) 60: { 61: return lm32_pic_get_ip(env->pic_state); 62: } 63: 64: uint32_t helper_rcsr_jtx(void) 65: { 66: return lm32_juart_get_jtx(env->juart_state); 67: } 68: 69: uint32_t helper_rcsr_jrx(void) 70: { 71: return lm32_juart_get_jrx(env->juart_state); 72: } 73: 74: /* Try to fill the TLB and return an exception if error. If retaddr is 75: NULL, it means that the function was called in C code (i.e. not 76: from generated code or from helper.c) */ 77: /* XXX: fix it to restore all registers */ 1.1.1.2 ! root 78: void tlb_fill(CPUState *env1, target_ulong addr, int is_write, int mmu_idx, ! 79: void *retaddr) 1.1 root 80: { 81: TranslationBlock *tb; 82: CPUState *saved_env; 83: unsigned long pc; 84: int ret; 85: 86: saved_env = env; 1.1.1.2 ! root 87: env = env1; 1.1 root 88: 1.1.1.2 ! root 89: ret = cpu_lm32_handle_mmu_fault(env, addr, is_write, mmu_idx); 1.1 root 90: if (unlikely(ret)) { 91: if (retaddr) { 92: /* now we have a real cpu fault */ 93: pc = (unsigned long)retaddr; 94: tb = tb_find_pc(pc); 95: if (tb) { 96: /* the PC is inside the translated code. It means that we have 97: a virtual CPU fault */ 98: cpu_restore_state(tb, env, pc); 99: } 100: } 101: cpu_loop_exit(env); 102: } 103: env = saved_env; 104: } 105: #endif 106:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.