Implementing Polled I/O in Console Frame Buffer Drivers
The polled I/O interfaces are implemented as functions in the driver and are
called directly by the kernel terminal emulator. The driver passes the address of
its polled I/O entry points to the terminal emulator during the execution of
the VIS_DEVINIT ioctl command. The VIS_DEVINIT command is initiated by the terminal emulator.
The vis_polledio structure is shown in the following code.
typedef void * vis_opaque_arg_t;
struct vis_polledio {
struct vis_polledio_arg *arg;
void (*display)(vis_opaque_arg_t, struct vis_consdisplay *);
void (*copy)(vis_opaque_arg_t, struct vis_conscopy *);
void (*cursor)(vis_opaque_arg_t, struct vis_conscursor *);
};
The polled I/O interfaces provide the same functionality as the VIS_CONSDISPLAY, VIS_CONSCOPY,
and VIS_CONSCURSOR ioctl interfaces. The polled I/O interfaces should follow the same steps
that are described above for the respective ioctl commands. The polled I/O interfaces
must very strictly adhere to the additional restrictions that are described in the remainder
of this section.
The polled I/O interfaces are called only when the operating system is quiesced
and in standalone mode. The system enters standalone mode whenever the user enters OpenBoot
PROM or enters the kmdb debugger, or when the system panics. Only one
CPU and one thread are active. All other CPUs and threads are stopped.
Timesharing, DDI interrupts, and system services are turned off.
Standalone mode severely restricts driver functionality but simplifies driver synchronization requirements. For example,
a user application cannot access the console frame buffer driver by way of
the driver's memory mappings from within a polled I/O routine.
In standalone mode, the console frame buffer driver must not perform any of
the following actions:
These restrictions are not difficult to obey since the polled I/O functions are
relatively simple operations. For example, when working with the rendering engine, the console
frame buffer driver can poll a bit in the device rather than wait
for an interrupt. The driver can use pre-allocated memory to render blit data.
DDI or LDI interfaces should not be needed.