August 12, 2002 RAS 9

### NAME

ras_lookup, ras_fork, ras_purgeall - restartable atomic sequences

### SYNOPSIS

```void``*` ras_lookup(```struct proc *p``, void *addr`)
```int` ras_fork(```struct proc *p1``, struct proc *p2`)
```int` ras_purgeall(```struct proc *p`)

### DESCRIPTION

Restartable atomic sequences are user code sequences which are guaranteed to execute without preemption. This property is assured by checking the set of restartable atomic sequences registered for a process during cpu_switch(9). If a process is found to have been preempted during a restartable sequence, then its execution is rolled-back to the start of the sequence by resetting its program counter saved in its process control block (PCB).

The RAS functionality is provided by a combination of the machine-independent routines discussed in this page and a machine-dependent component in cpu_switch(9). A port which supports restartable atomic sequences will define __HAVE_RAS in ```machine/types.h` for machine-independent code to conditionally provide RAS support.

A complicated side-effect of restartable atomic sequences is their interaction with the machine-dependent ptrace(2) support. Specifically, single-step traps and/or the emulation of single-stepping must carefully consider the effect on restartable atomic sequences. A general solution is to ignore these traps or disable them within restartable atomic sequences.

### FUNCTIONS

The functions which operate on restartable atomic sequences are:

ras_lookup(```p``, addr`)
  This function searches the registered restartable atomic sequences for process ```p` which contain the user address ```addr`. If the address ```addr` is found within a RAS, then the restart address of the RAS is returned, otherwise -1 is returned.

ras_fork(```p1``, p2`)
  This function is used to copy all registered restartable atomic sequences for process ```p1` to process ```p2`. It is primarily called from fork1(9) when the sequences are inherited from the parent by the child.

ras_purgeall(```p`)
  This function is used to remove all registered restartable atomic sequences for process ```p`. It is primarily used to remove all registered restartable atomic sequences for a process during exec(3) and by rasctl(2).

### CODE REFERENCES

This section describes places within the NetBSD source tree where actual code implementing or using the RAS functionality can be found. All pathnames are relative to ```/usr/src`.

The RAS framework itself is implemented within the file ```sys/kern/kern_ras.c`. Data structures and function prototypes for the framework are located in ```sys/sys/ras.h`. Machine-dependent portions are implemented within cpu_switch(9) in the machine-dependent file ```sys/arch/<arch>/<arch>/locore.S`.

### SEE ALSO

rasctl(2), cpu_switch(9), fork1(9)

### HISTORY

The RAS functionality first appeared in NetBSD2.0.