File:  [Qemu by Fabrice Bellard] / qemu / target-lm32 / op_helper.c
Revision 1.1.1.3 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 19:52:16 2018 UTC (3 years, 7 months ago) by root
Branches: qemu, MAIN
CVS tags: qemu1101, HEAD
qemu 1.1.1

    1: #include <assert.h>
    2: #include "cpu.h"
    3: #include "dyngen-exec.h"
    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 */
   78: void tlb_fill(CPULM32State *env1, target_ulong addr, int is_write, int mmu_idx,
   79:               uintptr_t retaddr)
   80: {
   81:     TranslationBlock *tb;
   82:     CPULM32State *saved_env;
   83:     int ret;
   84: 
   85:     saved_env = env;
   86:     env = env1;
   87: 
   88:     ret = cpu_lm32_handle_mmu_fault(env, addr, is_write, mmu_idx);
   89:     if (unlikely(ret)) {
   90:         if (retaddr) {
   91:             /* now we have a real cpu fault */
   92:             tb = tb_find_pc(retaddr);
   93:             if (tb) {
   94:                 /* the PC is inside the translated code. It means that we have
   95:                    a virtual CPU fault */
   96:                 cpu_restore_state(tb, env, retaddr);
   97:             }
   98:         }
   99:         cpu_loop_exit(env);
  100:     }
  101:     env = saved_env;
  102: }
  103: #endif
  104: 

unix.superglobalmegacorp.com