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