rendered paste body/*
unsigned char __res[sizeof(bd_t)];
*/
bd_t __res;
void __init
platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
unsigned long r6, unsigned long r7)
{
parse_bootinfo(find_bootinfo());
...
memcpy( (void *)&__res,(void *)(r3+KERNELBASE), sizeof(bd_t) );
...
ppc_md.setup_arch = iomega8241_setup_arch;
ppc_md.calibrate_decr = todc_calibrate_decr;
}
static void __init
iomega8241_setup_arch(void)
{
if (133333332 == __res.bi_busfreq)
freq = 132000000;
if (99999999 == __res.bi_busfreq)
freq = 100000000;
base_baud = freq / 16;
/* so far so good */
}
Then from file syslib/todc_time.c:
void __init
todc_calibrate_decr(void)
{
extern bd_t __res;
ulong freq = 25000000;
printk("AJW: calib_decr: %d.\n", __res.bi_busfreq);
/* boom - busfreq is now 0x80000 - way wrong and looks like it has been stomped */