The Question is:
Hi there Mr Wizard!
I have a question regarding accessing the general purpose registers from C,
which I hope you can help me with.
The short version:
I'm running DEC C V6.0-001 on OpenVMS Alpha V7.3.1 and need to read and write
the general purpose registers.
The documentation talks extensively about the _READ_GPR and _WRITE_GPR, but
they don't seem to be available on the Alpha (in builtins.h, they're
specifically excluded with an #ifdefined(__VAX) conditional).
Can you tell me what the alternative is?
The long version:
I need to write a function which provides the caller with the initial buffer
allocation (total size) for a mailbox.
From what I can determine, the only place this is stored is in ucb$w_iniquo, to
which I can find no documented interface.
It seems that the best way for me to get the UCB is to call ioc$verifychan to
get the CCB, and then follow the UCB link from there (ccb$l_ucb).
The documentation for IOC$VERIFYCHAN indicates that it wants the channel number
in R0, and will return the CCB in R1.
Is there a supported method for accessing these registers from C? Is there
some arcane operation involving, perhaps, the linkage pragmas that will enable
me to call IOC$VERIFYCHAN without poking the registers directly?
The Answer is :
The asm directives are the usual approach for writing assembler code
using the C compiler.
In general, writing assembler in C, and directly reading and writing
the underlying hardware registers is discouraged.
The linkage pragma is the usual approach for defining non-standard
calling interfaces, of course. Use of a standard calling interface
such as that of IOC_STD$VERIFYCHAN would be preferable to the use of
a non-standard calling interface such as that of IOC$VERIFYCHAN, too.
There are changes to UCB$W_INIQUO and such underway; the field is
being increased to the longword UCB$L_MB_INIQUO cell.
The best and most portable and upgradable solution -- kernel-mode
code can require periodic recompilation and relinking, as OpenVMS
is upgraded or ECOs are applied -- would be to correctly set and
to then remember the value when the mailbox is initially created.