単にプリプロセッサで切り替えているだけだった。
exec.c の一番最後。
#if !defined(CONFIG_USER_ONLY)#define MMUSUFFIX _cmmu#define GETPC() NULL#define env cpu_single_env#define SOFTMMU_CODE_ACCESS#define SHIFT 0#include "softmmu_template.h"#define SHIFT 1#include "softmmu_template.h"#define SHIFT 2#include "softmmu_template.h"#define SHIFT 3#include "softmmu_template.h"#undef env#endif
softmmu_template.h
要するに、0 が byte (uint8_t)、1 が word (uint16_t)、2 が long (uint32_t)、3 が quad word (uint64_t) ということらしい。#define DATA_SIZE (1 <<>#if DATA_SIZE == 8#define SUFFIX q#define USUFFIX q#define DATA_TYPE uint64_t#elif DATA_SIZE == 4#define SUFFIX l#define USUFFIX l#define DATA_TYPE uint32_t#elif DATA_SIZE == 2#define SUFFIX w#define USUFFIX uw#define DATA_TYPE uint16_t#elif DATA_SIZE == 1#define SUFFIX b#define USUFFIX ub#define DATA_TYPE uint8_t#else#error unsupported data size#endif
#if SHIFT <= 2io_mem_write[index][SHIFT](io_mem_opaque[index], physaddr, val);
みたいになっていて、0-1 (byte,word,long) それぞれのハンドラがコールされる。なるほど。
quad word の場合は、エンディアンに合わせて long (io_mem*[2]) のハンドラを 2 回コール。
0 件のコメント:
コメントを投稿