Hi, all

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.

Reply via email to