Peter, could I please ask you a favor. Could you please stop deleting pieces of your and my previous responses when you reply. Please just reply inline. Sometimes I would like to reference my or your previous statement, but I could not find it in your response email. It is very bizzar. Sorry, it will make your response email bigger, but I am very confused otherwise. On 22 January 2014 15:18, Peter Maydell <peter.maydell@xxxxxxxxxx> wrote: > On 22 January 2014 22:47, Victor Kamensky <victor.kamensky@xxxxxxxxxx> wrote: >> You deleted my example, but I need it again: >> Consider the following ARM code snippets: >> >> setend le >> mov r1, #0x04030201 >> str r1, [r0] >> >> and >> >> setend be >> mov r1, #0x01020304 >> str r1, [r0] >> >> Just for LE host case basically you are saying that if guest >> issues 4 bytes store >> instruction for CPU core register and CPSR E bit is off, >> mmio.data[0] would contain LSB of integer from this CPU core >> register. I don't understand your bus endianity thing, but I do >> understand LSB of integer in core CPU register. Do we agree >> that in above example in second case when BE access is >> on (E bit is on), it is the exactly the same memory transaction >> but it data[0] = 0x1 is MSB of integer in CPU core register (still the >> same LE host case)? > > Yes, this is true both if we define mmio.data[] as "always > little endian" and if we define it as "host kernel endianness", > since you've specified an LE host here. OK, we are in agreement here. mmio.data[] = { 0x1, 0x2, 0x3, 0x4} for both types of guest access and host is LE And as far as bus concerned it is absolutely the same transaction. > (The kernel has to byte swap if CPSR.E is set, because > it has to emulate the byte-lane-swap the CPU hardware > does internally before register data goes out to the bus.) > >> Consider above big endian case (setend be) example, >> but now running in BE KVM host. 0x4 is LSB of CPU >> core register in this case. > > Yes. In this case if we are using the "mmio.data is host > kernel endianness" definition then mmio.data[0] should be > 0x01 (the MSB of the 32 bit data value). If mmio.data[0] is 0x1, mmio.data[] = {0x1, 0x2, 0x3, 0x4}, and now KVM host and emulator running in BE mode. But that contradicts to what you said before. In previous email (please see [1]). Here is what your and I just said in few paragraphs before my "Consider above big endian .." above paragraph: ----- start quote ------------------------------------------ >> BTW could you please propose how will you see such >> "32 bit transaction, value 0x04030201, address $whatever". >> on ARM LE CPU in mmio.data? > > That is exactly the problem we're discussing in this thread. > Indeed, I proposed an answer to it, which is that the mmio.data > array should be in host kernel byte order, in which case it > would be (for an LE host kernel) 0x01 in mmio.data[0] and so > on up. > >> If it would be {0x01, 0x02, 0x03, 0x4} it is fine with >> me. That is current case ARM LE case when above >> snippets would be executed by guest. >> >> Would we agree that the same arrangement would be >> true for all other cases on ARM regardless of all other >> endianities of qemu, KVM host, guest, hypervisor, etc? > > No; under my proposal, for a big-endian host kernel (and > thus big-endian QEMU) the order would be > mmio.data[0] = 0x04, etc. (This wouldn't change based > on the guest kernel endianness or whether it happened > to have set the E bit temporarily.) ----- end quote ------------------------------------------ So in one case for the same memory transaction (ARM setend be snippet) executed under BE ARM host KVM you said that "mmio.data[0] should be 0x01 (the MSB of the 32 bit data value)" and before you said "No; under my proposal, for a big-endian host kernel (and thus big-endian QEMU) the order would be mmio.data[0] = 0x04, etc". So which is mmio.data[0]? I argue that for all three code snippets in this email (two for ARM and one for PPC) mmio.data[] = {0x1, 0x2, 0x3, 04}, and that does not depend whether it is LE ARM KVM host, BE ARM KVM host, or BE PPC KVM. > (Notice that the > BE host kernel can actually just behave exactly like the LE > one: byteswap 32 bit value from guest register if guest > CPSR.E is set, then do a 32-bit store of the 32 bit word > into mmio.data[].) > >>> Defining that mmio.data[] is always little-endian would >>> be a valid definition of an API if we were doing it from >>> scratch. It has the unfortunate property that it would >>> completely break the existing PPC BE setups, which >>> don't define it that way, so it is a non-starter. >> >> I believe, but I need to check, that PPC BE setup actually >> acts as the second case in above example If we have PPC >> BE guest executing the following instructions: >> >> lis r1,0x102 >> ori r1,r1,0x304 >> stw r1,0(r0) >> >> after first two instructions r1 would contain 0x01020304. >> IMHO It exactly corresponds to above my ARM second case - >> BE guest when it runs under ARM BE KVM host. I believe >> that mmio.data[] in PPC BE case would be {0x1, 0x2, 0x3, 0x4}. > > Yes, assuming a BE PPC host kernel (which is the usual > arrangement). OK, that confirms my understanding how PPC mmio should work. >> But according to you data[0] must be 0x4 in BE host case > > Er, no. The data here is 0x01020304, so for a BE host > data[0] is the big end, ie 0x1. It would only be 0x4 if > mmio.data[] were LE always (or if you were running > your BE PPC guest on an LE PPC host, which I don't > think is supported currently). So do you agree that for all three code snippets cited in this email, we always will have mmio.data[] = {0x1, 0x2, 0x3, 0x4}, for ARM LE qemu/host, for ARM BE qemu/host and for ppc code snippet in PPC BE qemu/host. I believe it should be this way, because from emulator (i.e qemu) code point of view running on ARM BE qemu/host or PPC BE and emulating the same h/w device, code should not make difference whether it is ARM or PPC. Thanks, Victor [1] https://lists.cs.columbia.edu/pipermail/kvmarm/2014-January/008904.html > thanks > -- PMM -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html