On Wed, 2010-03-24 at 09:31 -0400, Dave Anderson wrote: > > This patch doesn't seem like it would be backwards-compatible for older > systems which do *not* have the "have_of" symbol. Can you confirm > that this patch will still work for them? > > Thanks, > Dave Hi Dave, I think systems you are referring are, systems which do not have OF. I don't have a system of that type here to test.. Just to be safe I have prepared a new patch.. Changes are, patch assumes that system is having the OF and tries to find the processor speed.. If the speed was not found, then if would go will the code of finding the processor speed in system without OF. I think this will makes sure of backwards-compatibility in older system. Thanks Pavan --- diff -Naur a/ppc64.c b/ppc64.c --- a/ppc64.c 2010-03-25 10:47:54.000000000 +0530 +++ b/ppc64.c 2010-03-25 10:48:15.000000000 +0530 @@ -742,7 +742,7 @@ ppc64_processor_speed(void) { ulong res, value, ppc_md, md_setup_res; - ulong we_have_of, prep_setup_res; + ulong prep_setup_res; ulong node, type, name, properties; char str_buf[32]; uint len; @@ -751,22 +751,7 @@ if (machdep->mhz) return(machdep->mhz); - /* first, check if the have_of variable a) exists, and b) is TRUE */ - if(symbol_exists("have_of")) { - get_symbol_data("have_of", sizeof(void *), &we_have_of); - } else { - we_have_of = 0; - } - - if(we_have_of) { - /* we have a machine with open firmware, so search the OF nodes - * for cpu nodes. - * Too bad we can't call kernel helper functions here :) - */ - - if(!symbol_exists("allnodes")) - return (machdep->mhz = 0); - + if(symbol_exists("allnodes")) { get_symbol_data("allnodes", sizeof(void *), &node); while(node) { readmem(node+OFFSET(device_node_type), @@ -842,54 +827,54 @@ } if(!properties) { /* didn't find the cpu speed for some reason */ - mhz = 0; + return (machdep->mhz = 0); } } - } else { - /* for machines w/o OF */ - /* untested, but in theory this should work on prep machines */ + } - if (symbol_exists("res")) { - get_symbol_data("res", sizeof(void *), &res); + /* for machines w/o OF */ + /* untested, but in theory this should work on prep machines */ - if (symbol_exists("prep_setup_residual")) { - get_symbol_data("prep_setup_residual", - sizeof(void *), &prep_setup_res); - get_symbol_data("ppc_md", sizeof(void *), - &ppc_md); - readmem(ppc_md + - OFFSET(machdep_calls_setup_residual), - KVADDR, &md_setup_res, - sizeof(ulong), "ppc_md setup_residual", - FAULT_ON_ERROR); - - if(prep_setup_res == md_setup_res) { - /* PREP machine */ - readmem(res+ - OFFSET(RESIDUAL_VitalProductData)+ - OFFSET(VPD_ProcessorHz), - KVADDR, &mhz, sizeof(ulong), - "res VitalProductData", - FAULT_ON_ERROR); + if (symbol_exists("res") && !mhz) { + get_symbol_data("res", sizeof(void *), &res); - mhz = (mhz > 1024) ? mhz >> 20 : mhz; - } - } + if (symbol_exists("prep_setup_residual")) { + get_symbol_data("prep_setup_residual", + sizeof(void *), &prep_setup_res); + get_symbol_data("ppc_md", sizeof(void *), + &ppc_md); + readmem(ppc_md + + OFFSET(machdep_calls_setup_residual), + KVADDR, &md_setup_res, + sizeof(ulong), "ppc_md setup_residual", + FAULT_ON_ERROR); - if(!mhz) { - /* everything else seems to do this the same way... */ - readmem(res + - OFFSET(bd_info_bi_intfreq), - KVADDR, &mhz, sizeof(ulong), - "bd_info bi_intfreq", FAULT_ON_ERROR); + if(prep_setup_res == md_setup_res) { + /* PREP machine */ + readmem(res+ + OFFSET(RESIDUAL_VitalProductData)+ + OFFSET(VPD_ProcessorHz), + KVADDR, &mhz, sizeof(ulong), + "res VitalProductData", + FAULT_ON_ERROR); - mhz /= 1000000; - } - } - /* else...well, we don't have OF, or a residual structure, so - * just print unknown MHz - */ - } + mhz = (mhz > 1024) ? mhz >> 20 : mhz; + } + } + + if(!mhz) { + /* everything else seems to do this the same way... */ + readmem(res + + OFFSET(bd_info_bi_intfreq), + KVADDR, &mhz, sizeof(ulong), + "bd_info bi_intfreq", FAULT_ON_ERROR); + + mhz /= 1000000; + } + } + /* else...well, we don't have OF, or a residual structure, so + * just print unknown MHz + */ return (machdep->mhz = (ulong)mhz); } diff -Naur a/ppc.c b/ppc.c --- a/ppc.c 2010-03-25 10:47:54.000000000 +0530 +++ b/ppc.c 2010-03-25 10:48:15.000000000 +0530 @@ -461,7 +461,7 @@ ppc_processor_speed(void) { ulong res, value, ppc_md, md_setup_res; - ulong we_have_of, prep_setup_res; + ulong prep_setup_res; ulong node, type, name, properties; char str_buf[16]; ulong len, mhz = 0; @@ -469,22 +469,7 @@ if (machdep->mhz) return(machdep->mhz); - /* first, check if the have_of variable a) exists, and b) is TRUE */ - if(symbol_exists("have_of")) { - get_symbol_data("have_of", sizeof(void *), &we_have_of); - } else { - we_have_of = 0; - } - - if(we_have_of) { - /* we have a machine with open firmware, so search the OF nodes - * for cpu nodes. - * Too bad we can't call kernel helper functions here :) - */ - - if(!symbol_exists("allnodes")) - return (machdep->mhz = 0); - + if(symbol_exists("allnodes")) { get_symbol_data("allnodes", sizeof(void *), &node); while(node) { readmem(node+OFFSET(device_node_type), @@ -545,54 +530,53 @@ } if(!properties) { /* didn't find the cpu speed for some reason */ - mhz = 0; + return (machdep->mhz = 0); } } - } else { - /* for machines w/o OF */ - /* untested, but in theory this should work on prep machines */ + } + /* for machines w/o OF */ + /* untested, but in theory this should work on prep machines */ - if (symbol_exists("res")) { - get_symbol_data("res", sizeof(void *), &res); + if (symbol_exists("res") && !mhz) { + get_symbol_data("res", sizeof(void *), &res); - if (symbol_exists("prep_setup_residual")) { - get_symbol_data("prep_setup_residual", - sizeof(void *), &prep_setup_res); - get_symbol_data("ppc_md", sizeof(void *), - &ppc_md); - readmem(ppc_md + - OFFSET(machdep_calls_setup_residual), - KVADDR, &md_setup_res, - sizeof(ulong), "ppc_md setup_residual", - FAULT_ON_ERROR); + if (symbol_exists("prep_setup_residual")) { + get_symbol_data("prep_setup_residual", + sizeof(void *), &prep_setup_res); + get_symbol_data("ppc_md", sizeof(void *), + &ppc_md); + readmem(ppc_md + + OFFSET(machdep_calls_setup_residual), + KVADDR, &md_setup_res, + sizeof(ulong), "ppc_md setup_residual", + FAULT_ON_ERROR); - if(prep_setup_res == md_setup_res) { - /* PREP machine */ - readmem(res+ - OFFSET(RESIDUAL_VitalProductData)+ - OFFSET(VPD_ProcessorHz), - KVADDR, &mhz, sizeof(ulong), - "res VitalProductData", - FAULT_ON_ERROR); + if(prep_setup_res == md_setup_res) { + /* PREP machine */ + readmem(res+ + OFFSET(RESIDUAL_VitalProductData)+ + OFFSET(VPD_ProcessorHz), + KVADDR, &mhz, sizeof(ulong), + "res VitalProductData", + FAULT_ON_ERROR); - mhz = (mhz > 1024) ? mhz >> 20 : mhz; - } + mhz = (mhz > 1024) ? mhz >> 20 : mhz; } + } - if(!mhz) { - /* everything else seems to do this the same way... */ - readmem(res + - OFFSET(bd_info_bi_intfreq), - KVADDR, &mhz, sizeof(ulong), - "bd_info bi_intfreq", FAULT_ON_ERROR); + if(!mhz) { + /* everything else seems to do this the same way... */ + readmem(res + + OFFSET(bd_info_bi_intfreq), + KVADDR, &mhz, sizeof(ulong), + "bd_info bi_intfreq", FAULT_ON_ERROR); - mhz /= 1000000; - } + mhz /= 1000000; } - /* else...well, we don't have OF, or a residual structure, so - * just print unknown MHz - */ } + /* else...well, we don't have OF, or a residual structure, so + * just print unknown MHz + */ return (machdep->mhz = mhz); } -- Crash-utility mailing list Crash-utility@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/crash-utility