.\" $NetBSD: cnmagic.9,v 1.3 2001/06/05 12:54:35 wiz Exp $ .\" .\" Copyright (c) 2000 Eduardo Horvath .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed for the .\" NetBSD Project. See http://www.netbsd.org/ for .\" information about NetBSD. .\" 4. The name of the author may not be used to endorse or promote products .\" derived from this software without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR .\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES .\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. .\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, .\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT .\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, .\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY .\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" .\" --(license Id: LICENSE.proto,v 1.1 2000/06/13 21:40:26 cgd Exp )-- .\" .Dd November 11, 2000 .Dt CNMAGIC 9 .Os .Sh NAME .Nm cn_trap , .Nm cn_isconsole , .Nm cn_check_magic , .Nm cn_init_magic , .Nm cn_set_magic , .Nm cn_get_magic , .Nm cn_destroy_magic .Nd console magic key sequence management .Sh SYNOPSIS .Fd #include .Va typedef struct cnm_state cnm_state_t; .Ft void .Fn cn_trap .Ft int .Fn cn_isconsole "dev_t dev" .Ft void .Fn cn_check_magic "dev_t dev" "int k" "cnm_state_t *cnms" .Ft void .Fn cn_init_magic "cnm_state_t *cnms" .Ft int .Fn cn_set_magic "char *magic" .Ft int .Fn cn_get_magic "char *magic" "int len" .Ft void .Fn cn_destroy_magic "cnm_state_t *cnms" .Sh DESCRIPTION The .Nx console magic key sequence management framework is designed to provide flexible methods to set, change, and detect magic key sequences on console devices and break into the debugger or rom monitor with a minimum of interrupt latency. .Pp Drivers that generate console input should make use of these routines. A different .Va cnm_state_t should be used for each separate input stream. Multiple devices that share the same input stream, such as USB keyboards can share the same .Va cnm_state_t . Once a .Va cnm_state_t is allocated, it should be initialized with .Fn cn_init_magic so it can be used by .Fn cn_check_magic . If a driver thinks it might be the console input device it can set the magic sequence with .Fn cn_set_magic to any arbitrary string. Whenever the driver recieves input, it should call .Fn cn_check_magic to process the data and determine wheter the magic sequence has been hit. .Pp The magic key sequence can be accessed through the .Va hw.cnmagic .Ic sysctl variable. This is the raw data and may be keycodes rather than processed characters, depending on the console deivce. .Pp Here is a description of the console magic interface: .Bl -tag -width indent .It Fn "void cn_init_magic" "cnm_state_t *cnm" .Pp Initialize the console magic state pointed to by .Fa cnm to a useable state. .It Fn "void cnm_trap" .Pp Trap into the kernel debugger or rom monitor. By default this routine is defined to be .Fn console_debugger but can be overriden in MI header files. .It Fn "int cn_isconsole" "dev_t dev" .Pp Determine whether a given .Fa dev is the system console. This macro tests to see if .Fa dev is the same as .Va cn_tab->cn_dev but can be overriden in MI header files. .It Fn "void cn_check_magic" "dev_t dev" "int k" "cnm_state_t *cnms" .Pp All input shoult be passed through .Fn cn_check_magic so the state machine remains in a consistent state. .Fn cn_check_magic calls .Fn cn_isconsole with .Fa dev to determine if this is the console. If that returns true then it runs the input value .Fa k through the state machine. If the state machine completes a match of the current console magic sequence .Fn cn_trap is called. Some input may need to be translated to state machine values such as the serial line .Li BREAK sequence. .It Fn "void cn_destroy_magic" "cnm_state_t *cnms" .Pp This should be called once what .Fa cnms points to is no longer needed. .It Fn "int cn_set_magic" "char *magic" .Fn cn_set_magic encodes a .Li nul terminated string arbitrary string into values that can be used by the state machine and installs it as the global magic sequence. The escape sequence is character value .Li 0x27 and can be used to encode special values: .Pp .Bl -tag -width "0x001" -compact -offset indent .It 0x27 The literal value .Li 0x27 . .It 0x01 Serial .Li BREAK sequence. .It 0x02 .LI Nul character. .El Returns .Li 0 on success or a non-zero error value. .It Fn "int cn_get_magic" "char *magic" "int len" Extract the current magic sequence from the sate machine and return up to .Fa len bytes of it in the buffer pointed to by .Fa magic . It uses the same encoding accepted by .Fn cn_set_magic . Returns .Li 0 on success or a non-zero error value. .El .Sh AUTHOR The .Nx console magic key sequence management framework was designed and implemented by Eduardo Horvath .Sh SEE ALSO .Xr sysctl 8 .Sh HISTORY The .Nx console magic key sequence management framework first appeared in .Nx 1.6 .