[OpenBIOS] [PATCH] Add tbu@ and tbl@ words
Programmingkid
programmingkidx at gmail.com
Wed Dec 27 22:43:43 CET 2017
> On Dec 27, 2017, at 4:27 PM, BALATON Zoltan <balaton at eik.bme.hu> wrote:
>
> On Wed, 27 Dec 2017, Programmingkid wrote:
>>> On Dec 27, 2017, at 1:48 PM, Segher Boessenkool <segher at kernel.crashing.org> wrote:
>>>
>>> On Wed, Dec 27, 2017 at 01:35:46PM -0500, John Arbuckle wrote:
>>>> +/* reads the lower timebase register ( -- tbl ) */
>>>> +static void get_tbl(void)
>>>> +{
>>>> + int time;
>>>> + asm volatile("mftb %0" : "=r"(time)); // load from TBL register
>>>> + PUSH(time);
>>>> +}
>>>
>>> This doesn't get TBL: on 64-bit implementations it gets all of TB. You'll
>>> have to mask out the high half if you want to get just TBL. Or, you could
>>> just use mftb (mfspr 268) on 64-bit systems, instead of the TBU dance that
>>> you need on 32-bit systems.
>>>
>>>
>>> Segher
>>
>> I wasn't aware that OpenBIOS supported 64-bit PowerPC. What if I change the type of the time variable to uint32_t. This type can only hold a 32-bit value, would the following code work on 64-bit PowerPC?
>
> I don't know if it works (depends on the compiler implementation) but it looks safer to explicitely mask the unneded bits in a new line between the asm and PUSH.
>
>> /* reads the lower timebase register ( -- tbl ) */
>> static void get_tbl(void)
>> {
>> uint32_t time;
>> asm volatile("mftb %0" : "=r"(time)); // load from TBL register
>> PUSH(time);
>> }
>>
>> Also how would I test 64-bit PowerPC code in QEMU? If you could send the command-line needed that would help.
>
> Look in openbios/include/arch/ppc/processor.h (and this is probably a better place for these kind of helpers than qemu/init.c as these are PPC specific not QEMU specific). However then you'd also need a way in Forth to detect 64bit. Elsewhere in ppc/qemu CONFIG_PPC64 also seems to be used and you may be able to test this in Forth, I've seen lines like:
>
> [IFDEF] CONFIG_PPC64 " yes" [ELSE] " no" [THEN]
>
> but not sure if this works. It seems to be cleaner to implement the tb@ function in C that returns the whole TB value instead of tbl@ and tbu@ and export that to Forth so you don't need to handle arch differences such as 64bit in Forth.
>
> Regards,
> BALATON Zoltan
Ok I think this is what you want:
/* reads the lower timebase register ( -- tbl ) */
static void get_tbl(void)
{
uint32_t time;
asm volatile("mftb %0" : "=r"(time)); // load from TBL register
time = time & 0xffffffff; // Ensures the value is only 32-bit
PUSH(time);
}
More information about the OpenBIOS
mailing list