6ebbf39000
allowing support of more than 2 mmu access modes. Add backward compatibility is_user variable in targets code when needed. Implement per target cpu_mmu_index function, avoiding duplicated code and #ifdef TARGET_xxx in softmmu core functions. Implement per target mmu modes definitions. As an example, add PowerPC hypervisor mode definition and Alpha executive and kernel modes definitions. Optimize PowerPC case, precomputing mmu_idx when MSR register changes and using the same definition in code translation code. git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3384 c046a42c-6fe2-441c-8c8c-71466251a162
114 lines
2.3 KiB
C
114 lines
2.3 KiB
C
/* Common softmmu definitions and inline routines. */
|
|
|
|
/* 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
|
|
|
|
#define ACCESS_TYPE 0
|
|
#define MEMSUFFIX MMU_MODE0_SUFFIX
|
|
#define DATA_SIZE 1
|
|
#include "softmmu_header.h"
|
|
|
|
#define DATA_SIZE 2
|
|
#include "softmmu_header.h"
|
|
|
|
#define DATA_SIZE 4
|
|
#include "softmmu_header.h"
|
|
|
|
#define DATA_SIZE 8
|
|
#include "softmmu_header.h"
|
|
#undef ACCESS_TYPE
|
|
#undef MEMSUFFIX
|
|
|
|
#define ACCESS_TYPE 1
|
|
#define MEMSUFFIX MMU_MODE1_SUFFIX
|
|
#define DATA_SIZE 1
|
|
#include "softmmu_header.h"
|
|
|
|
#define DATA_SIZE 2
|
|
#include "softmmu_header.h"
|
|
|
|
#define DATA_SIZE 4
|
|
#include "softmmu_header.h"
|
|
|
|
#define DATA_SIZE 8
|
|
#include "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 "softmmu_header.h"
|
|
|
|
#define DATA_SIZE 2
|
|
#include "softmmu_header.h"
|
|
|
|
#define DATA_SIZE 4
|
|
#include "softmmu_header.h"
|
|
|
|
#define DATA_SIZE 8
|
|
#include "softmmu_header.h"
|
|
#undef ACCESS_TYPE
|
|
#undef MEMSUFFIX
|
|
|
|
#if (NB_MMU_MODES >= 4)
|
|
|
|
#define ACCESS_TYPE 3
|
|
#define MEMSUFFIX MMU_MODE3_SUFFIX
|
|
#define DATA_SIZE 1
|
|
#include "softmmu_header.h"
|
|
|
|
#define DATA_SIZE 2
|
|
#include "softmmu_header.h"
|
|
|
|
#define DATA_SIZE 4
|
|
#include "softmmu_header.h"
|
|
|
|
#define DATA_SIZE 8
|
|
#include "softmmu_header.h"
|
|
#undef ACCESS_TYPE
|
|
#undef MEMSUFFIX
|
|
|
|
#if (NB_MMU_MODES > 4)
|
|
#error "NB_MMU_MODES > 4 is not supported for now"
|
|
#endif /* (NB_MMU_MODES > 4) */
|
|
#endif /* (NB_MMU_MODES == 4) */
|
|
#endif /* (NB_MMU_MODES >= 3) */
|
|
|
|
/* 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 "softmmu_header.h"
|
|
|
|
#define DATA_SIZE 2
|
|
#include "softmmu_header.h"
|
|
|
|
#define DATA_SIZE 4
|
|
#include "softmmu_header.h"
|
|
|
|
#define DATA_SIZE 8
|
|
#include "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)
|