Dne 05. 08. 22 v 20:18 Kevin O'Connor napsal(a):
> On Wed, Jul 13, 2022 at 03:25:17AM +0200, Petr Cvek wrote:
>> ASPI2DOS.SYS and KEYB.COM from Win 98 SE installation CD (and most likely
>> other DOS versions too) depend on I/O port 0x61 bit 4 to be toggled. This
>> requires timer 1 (I/O 0x41, legacy DRAM refresh) to be correctly set.
>> Also Intel ICH7 Family Datasheet, chapter 5.8 states:
>>
>> Programming the counter to anything other than Mode 2 will result in
>> undefined behavior for the REF_TOGGLE bit.
>>
>> Failing to have the timer 1 configured indeed causes affected OSes to
>> freeze during the boot.
> 
> Thanks.  In general, I don't see an issue with initializing standard
> hardware.  However, a change like this could have a subtle impact on
> existing installations.  So, I'd like to have a better understanding
> of this change.
> 
> Did the above compatibility issue occur on coreboot or on QEMU?  If on
> coreboot, can you check if the problem exists on QEMU?  If it isn't an
> issue on QEMU, do you know why?  Finally, have you found any documents
> that describe how timer1 is intended to be configured on legacy
> systems?
> 

I've found it when trying to boot windows 98 SE installation under coreboot. 
Inside QEMU the test for I/O port 0x61 bit 4 succeeds (no hang up). It seems
the QEMU has the timer 1 already enabled. 

One of the multiple checks in KEYB.COM

00000F44  E461              in al,0x61
00000F46  2410              and al,0x10
00000F48  3AC4              cmp al,ah
00000F4A  74F8              jz 0xf44

If the timer is disabled (and other bit state is required by cmp) the test will
spin forever.

I've tried to check on a real hardware if the timer is stopped and indeed it 
was.
After a manual configuration in a debugger the KEYB.COM succeeded to run.

So far I've found the timer 1 description in the ICH7 datasheet:

IntelĀ® I/O Controller Hub 7 (ICH7) Family

Section 5.8 8254 Timers (D31:F0)

The REF_TOGGLE bit will have a square wave behavior (alternate between 0 and 1) 
and
will toggle at a rate based on the value in the counter. Programming the 
counter to
anything other than Mode 2 will result in undefined behavior for the REF_TOGGLE 
bit.

(the alternation between 0 and 1 is used by those DOS programs)

There is actually a setup function in coreboot, but it is called in a specific 
case,
when video bios is executed in a realmode environment. 

The divider value is taken from there (also I've seen the same value in MSDOS 
age
documentation).

https://elixir.bootlin.com/coreboot/4.17/source/src/drivers/pc80/pc/i8254.c#L20

(I'm not sure the values there are correct too, ICH7 datasheet says MODE2 and 
maybe MSB
should be erased also, I've set WIP patch at 

https://review.coreboot.org/c/coreboot/+/65809

but that's slightly OT)

Petr

> Thanks again,
> -Kevin
> 
> 
>>
>> Signed-off-by: Petr Cvek <petrcve...@gmail.com>
>> ---
>>  src/hw/timer.c | 6 ++++++
>>  1 file changed, 6 insertions(+)
>>
>> diff --git a/src/hw/timer.c b/src/hw/timer.c
>> index b6f102e..b272f44 100644
>> --- a/src/hw/timer.c
>> +++ b/src/hw/timer.c
>> @@ -280,4 +280,10 @@ pit_setup(void)
>>      // maximum count of 0000H = 18.2Hz
>>      outb(0x0, PORT_PIT_COUNTER0);
>>      outb(0x0, PORT_PIT_COUNTER0);
>> +
>> +    // timer1: binary count, 16bit count, mode 2
>> +    outb(PM_SEL_TIMER1|PM_ACCESS_WORD|PM_MODE2|PM_CNT_BINARY, 
>> PORT_PIT_MODE);
>> +    // maximum count of 0012H = 66.3kHz
>> +    outb(0x12, PORT_PIT_COUNTER1);
>> +    outb(0x0, PORT_PIT_COUNTER1);
>>  }
>> -- 
>> 2.37.0
>>
>> _______________________________________________
>> SeaBIOS mailing list -- seabios@seabios.org
>> To unsubscribe send an email to seabios-le...@seabios.org
_______________________________________________
SeaBIOS mailing list -- seabios@seabios.org
To unsubscribe send an email to seabios-le...@seabios.org

Reply via email to