From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:42010) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WMntE-00010C-4x for qemu-devel@nongnu.org; Sun, 09 Mar 2014 20:16:26 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WMnt8-0005Bv-3k for qemu-devel@nongnu.org; Sun, 09 Mar 2014 20:16:20 -0400 Received: from cantor2.suse.de ([195.135.220.15]:42239 helo=mx2.suse.de) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WMnt7-0005Bd-R3 for qemu-devel@nongnu.org; Sun, 09 Mar 2014 20:16:14 -0400 From: =?UTF-8?q?Andreas=20F=C3=A4rber?= Date: Mon, 10 Mar 2014 01:15:26 +0100 Message-Id: <1394410549-13751-18-git-send-email-afaerber@suse.de> In-Reply-To: <1394410549-13751-1-git-send-email-afaerber@suse.de> References: <1394410549-13751-1-git-send-email-afaerber@suse.de> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PATCH qom-cpu v2 17/40] cpu: Move opaque field from CPU_COMMON to CPUState List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Blue Swirl , pbonzini@redhat.com, Riku Voipio , =?UTF-8?q?Andreas=20F=C3=A4rber?= , Peter Maydell Signed-off-by: Andreas F=C3=A4rber --- bsd-user/main.c | 2 +- gdbstub.c | 3 +-- include/exec/cpu-defs.h | 3 --- include/qom/cpu.h | 3 +++ linux-user/elfload.c | 10 ++++++---- linux-user/linuxload.c | 3 +-- linux-user/m68k/target_cpu.h | 4 +++- linux-user/main.c | 6 +++--- linux-user/signal.c | 17 +++++++++++------ linux-user/syscall.c | 30 ++++++++++++++++++------------ linux-user/vm86.c | 27 ++++++++++++++++++--------- target-arm/arm-semi.c | 9 +++++---- target-m68k/m68k-semi.c | 3 ++- 13 files changed, 72 insertions(+), 48 deletions(-) diff --git a/bsd-user/main.c b/bsd-user/main.c index f9246aa..f81ba55 100644 --- a/bsd-user/main.c +++ b/bsd-user/main.c @@ -1000,7 +1000,7 @@ int main(int argc, char **argv) memset(ts, 0, sizeof(TaskState)); init_task_state(ts); ts->info =3D info; - env->opaque =3D ts; + cpu->opaque =3D ts; =20 #if defined(TARGET_I386) cpu_x86_set_cpl(env, 3); diff --git a/gdbstub.c b/gdbstub.c index e8ab0b2..c5ab73f 100644 --- a/gdbstub.c +++ b/gdbstub.c @@ -1086,8 +1086,7 @@ static int gdb_handle_packet(GDBState *s, const cha= r *line_buf) } #ifdef CONFIG_USER_ONLY else if (strncmp(p, "Offsets", 7) =3D=3D 0) { - CPUArchState *env =3D s->c_cpu->env_ptr; - TaskState *ts =3D env->opaque; + TaskState *ts =3D s->c_cpu->opaque; =20 snprintf(buf, sizeof(buf), "Text=3D" TARGET_ABI_FMT_lx ";Data=3D" TARGET_ABI_F= MT_lx diff --git a/include/exec/cpu-defs.h b/include/exec/cpu-defs.h index 512f2ed..be9569c 100644 --- a/include/exec/cpu-defs.h +++ b/include/exec/cpu-defs.h @@ -137,8 +137,5 @@ typedef struct CPUWatchpoint { = \ QTAILQ_HEAD(watchpoints_head, CPUWatchpoint) watchpoints; = \ CPUWatchpoint *watchpoint_hit; = \ - = \ - /* user data */ = \ - void *opaque; = \ =20 #endif diff --git a/include/qom/cpu.h b/include/qom/cpu.h index a385b9f..4d1ea35 100644 --- a/include/qom/cpu.h +++ b/include/qom/cpu.h @@ -184,6 +184,7 @@ struct kvm_run; * @gdb_num_regs: Number of total registers accessible to GDB. * @gdb_num_g_regs: Number of registers in GDB 'g' packets. * @next_cpu: Next CPU sharing TB cache. + * @opaque: User data. * @mem_io_pc: Host Program Counter at which the memory was accessed. * @mem_io_vaddr: Target virtual address at which the memory was accesse= d. * @kvm_fd: vCPU file descriptor for KVM. @@ -230,6 +231,8 @@ struct CPUState { int gdb_num_g_regs; QTAILQ_ENTRY(CPUState) node; =20 + void *opaque; + /* In order to avoid passing too many arguments to the MMIO helpers, * we store some rarely used information in the CPU context. */ diff --git a/linux-user/elfload.c b/linux-user/elfload.c index c0687e3..6bc7999 100644 --- a/linux-user/elfload.c +++ b/linux-user/elfload.c @@ -2621,7 +2621,8 @@ static int write_note(struct memelfnote *men, int f= d) =20 static void fill_thread_info(struct elf_note_info *info, const CPUArchSt= ate *env) { - TaskState *ts =3D (TaskState *)env->opaque; + CPUState *cpu =3D ENV_GET_CPU((CPUArchState *)env); + TaskState *ts =3D (TaskState *)cpu->opaque; struct elf_thread_status *ets; =20 ets =3D g_malloc0(sizeof (*ets)); @@ -2650,8 +2651,8 @@ static int fill_note_info(struct elf_note_info *inf= o, long signr, const CPUArchState *env) { #define NUMNOTES 3 - CPUState *cpu =3D NULL; - TaskState *ts =3D (TaskState *)env->opaque; + CPUState *cpu =3D ENV_GET_CPU((CPUArchState *)env); + TaskState *ts =3D (TaskState *)cpu->opaque; int i; =20 info->notes =3D g_malloc0(NUMNOTES * sizeof (struct memelfnote)); @@ -2775,7 +2776,8 @@ static int write_note_info(struct elf_note_info *in= fo, int fd) */ static int elf_core_dump(int signr, const CPUArchState *env) { - const TaskState *ts =3D (const TaskState *)env->opaque; + const CPUState *cpu =3D ENV_GET_CPU((CPUArchState *)env); + const TaskState *ts =3D (const TaskState *)cpu->opaque; struct vm_area_struct *vma =3D NULL; char corefile[PATH_MAX]; struct elf_note_info info; diff --git a/linux-user/linuxload.c b/linux-user/linuxload.c index f2997c2..506e837 100644 --- a/linux-user/linuxload.c +++ b/linux-user/linuxload.c @@ -89,8 +89,7 @@ static int prepare_binprm(struct linux_binprm *bprm) abi_ulong loader_build_argptr(int envc, int argc, abi_ulong sp, abi_ulong stringp, int push_ptr) { - CPUArchState *env =3D thread_cpu->env_ptr; - TaskState *ts =3D (TaskState *)env->opaque; + TaskState *ts =3D (TaskState *)thread_cpu->opaque; int n =3D sizeof(abi_ulong); abi_ulong envp; abi_ulong argv; diff --git a/linux-user/m68k/target_cpu.h b/linux-user/m68k/target_cpu.h index cad9c90..bb4d3fa 100644 --- a/linux-user/m68k/target_cpu.h +++ b/linux-user/m68k/target_cpu.h @@ -31,7 +31,9 @@ static inline void cpu_clone_regs(CPUM68KState *env, ta= rget_ulong newsp) =20 static inline void cpu_set_tls(CPUM68KState *env, target_ulong newtls) { - TaskState *ts =3D env->opaque; + CPUState *cs =3D CPU(m68k_env_get_cpu(env)); + TaskState *ts =3D cs->opaque; + ts->tp_value =3D newtls; } =20 diff --git a/linux-user/main.c b/linux-user/main.c index be9491b..99220b3 100644 --- a/linux-user/main.c +++ b/linux-user/main.c @@ -685,7 +685,7 @@ void cpu_loop(CPUARMState *env) switch(trapnr) { case EXCP_UDEF: { - TaskState *ts =3D env->opaque; + TaskState *ts =3D cs->opaque; uint32_t opcode; int rc; =20 @@ -2961,7 +2961,7 @@ void cpu_loop(CPUM68KState *env) int trapnr; unsigned int n; target_siginfo_t info; - TaskState *ts =3D env->opaque; + TaskState *ts =3D cs->opaque; =20 for(;;) { trapnr =3D cpu_m68k_exec(env); @@ -3997,7 +3997,7 @@ int main(int argc, char **argv, char **envp) /* build Task State */ ts->info =3D info; ts->bprm =3D &bprm; - env->opaque =3D ts; + cpu->opaque =3D ts; task_settid(ts); =20 execfd =3D qemu_getauxval(AT_EXECFD); diff --git a/linux-user/signal.c b/linux-user/signal.c index 384bac8..fb70af7 100644 --- a/linux-user/signal.c +++ b/linux-user/signal.c @@ -370,7 +370,8 @@ void signal_init(void) =20 static inline struct sigqueue *alloc_sigqueue(CPUArchState *env) { - TaskState *ts =3D env->opaque; + CPUState *cpu =3D ENV_GET_CPU(env); + TaskState *ts =3D cpu->opaque; struct sigqueue *q =3D ts->first_free; if (!q) return NULL; @@ -380,7 +381,9 @@ static inline struct sigqueue *alloc_sigqueue(CPUArch= State *env) =20 static inline void free_sigqueue(CPUArchState *env, struct sigqueue *q) { - TaskState *ts =3D env->opaque; + CPUState *cpu =3D ENV_GET_CPU(env); + TaskState *ts =3D cpu->opaque; + q->next =3D ts->first_free; ts->first_free =3D q; } @@ -388,8 +391,9 @@ static inline void free_sigqueue(CPUArchState *env, s= truct sigqueue *q) /* abort execution with signal */ static void QEMU_NORETURN force_sig(int target_sig) { - CPUArchState *env =3D thread_cpu->env_ptr; - TaskState *ts =3D (TaskState *)env->opaque; + CPUState *cpu =3D thread_cpu; + CPUArchState *env =3D cpu->env_ptr; + TaskState *ts =3D (TaskState *)cpu->opaque; int host_sig, core_dumped =3D 0; struct sigaction act; host_sig =3D target_to_host_signal(target_sig); @@ -440,7 +444,8 @@ static void QEMU_NORETURN force_sig(int target_sig) as possible */ int queue_signal(CPUArchState *env, int sig, target_siginfo_t *info) { - TaskState *ts =3D env->opaque; + CPUState *cpu =3D ENV_GET_CPU(env); + TaskState *ts =3D cpu->opaque; struct emulated_sigtable *k; struct sigqueue *q, **pq; abi_ulong handler; @@ -5666,7 +5671,7 @@ void process_pending_signals(CPUArchState *cpu_env) struct emulated_sigtable *k; struct target_sigaction *sa; struct sigqueue *q; - TaskState *ts =3D cpu_env->opaque; + TaskState *ts =3D cpu->opaque; =20 if (!ts->signal_pending) return; diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 1407b7a..11087ea 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -4185,7 +4185,7 @@ static void *clone_func(void *arg) env =3D info->env; cpu =3D ENV_GET_CPU(env); thread_cpu =3D cpu; - ts =3D (TaskState *)env->opaque; + ts =3D (TaskState *)cpu->opaque; info->tid =3D gettid(); cpu->host_tid =3D info->tid; task_settid(ts); @@ -4213,8 +4213,10 @@ static int do_fork(CPUArchState *env, unsigned int= flags, abi_ulong newsp, abi_ulong parent_tidptr, target_ulong newtls, abi_ulong child_tidptr) { + CPUState *cpu =3D ENV_GET_CPU(env); int ret; TaskState *ts; + CPUState *new_cpu; CPUArchState *new_env; unsigned int nptl_flags; sigset_t sigmask; @@ -4224,7 +4226,7 @@ static int do_fork(CPUArchState *env, unsigned int = flags, abi_ulong newsp, flags &=3D ~(CLONE_VFORK | CLONE_VM); =20 if (flags & CLONE_VM) { - TaskState *parent_ts =3D (TaskState *)env->opaque; + TaskState *parent_ts =3D (TaskState *)cpu->opaque; new_thread_info info; pthread_attr_t attr; =20 @@ -4234,7 +4236,8 @@ static int do_fork(CPUArchState *env, unsigned int = flags, abi_ulong newsp, new_env =3D cpu_copy(env); /* Init regs that differ from the parent. */ cpu_clone_regs(new_env, newsp); - new_env->opaque =3D ts; + new_cpu =3D ENV_GET_CPU(new_env); + new_cpu->opaque =3D ts; ts->bprm =3D parent_ts->bprm; ts->info =3D parent_ts->info; nptl_flags =3D flags; @@ -4306,7 +4309,7 @@ static int do_fork(CPUArchState *env, unsigned int = flags, abi_ulong newsp, put_user_u32(gettid(), child_tidptr); if (flags & CLONE_PARENT_SETTID) put_user_u32(gettid(), parent_tidptr); - ts =3D (TaskState *)env->opaque; + ts =3D (TaskState *)cpu->opaque; if (flags & CLONE_SETTLS) cpu_set_tls (env, newtls); if (flags & CLONE_CHILD_CLEARTID) @@ -4910,7 +4913,8 @@ void init_qemu_uname_release(void) static int open_self_maps(void *cpu_env, int fd) { #if defined(TARGET_ARM) || defined(TARGET_M68K) || defined(TARGET_UNICOR= E32) - TaskState *ts =3D ((CPUArchState *)cpu_env)->opaque; + CPUState *cpu =3D ENV_GET_CPU((CPUArchState *)cpu_env); + TaskState *ts =3D cpu->opaque; #endif FILE *fp; char *line =3D NULL; @@ -4962,7 +4966,8 @@ static int open_self_maps(void *cpu_env, int fd) =20 static int open_self_stat(void *cpu_env, int fd) { - TaskState *ts =3D ((CPUArchState *)cpu_env)->opaque; + CPUState *cpu =3D ENV_GET_CPU((CPUArchState *)cpu_env); + TaskState *ts =3D cpu->opaque; abi_ulong start_stack =3D ts->info->start_stack; int i; =20 @@ -4998,7 +5003,8 @@ static int open_self_stat(void *cpu_env, int fd) =20 static int open_self_auxv(void *cpu_env, int fd) { - TaskState *ts =3D ((CPUArchState *)cpu_env)->opaque; + CPUState *cpu =3D ENV_GET_CPU((CPUArchState *)cpu_env); + TaskState *ts =3D cpu->opaque; abi_ulong auxv =3D ts->info->saved_auxv; abi_ulong len =3D ts->info->auxv_len; char *ptr; @@ -5180,14 +5186,14 @@ abi_long do_syscall(void *cpu_env, int num, abi_l= ong arg1, /* Remove the CPU from the list. */ QTAILQ_REMOVE(&cpus, cpu, node); cpu_list_unlock(); - ts =3D ((CPUArchState *)cpu_env)->opaque; + ts =3D cpu->opaque; if (ts->child_tidptr) { put_user_u32(0, ts->child_tidptr); sys_futex(g2h(ts->child_tidptr), FUTEX_WAKE, INT_MAX, NULL, NULL, 0); } thread_cpu =3D NULL; - object_unref(OBJECT(ENV_GET_CPU(cpu_env))); + object_unref(OBJECT(cpu)); g_free(ts); pthread_exit(NULL); } @@ -6485,7 +6491,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_lon= g arg1, break; case TARGET_NR_mprotect: { - TaskState *ts =3D ((CPUArchState *)cpu_env)->opaque; + TaskState *ts =3D cpu->opaque; /* Special hack to detect libc making the stack executable. = */ if ((arg3 & PROT_GROWSDOWN) && arg1 >=3D ts->info->stack_limit @@ -8569,7 +8575,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_lon= g arg1, break; #elif defined(TARGET_M68K) { - TaskState *ts =3D ((CPUArchState *)cpu_env)->opaque; + TaskState *ts =3D cpu->opaque; ts->tp_value =3D arg1; ret =3D 0; break; @@ -8585,7 +8591,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_lon= g arg1, break; #elif defined(TARGET_M68K) { - TaskState *ts =3D ((CPUArchState *)cpu_env)->opaque; + TaskState *ts =3D cpu->opaque; ret =3D ts->tp_value; break; } diff --git a/linux-user/vm86.c b/linux-user/vm86.c index 2c4ffeb..45ef559 100644 --- a/linux-user/vm86.c +++ b/linux-user/vm86.c @@ -72,7 +72,8 @@ static inline unsigned int vm_getl(uint32_t segptr, uns= igned int reg16) =20 void save_v86_state(CPUX86State *env) { - TaskState *ts =3D env->opaque; + CPUState *cs =3D CPU(x86_env_get_cpu(env)); + TaskState *ts =3D cs->opaque; struct target_vm86plus_struct * target_v86; =20 if (!lock_user_struct(VERIFY_WRITE, target_v86, ts->target_v86, 0)) @@ -131,7 +132,8 @@ static inline void return_to_32bit(CPUX86State *env, = int retval) =20 static inline int set_IF(CPUX86State *env) { - TaskState *ts =3D env->opaque; + CPUState *cs =3D CPU(x86_env_get_cpu(env)); + TaskState *ts =3D cs->opaque; =20 ts->v86flags |=3D VIF_MASK; if (ts->v86flags & VIP_MASK) { @@ -143,7 +145,8 @@ static inline int set_IF(CPUX86State *env) =20 static inline void clear_IF(CPUX86State *env) { - TaskState *ts =3D env->opaque; + CPUState *cs =3D CPU(x86_env_get_cpu(env)); + TaskState *ts =3D cs->opaque; =20 ts->v86flags &=3D ~VIF_MASK; } @@ -160,7 +163,8 @@ static inline void clear_AC(CPUX86State *env) =20 static inline int set_vflags_long(unsigned long eflags, CPUX86State *env= ) { - TaskState *ts =3D env->opaque; + CPUState *cs =3D CPU(x86_env_get_cpu(env)); + TaskState *ts =3D cs->opaque; =20 set_flags(ts->v86flags, eflags, ts->v86mask); set_flags(env->eflags, eflags, SAFE_MASK); @@ -173,7 +177,8 @@ static inline int set_vflags_long(unsigned long eflag= s, CPUX86State *env) =20 static inline int set_vflags_short(unsigned short flags, CPUX86State *en= v) { - TaskState *ts =3D env->opaque; + CPUState *cs =3D CPU(x86_env_get_cpu(env)); + TaskState *ts =3D cs->opaque; =20 set_flags(ts->v86flags, flags, ts->v86mask & 0xffff); set_flags(env->eflags, flags, SAFE_MASK); @@ -186,7 +191,8 @@ static inline int set_vflags_short(unsigned short fla= gs, CPUX86State *env) =20 static inline unsigned int get_vflags(CPUX86State *env) { - TaskState *ts =3D env->opaque; + CPUState *cs =3D CPU(x86_env_get_cpu(env)); + TaskState *ts =3D cs->opaque; unsigned int flags; =20 flags =3D env->eflags & RETURN_MASK; @@ -202,7 +208,8 @@ static inline unsigned int get_vflags(CPUX86State *en= v) support TSS interrupt revectoring, so this code is always executed) *= / static void do_int(CPUX86State *env, int intno) { - TaskState *ts =3D env->opaque; + CPUState *cs =3D CPU(x86_env_get_cpu(env)); + TaskState *ts =3D cs->opaque; uint32_t int_addr, segoffs, ssp; unsigned int sp; =20 @@ -260,7 +267,8 @@ void handle_vm86_trap(CPUX86State *env, int trapno) =20 void handle_vm86_fault(CPUX86State *env) { - TaskState *ts =3D env->opaque; + CPUState *cs =3D CPU(x86_env_get_cpu(env)); + TaskState *ts =3D cs->opaque; uint32_t csp, ssp; unsigned int ip, sp, newflags, newip, newcs, opcode, intno; int data32, pref_done; @@ -384,7 +392,8 @@ void handle_vm86_fault(CPUX86State *env) =20 int do_vm86(CPUX86State *env, long subfunction, abi_ulong vm86_addr) { - TaskState *ts =3D env->opaque; + CPUState *cs =3D CPU(x86_env_get_cpu(env)); + TaskState *ts =3D cs->opaque; struct target_vm86plus_struct * target_v86; int ret; =20 diff --git a/target-arm/arm-semi.c b/target-arm/arm-semi.c index ee469c4..ebb5235 100644 --- a/target-arm/arm-semi.c +++ b/target-arm/arm-semi.c @@ -127,7 +127,7 @@ static void arm_semi_cb(CPUState *cs, target_ulong re= t, target_ulong err) ARMCPU *cpu =3D ARM_CPU(cs); CPUARMState *env =3D &cpu->env; #ifdef CONFIG_USER_ONLY - TaskState *ts =3D env->opaque; + TaskState *ts =3D cs->opaque; #endif =20 if (ret =3D=3D (target_ulong)-1) { @@ -164,7 +164,7 @@ static void arm_semi_flen_cb(CPUState *cs, target_ulo= ng ret, target_ulong err) cpu_memory_rw_debug(cs, env->regs[13]-64+32, (uint8_t *)&size, 4, 0)= ; env->regs[0] =3D be32_to_cpu(size); #ifdef CONFIG_USER_ONLY - ((TaskState *)env->opaque)->swi_errno =3D err; + ((TaskState *)cs->opaque)->swi_errno =3D err; #else syscall_err =3D err; #endif @@ -183,6 +183,7 @@ static void arm_semi_flen_cb(CPUState *cs, target_ulo= ng ret, target_ulong err) uint32_t do_arm_semihosting(CPUARMState *env) { ARMCPU *cpu =3D arm_env_get_cpu(env); + CPUState *cs =3D CPU(cpu); target_ulong args; target_ulong arg0, arg1, arg2, arg3; char * s; @@ -190,7 +191,7 @@ uint32_t do_arm_semihosting(CPUARMState *env) uint32_t ret; uint32_t len; #ifdef CONFIG_USER_ONLY - TaskState *ts =3D env->opaque; + TaskState *ts =3D cs->opaque; #else CPUARMState *ts =3D env; #endif @@ -554,7 +555,7 @@ uint32_t do_arm_semihosting(CPUARMState *env) exit(0); default: fprintf(stderr, "qemu: Unsupported SemiHosting SWI 0x%02x\n", nr= ); - cpu_dump_state(CPU(cpu), stderr, fprintf, 0); + cpu_dump_state(cs, stderr, fprintf, 0); abort(); } } diff --git a/target-m68k/m68k-semi.c b/target-m68k/m68k-semi.c index 94c4983..2dea3ca 100644 --- a/target-m68k/m68k-semi.c +++ b/target-m68k/m68k-semi.c @@ -428,7 +428,8 @@ void do_m68k_semihosting(CPUM68KState *env, int nr) case HOSTED_INIT_SIM: #if defined(CONFIG_USER_ONLY) { - TaskState *ts =3D env->opaque; + CPUState *cs =3D CPU(m68k_env_get_cpu(env)); + TaskState *ts =3D cs->opaque; /* Allocate the heap using sbrk. */ if (!ts->heap_limit) { abi_ulong ret; --=20 1.8.4.5