mirror of
https://github.com/pruten/shoebill.git
synced 2024-06-09 12:29:31 +00:00
A/UX 3 should boot reliably now
- Added a hack to bypass SetUpTimeK, which works on 3.0.0, not sure about other versions.
This commit is contained in:
parent
476a8bb570
commit
a66ad6d9b4
27
core/via.c
27
core/via.c
|
@ -584,7 +584,32 @@ static uint8_t via_read_reg(const uint8_t vianum, const uint8_t reg, const long
|
||||||
return via->ddra;
|
return via->ddra;
|
||||||
|
|
||||||
case VIA_T2C_HI: {
|
case VIA_T2C_HI: {
|
||||||
const uint16_t counter = via->t2c - (uint16_t)_via_get_delta_counter(via->t2_last_set);
|
uint16_t counter = via->t2c - (uint16_t)_via_get_delta_counter(via->t2_last_set);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is a hack to allow A/UX 3.x.x to boot on fast hosts.
|
||||||
|
* The A/UX 3 kernel calls a function, SetUpTimeK, during boot
|
||||||
|
* to run a giant drba-to-self loop and time it via T2C.
|
||||||
|
* If the loop completes too quickly, (quicker than 0x492 E_CLOCK
|
||||||
|
* ticks on 3.0.0), it rejects it and tries again.
|
||||||
|
*
|
||||||
|
* SetUpTimeK reads T2C twice and compares them to determine the
|
||||||
|
* time elapsed. I don't want to count on getting the order correct,
|
||||||
|
* however. Therefore, we will fake it out by randomly adding 0x500
|
||||||
|
* to the the value of the clock whenever it's read by SetUpTimeK.
|
||||||
|
* By the Monte Carlo method, we'll eventually get a case where
|
||||||
|
* two sequential reads differ by at least 0x500.
|
||||||
|
*
|
||||||
|
* FIXME: optimize this better, stop using coff_find_func()
|
||||||
|
*/
|
||||||
|
if (sr_s()) {
|
||||||
|
coff_symbol *symb = coff_find_func(shoe.coff, shoe.pc);
|
||||||
|
if (symb && strcmp(symb->name, "SetUpTimeK") == 0) {
|
||||||
|
if (random() & 1)
|
||||||
|
counter += 0x500;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return counter >> 8;
|
return counter >> 8;
|
||||||
}
|
}
|
||||||
case VIA_T2C_LO: {
|
case VIA_T2C_LO: {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user