On 05/05/2015 11:57 PM, Peter Crosthwaite wrote: > So I have made a start on this. The ARM, MB and CRIS in this patch > series is rather easy. Its X86 im having trouble with but your example > here looks like most of the work ... > >> Indeed, the flags setup becomes less obscure when, instead of >> >> #ifdef TARGET_I386 >> if (wsize == 2) { >> flags = 1; >> } else if (wsize == 4) { >> flags = 0; >> } else { > > So here the monitor is actually using the argument memory-dump size to > dictate the flags. Is this flawed and should we delete this wsize > if-else and rely on the CPU-state driven logic for correct disas info > selection? This wsize reliance seems unique to x86. I think we would > have to give this up in a QOMified approach.
Hmm. I don't think that I've ever noticed the monitor disassembly could do that. If I were going to do that kind of debugging I certainly wouldn't use the monitor -- I'd use gdb. ;-) If someone thinks we ought to keep that feature, speak now... >> /* as default we use the current CS size */ >> flags = 0; >> if (env) { >> #ifdef TARGET_X86_64 >> if ((env->efer & MSR_EFER_LMA) && >> (env->segs[R_CS].flags & DESC_L_MASK)) > > This uses env->efer and segs to drive the flags... > >> flags = 2; >> else >> #endif >> if (!(env->segs[R_CS].flags & DESC_B_MASK)) >> flags = 1; >> } >> } >> >> in one place and >> >> #if defined(TARGET_I386) >> if (flags == 2) { >> s.info.mach = bfd_mach_x86_64; >> } else if (flags == 1) { >> s.info.mach = bfd_mach_i386_i8086; >> } else { >> s.info.mach = bfd_mach_i386_i386; >> } >> print_insn = print_insn_i386; >> >> in another, we merge the two so that we get >> >> s.info.mach = bfd_mach_i386_i8086; >> if (env->hflags & (1U << HF_CS32_SHIFT)) { > > But your new implementation uses hflags. Are they the same state? I > couldnt find easy correltation between MSR_EFER_LMA and HF_CSXX_SHIFT > (although I do see that map to hflags HF_LMA?). > > Is your code a functional change? It's not intended to be. Since I couldn't find where wsize was initialized, I pulled the tests used by target-i386/translator.c, for dc->code32 and dc->code64, since I knew where to find them right away. ;-) Without going back to the manuals, I don't know the difference between CS64 and LMA; from the code it appears only the behaviour of sysret, which seems surprising. > I went for adding print_insn to disassembly_info and passing just that > to the hook. Patches soon! I might leave X86 out for the first spin. Sounds good. r~