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.