| /* |
| * Software MMU support |
| * |
| * Generate inline load/store functions for all MMU modes (typically |
| * at least _user and _kernel) as well as _data versions, for all data |
| * sizes. |
| * |
| * Used by target op helpers. |
| * |
| * MMU mode suffixes are defined in target cpu.h. |
| */ |
| |
| /* XXX: find something cleaner. |
| * Furthermore, this is false for 64 bits targets |
| */ |
| #define ldul_user ldl_user |
| #define ldul_kernel ldl_kernel |
| #define ldul_hypv ldl_hypv |
| #define ldul_executive ldl_executive |
| #define ldul_supervisor ldl_supervisor |
| |
| /* The memory helpers for tcg-generated code need tcg_target_long etc. */ |
| #include "tcg.h" |
| |
| #define ACCESS_TYPE 0 |
| #define MEMSUFFIX MMU_MODE0_SUFFIX |
| #define DATA_SIZE 1 |
| #include "exec/softmmu_header.h" |
| |
| #define DATA_SIZE 2 |
| #include "exec/softmmu_header.h" |
| |
| #define DATA_SIZE 4 |
| #include "exec/softmmu_header.h" |
| |
| #define DATA_SIZE 8 |
| #include "exec/softmmu_header.h" |
| #undef ACCESS_TYPE |
| #undef MEMSUFFIX |
| |
| #define ACCESS_TYPE 1 |
| #define MEMSUFFIX MMU_MODE1_SUFFIX |
| #define DATA_SIZE 1 |
| #include "exec/softmmu_header.h" |
| |
| #define DATA_SIZE 2 |
| #include "exec/softmmu_header.h" |
| |
| #define DATA_SIZE 4 |
| #include "exec/softmmu_header.h" |
| |
| #define DATA_SIZE 8 |
| #include "exec/softmmu_header.h" |
| #undef ACCESS_TYPE |
| #undef MEMSUFFIX |
| |
| #if (NB_MMU_MODES >= 3) |
| |
| #define ACCESS_TYPE 2 |
| #define MEMSUFFIX MMU_MODE2_SUFFIX |
| #define DATA_SIZE 1 |
| #include "exec/softmmu_header.h" |
| |
| #define DATA_SIZE 2 |
| #include "exec/softmmu_header.h" |
| |
| #define DATA_SIZE 4 |
| #include "exec/softmmu_header.h" |
| |
| #define DATA_SIZE 8 |
| #include "exec/softmmu_header.h" |
| #undef ACCESS_TYPE |
| #undef MEMSUFFIX |
| #endif /* (NB_MMU_MODES >= 3) */ |
| |
| #if (NB_MMU_MODES >= 4) |
| |
| #define ACCESS_TYPE 3 |
| #define MEMSUFFIX MMU_MODE3_SUFFIX |
| #define DATA_SIZE 1 |
| #include "exec/softmmu_header.h" |
| |
| #define DATA_SIZE 2 |
| #include "exec/softmmu_header.h" |
| |
| #define DATA_SIZE 4 |
| #include "exec/softmmu_header.h" |
| |
| #define DATA_SIZE 8 |
| #include "exec/softmmu_header.h" |
| #undef ACCESS_TYPE |
| #undef MEMSUFFIX |
| #endif /* (NB_MMU_MODES >= 4) */ |
| |
| #if (NB_MMU_MODES >= 5) |
| |
| #define ACCESS_TYPE 4 |
| #define MEMSUFFIX MMU_MODE4_SUFFIX |
| #define DATA_SIZE 1 |
| #include "exec/softmmu_header.h" |
| |
| #define DATA_SIZE 2 |
| #include "exec/softmmu_header.h" |
| |
| #define DATA_SIZE 4 |
| #include "exec/softmmu_header.h" |
| |
| #define DATA_SIZE 8 |
| #include "exec/softmmu_header.h" |
| #undef ACCESS_TYPE |
| #undef MEMSUFFIX |
| #endif /* (NB_MMU_MODES >= 5) */ |
| |
| #if (NB_MMU_MODES >= 6) |
| |
| #define ACCESS_TYPE 5 |
| #define MEMSUFFIX MMU_MODE5_SUFFIX |
| #define DATA_SIZE 1 |
| #include "exec/softmmu_header.h" |
| |
| #define DATA_SIZE 2 |
| #include "exec/softmmu_header.h" |
| |
| #define DATA_SIZE 4 |
| #include "exec/softmmu_header.h" |
| |
| #define DATA_SIZE 8 |
| #include "exec/softmmu_header.h" |
| #undef ACCESS_TYPE |
| #undef MEMSUFFIX |
| #endif /* (NB_MMU_MODES >= 6) */ |
| |
| #if (NB_MMU_MODES > 6) |
| #error "NB_MMU_MODES > 6 is not supported for now" |
| #endif /* (NB_MMU_MODES > 6) */ |
| |
| /* these access are slower, they must be as rare as possible */ |
| #define ACCESS_TYPE (NB_MMU_MODES) |
| #define MEMSUFFIX _data |
| #define DATA_SIZE 1 |
| #include "exec/softmmu_header.h" |
| |
| #define DATA_SIZE 2 |
| #include "exec/softmmu_header.h" |
| |
| #define DATA_SIZE 4 |
| #include "exec/softmmu_header.h" |
| |
| #define DATA_SIZE 8 |
| #include "exec/softmmu_header.h" |
| #undef ACCESS_TYPE |
| #undef MEMSUFFIX |
| |
| #define ldub(p) ldub_data(p) |
| #define ldsb(p) ldsb_data(p) |
| #define lduw(p) lduw_data(p) |
| #define ldsw(p) ldsw_data(p) |
| #define ldl(p) ldl_data(p) |
| #define ldq(p) ldq_data(p) |
| |
| #define stb(p, v) stb_data(p, v) |
| #define stw(p, v) stw_data(p, v) |
| #define stl(p, v) stl_data(p, v) |
| #define stq(p, v) stq_data(p, v) |