[hppa-linux] Gateway instructions
Cary Coutant
cary@cup.hp.com
Thu, 18 Mar 1999 10:43:44 -0800
The PSW B bit is set to indicate that an instruction is executing in the
delay slot of another branch. Gateway instructions trap if the B bit is
set to prevent a malicious process from using sequence like the following
to gain a higher privilege level:
B gateway
B my_routine
Without this protection, the first branch to the gateway instruction
would promote the privilege level, but control would immediately be
transferred to the user's own code.
Branches in delay slots are tricky; here's what's really happening in the
hardware:
PC offset queue after instruction
PC Instruction head tail
user+0 ... user+4 user+8
user+4 B gateway user+8 gateway
user+8 B my_routine gateway my_routine
gateway B,GATE syscall my_routine syscall
my_routine B my_routine+4 syscall my_routine+4
syscall ... my_routine+4 my_routine+8
my_routine+4 ...
When a page's access rights are 4, 5, 6, or 7, a gateway instruction on
that page causes the privilege promotion. Most HP-UX system calls are
branches to a common gateway instruction on a gateway page in the fourth
quadrant. This gateway instruction then branches to a common syscall
entry sequence that ultimately switches on the syscall number passed in a
GR. Some "lightweight" syscalls may be implemented with their own
gateways.
The B bit is not a problem as long as the delay slot of the branch to the
gateway is either nullified or filled in with a non-branch instruction.
For example,
LDIL L'GATEWAY,%r1
BLE R'GATEWAY(%sr7,%r1)
LDO sycallnum,%r22
Cary Coutant
Hewlett-Packard Co.
Application Delivery Lab