OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [rtems-20020807/] [doc/] [supplements/] [hppa1_1/] [callconv.t] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1026 ivang
@c
2
@c  COPYRIGHT (c) 1988-2002.
3
@c  On-Line Applications Research Corporation (OAR).
4
@c  All rights reserved.
5
@c
6
@c  callconv.t,v 1.6 2002/01/17 21:47:46 joel Exp
7
@c
8
 
9
@chapter Calling Conventions
10
 
11
@section Introduction
12
 
13
Each high-level language compiler generates
14
subroutine entry and exit code based upon a set of rules known
15
as the compiler's calling convention.   These rules address the
16
following issues:
17
 
18
@itemize @bullet
19
@item register preservation and usage
20
 
21
@item parameter passing
22
 
23
@item call and return mechanism
24
@end itemize
25
 
26
A compiler's calling convention is of importance when
27
interfacing to subroutines written in another language either
28
assembly or high-level.  Even when the high-level language and
29
target processor are the same, different compilers may use
30
different calling conventions.  As a result, calling conventions
31
are both processor and compiler dependent.
32
 
33
This chapter describes the calling conventions used
34
by the GNU C and standard HP-UX compilers for the PA-RISC
35
architecture.
36
 
37
@section Processor Background
38
 
39
The PA-RISC architecture supports a simple yet
40
effective call and return mechanism for subroutine calls where
41
the caller and callee are both in the same address space.  The
42
compiler will not automatically generate subroutine calls which
43
cross address spaces.  A subroutine is invoked via the branch
44
and link (bl) or the branch and link register (blr).  These
45
instructions save the return address in a caller specified
46
register.  By convention, the return address is saved in r2.
47
The callee is responsible for maintaining the return address so
48
it can return to the correct address.  The branch vectored (bv)
49
instruction is used to branch to the return address and thus
50
return from the subroutine to the caller.  It is is important to
51
note that the PA-RISC subroutine call and return mechanism does
52
not automatically save or restore any registers.  It is the
53
responsibility of the high-level language compiler to define the
54
register preservation and usage convention.
55
 
56
@section Calling Mechanism
57
 
58
All RTEMS directives are invoked as standard
59
subroutines via a bl or a blr instruction with the return address
60
assumed to be in r2 and return to the user application via the
61
bv instruction.
62
 
63
@section Register Usage
64
 
65
As discussed above, the bl and blr instructions do
66
not automatically save any registers.  RTEMS uses the registers
67
r1, r19 - r26, and r31 as scratch registers.  The PA-RISC
68
calling convention specifies that the first four (4) arguments
69
to subroutines are passed in registers r23 - r26.  After the
70
arguments have been used, the contents of these registers may be
71
altered.  Register r31 is the millicode scratch register.
72
Millicode is the set of routines which support high-level
73
languages on the PA-RISC by providing routines which are either
74
too complex or too long for the compiler to generate inline code
75
when these operations are needed.  For example, indirect calls
76
utilize a millicode routine.  The scratch registers are not
77
preserved by RTEMS directives therefore, the contents of these
78
registers should not be assumed upon return from any RTEMS
79
directive.
80
 
81
Surprisingly, when using the GNU C compiler at least
82
integer multiplies are performed using the floating point
83
registers.  This is an important optimization because the
84
PA-RISC does not have otherwise have hardware for multiplies.
85
This has important ramifications in regards to the PA-RISC port
86
of RTEMS.  On most processors, the floating point unit is
87
ignored if the code only performs integer operations.  This
88
makes it easy for the application developer to predict whether
89
or not any particular task will require floating point
90
operations.  This property is taken advantage of by RTEMS on
91
other architectures to minimize the number of times the floating
92
point context is saved and restored.  However, on the PA-RISC
93
architecture, every task is implicitly a floating point task.
94
Additionally the state of the floating point unit must be saved
95
and restored as part of the interrupt processing because for all
96
practical purposes it is impossible to avoid the use of the
97
floating point registers.  It is unknown if the HP-UX C compiler
98
shares this property.
99
 
100
@itemize @code{ }
101
@item @b{NOTE}: Later versions of the GNU C has a PA-RISC specific
102
option to disable use of the floating point registers.  RTEMS
103
currently assumes that this option is not turned on.  If the use
104
of this option sets a built-in define, then it should be
105
possible to modify the PA-RISC specific code such that all tasks
106
are considered floating point only when this option is not used.
107
@end itemize
108
 
109
@section Parameter Passing
110
 
111
RTEMS assumes that the first four (4) arguments are
112
placed in the appropriate registers (r26, r25, r24, and r23)
113
and, if needed, additional are placed on the current stack
114
before the directive is invoked via the bl or blr instruction.
115
The first argument is placed in r26, the second is placed in
116
r25, and so forth.  The following pseudo-code illustrates the
117
typical sequence used to call a RTEMS directive with three (3)
118
arguments:
119
 
120
 
121
@example
122
set r24 to the third argument
123
set r25 to the second argument
124
set r26 to the first argument
125
invoke directive
126
@end example
127
 
128
The stack on the PA-RISC grows upward -- i.e.
129
"pushing" onto the stack results in the address in the stack
130
pointer becoming numerically larger.  By convention, r27 is used
131
as the stack pointer.  The standard stack frame consists of a
132
minimum of sixty-four (64) bytes and is the responsibility of
133
the callee to maintain.
134
 
135
@section User-Provided Routines
136
 
137
All user-provided routines invoked by RTEMS, such as
138
user extensions, device drivers, and MPCI routines, must also
139
adhere to these calling conventions.
140
 
141
 
142
 
143
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.