qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH 2/2] fdc-test: Check RELATIVE SEEK beyond track


From: Blue Swirl
Subject: Re: [Qemu-devel] [PATCH 2/2] fdc-test: Check RELATIVE SEEK beyond track 0/80
Date: Mon, 23 Jul 2012 17:09:21 +0000

On Tue, Jul 17, 2012 at 9:03 AM, Pavel Hrdina <address@hidden> wrote:
> On 07/16/2012 04:36 PM, Kevin Wolf wrote:
>>
>> TODO This needs to be checked against a real drive
>>
>> Signed-off-by: Kevin Wolf<address@hidden>
>> ---
>>   tests/fdc-test.c |   48 +++++++++++++++++++++++++++++++++++++-----------
>>   1 files changed, 37 insertions(+), 11 deletions(-)
>>
>> diff --git a/tests/fdc-test.c b/tests/fdc-test.c
>> index fa74411..56e745a 100644
>> --- a/tests/fdc-test.c
>> +++ b/tests/fdc-test.c
>> @@ -94,13 +94,17 @@ static uint8_t floppy_recv(void)
>>   }
>>     /* pcn: Present Cylinder Number */
>> -static void ack_irq(uint8_t *pcn)
>> +static void ack_irq(uint8_t *st0, uint8_t *pcn)
>>   {
>>       uint8_t ret;
>>         g_assert(get_irq(FLOPPY_IRQ));
>>       floppy_send(CMD_SENSE_INT);
>> -    floppy_recv();
>> +
>> +    ret = floppy_recv();
>> +    if (st0 != NULL) {
>> +        *st0 = ret;
>> +    }
>>         ret = floppy_recv();
>>       if (pcn != NULL) {
>> @@ -175,7 +179,7 @@ static void send_seek(int cyl)
>>       floppy_send(head << 2 | drive);
>>       g_assert(!get_irq(FLOPPY_IRQ));
>>       floppy_send(cyl);
>> -    ack_irq(NULL);
>> +    ack_irq(NULL, NULL);
>>   }
>>     static uint8_t cmos_read(uint8_t reg)
>> @@ -295,29 +299,51 @@ static void test_relative_seek(void)
>>   {
>>       uint8_t drive = 0;
>>       uint8_t head = 0;
>> -    uint8_t cyl = 1;
>>       uint8_t pcn;
>> +    uint8_t st0;
>>         /* Send seek to track 0 */
>>       send_seek(0);
>>   -    /* Send relative seek to increase track by 1 */
>> +    /* Send relative seek to increase track by 3 */
>>       floppy_send(CMD_RELATIVE_SEEK_IN);
>>       floppy_send(head << 2 | drive);
>>       g_assert(!get_irq(FLOPPY_IRQ));
>> -    floppy_send(cyl);
>> +    floppy_send(3);
>>   -    ack_irq(&pcn);
>> -    g_assert(pcn == 1);
>> +    ack_irq(&st0, &pcn);
>> +    g_assert_cmpint(pcn, ==, 3);
>> +    g_assert_cmpint(st0, ==, 0x20);
>>         /* Send relative seek to decrease track by 1 */
>>       floppy_send(CMD_RELATIVE_SEEK_OUT);
>>       floppy_send(head << 2 | drive);
>>       g_assert(!get_irq(FLOPPY_IRQ));
>> -    floppy_send(cyl);
>> +    floppy_send(1);
>> +
>> +    ack_irq(&st0, &pcn);
>> +    g_assert_cmpint(pcn, ==, 2);
>> +    g_assert_cmpint(st0, ==, 0x20);
>> +
>> +    /* Send relative seek to beyond track 0 */
>> +    floppy_send(CMD_RELATIVE_SEEK_OUT);
>> +    floppy_send(head << 2 | drive);
>> +    g_assert(!get_irq(FLOPPY_IRQ));
>> +    floppy_send(42);
>> +
>> +    ack_irq(&st0, &pcn);
>> +    g_assert_cmpint(pcn, ==, 0);
>> +    g_assert_cmpint(st0, ==, 0x70);
>> +
>> +    /* Send try relative seek to beyond track 80 */
>> +    floppy_send(CMD_RELATIVE_SEEK_IN);
>> +    floppy_send(head << 2 | drive);
>> +    g_assert(!get_irq(FLOPPY_IRQ));
>> +    floppy_send(200);
>>   -    ack_irq(&pcn);
>> -    g_assert(pcn == 0);
>> +    ack_irq(&st0, &pcn);
>> +    g_assert_cmpint(pcn, ==, 79);
>> +    g_assert_cmpint(st0, ==, 0x50);
>>   }
>>     /* success if no crash or abort */
>
> I tested it on the real floppy and the behavior is more complicated.

This reminds me of an idea: it could be interesting to make qtest test
real hardware, for example using a serial port to feed commands and
get responses. The same protocol which libqtest uses could be
interpreted by a boot loader level program or kernel module.

>
> Let's say that we start on the track 0 and the floppy media has 80 tracks.
>
> You send the "relative_seek_in" by 1 end the result is
>     st0: 0x20
>     rcn: 1.
> Then you issue the "read_id" command and you get
>     st0: 0x00
>     st1: 0x00
>     pcn: 1.
>
> Then you send the "relative_seek_in" by 100 and the result is
>     st0: 0x20
>     rcn: 101
> but "read_id" returns
>     st0: 0x40
>     st1: 0x01
>     pcn: 0.
> This probably means, that you are out of available tracks.
>
> Then you send the "relative_seek_out" by 100 and the result is
>     st: 0x70
>     rcn: 20
> but "read_id" returns
>     st0: 0x00
>     st1: 0x00
>     pcn: 0.
> You return reading heads to the track 0, but the "relative_seek_out" returns
> that you are on the relative track 20.
>
> To get the floppy drive fully working, you have to send the "seek" to the
> track 0. If you don't do it, every seek to different track then the track 0
> will always seek to the track 0 and set rcn to track what you want. In this
> "buggy" state only the "relative_seek" will change the real track. The
> command "read_id" returns the real position of the reading heads. For
> example:
>
> Now you send "seek" to track 2 and you get
>     st0: 0x20
>     pcn: 2
> but if you send "read_id" the result is
>     st0: 0x00
>     st1: 0x00
>     pcn: 0
>
> Pavel
>
>



reply via email to

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