[Fwd: Re: [parisc-linux] PDC woes]

Helge Deller Helge.Deller@ruhr-uni-bochum.de
Mon, 12 Jul 1999 10:51:52 +0200


Dies ist eine mehrteilige Nachricht im MIME-Format.
--------------447487C03A72049BA408CDB6
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit

If this message goes through, does anybody have any ideas, why my mails
sent from Netscape/Win95 goes through to the list, but those from
Netscape/Linux not ????
Thanks,
Helge.
(This message was sent with Netscape/Win95, the message below with
Netscape/Linux).


-------- Original Message --------
Betreff: Re: [parisc-linux] PDC woes
Datum: Mon, 12 Jul 1999 01:08:45 +0200
Von: Helge Deller <Helge.Deller@ruhr-uni-bochum.de>
An: Matthew Wilcox <Matthew.Wilcox@genedata.com>
CC: parisc-linux@thepuffingroup.com
Referenzen: <19990711011852.A25925@mencheca.ch.genedata.com>

Matthew Wilcox wrote:

> Philipp asked me to write a function to calculate the frequency of the
> interval timer.  However, the PDC doesn't want to cooperate.  I see
> `hello' printed on the screen, but not `world'.  So somehow this PDC
> call is going wrong.  Anyone have any clues?  pim_info is not very
> revealing.  If it helps anyone, the blinkenlights on my 715/33 are at:
>
> 10110010
>
> Is there a document somewhere describing what the blinkenlights mean?

>
>
> Here's the function:
>
> /*
>  * Find the interval timer frequency.
>  */
> static long calculate_interval_timer_frequency(void)
> {
>         long exponent, mantissa, result;
>         long buf[4] __attribute__ ((aligned (8)));
> printk("hello\n");
>         (*pdc) (PDC_TOD, PDC_TOD_ITIMER, buf, 0);
> printk("world\n");
>         exponent = (buf[0] >> 20) & 0x7ff;
>         mantissa = (buf[0] & 0xfffff) | 0x100000;
>         result = (mantissa >> (1038 - exponent)) * 625 * 625;
> printk("exponent = %ld mantissa = %ld result = %ld\n", exponent, mantissa, resul
> t);
>         return result;
> }
>
> --
> Matthew Wilcox <willy@bofh.ai>
> "Windows and MacOS are products, contrived by engineers in the service of
> specific companies. Unix, by contrast, is not so much a product as it is a
> painstakingly compiled oral history of the hacker subculture." - N Stephenson

Hi Matthew !

I took a little look at your code and found the problem(s):
1. When you call PDC-functions and want them to report values back into
a
result-buffer, this result-buffer always has to be a minimum of 32 longs
in size
and aligned (alignment differs from double-word bondaries to
4096-byte-boundaries
!).
The Problem was, that you only reserved a buffer for 4 longs, and so the
pdc-function overwrote the calling-stack, ergo: the pdc-call never
returned!
2. Maybe you also have to change (you should try!)
        (*pdc) (PDC_TOD, PDC_TOD_ITIMER, buf, 0);
to
        (*pdc) (PDC_TOD, PDC_TOD_ITIMER, &buf, 0);    (the &-sign..)

The new code looks then like the attachment.... and it worked here (But
I donīt
know, if the values are correct!).

my output here was: exponent = 1029, mantissa = 1048576 result =
800000000

I hope that I could help you,

Helge.
--------------447487C03A72049BA408CDB6
Content-Type: text/plain; charset=us-ascii;
 name="timer_calc.c"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="timer_calc.c"

/*
 * Find the interval timer frequency.
 */
static long calculate_interval_timer_frequency(void)
{
        long exponent, mantissa, result;
        long buf[32] __attribute__ ((aligned (8)));
	//changed to 32
printk("hello\n");
        (*pdc) (PDC_TOD, PDC_TOD_ITIMER, &buf, 0);
	//changed to &buf
printk("world\n");
        exponent = (buf[0] >> 20) & 0x7ff;
        mantissa = (buf[0] & 0xfffff) | 0x100000;
        result = (mantissa >> (1038 - exponent)) * 625 * 625;
printk("exponent = %d mantissa = %d result = %d\n", 
		exponent, mantissa, result);
        return result;
}


--------------447487C03A72049BA408CDB6--