qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] Character order of ATA identity


From: John Snow
Subject: Re: [Qemu-devel] Character order of ATA identity
Date: Fri, 17 Apr 2015 18:45:38 -0400
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.6.0



On 04/16/2015 02:07 PM, 乔天香 wrote:
Hi, all


Hi!

I'm learning operating system and trying to write a little toy kernel.
Before doing disk I/O, I issued the *ATA identify* command to obtain
information about the master device on the primary channel. When I ran
my code with QEMU, I found it gives some ASCII string fields in a wrong
byte order, for example, the model name is given as:

EQUMH RADDSI K

but actually it should be

     QEMU HARDDISK

So I referred to the source code file `hw/ide/core.c` and found a
function doing this:


   61 static void padstr(char *str, const char *src, int len)
   62 {
   63     int i, v;
   64     for(i = 0; i < len; i++) {
   65         if (*src)
   66             v = *src++;
   67         else
   68             v = ' ';
   69         str[i^1] = v;
   70     }
   71 }


And it is called like:

      112     padstr((char *)(p + 27), s->drive_model_str, 40); /* model */

Now I'm wondering why it does this "byte swapping"? I read the ATA
specification about this *ATA identify* command and didn't find anything
related to byte order. Is it required by hardware?

Thanks for your kind help.

The reason is that the ASCII data is, for whatever reason, stored as an array of 2 byte chunks. Any historical reasons for doing so are not known to me, but:

Please check out ATA8 ATA/ATAPI Command Set 3, Revision 1b (or whichever ATA spec you have handy)

Section 3.3.10 "ATA string convention"
'Each pair of bytes in an ATA string is swapped as shown in table 5.'

Why?

It's a mystery to me.

Please don't hesitate to comment on any other oddities you come across within the IDE system.

Thanks,
--js



reply via email to

[Prev in Thread] Current Thread [Next in Thread]