| /*  This file is part of the program psim. | 
 |  | 
 |     Copyright (C) 1994-1997, Andrew Cagney <cagney@highland.com.au> | 
 |  | 
 |     This program is free software; you can redistribute it and/or modify | 
 |     it under the terms of the GNU General Public License as published by | 
 |     the Free Software Foundation; either version 3 of the License, or | 
 |     (at your option) any later version. | 
 |  | 
 |     This program is distributed in the hope that it will be useful, | 
 |     but WITHOUT ANY WARRANTY; without even the implied warranty of | 
 |     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
 |     GNU General Public License for more details. | 
 |   | 
 |     You should have received a copy of the GNU General Public License | 
 |     along with this program; if not, see <http://www.gnu.org/licenses/>. | 
 |   | 
 |     */ | 
 |  | 
 |  | 
 | #ifndef _EMUL_CHIRP_H_ | 
 | #define _EMUL_CHIRP_H_ | 
 |  | 
 | /* EMUL_CHIRP: | 
 |  | 
 |    The emulation of the OpenBoot client interface (as defined in 1275) | 
 |    illustrates how it is possible for PSIM to implement an interface | 
 |    that is both running in virtual memory and is called using a | 
 |    standard function call interface. | 
 |  | 
 |    The OpenBoot client interface is implemented by using two | 
 |    instructions: | 
 |  | 
 |    	client_interface: | 
 | 		<emul_call> | 
 | 		blr | 
 |  | 
 |    A client program makes a function call to `client_interface' using | 
 |    the `bl' instruction.  The simulator will then execute the | 
 |    <emul_call> instruction (which calls emul_chirp) and then the `blr' | 
 |    which will return to the caller. | 
 |  | 
 |    In addition to providing the `client_interface' entry point, while | 
 |    a client request is being handled, emul_chirp patches (well it will | 
 |    one day) the data access exception vector with a <emul_call> | 
 |    instruction.  By doing this, emul_chirp is able to catch and handle | 
 |    any invalid data accesses it makes while emulating a client call. | 
 |  | 
 |    When such an exception occures, emul_chirp is able to recover by | 
 |    restoring the processor and then calling the clients callback | 
 |    interface so that the client can recover from the data exception. | 
 |  | 
 |    Handling this are the emul_chirp states: | 
 |  | 
 |                               serving---. | 
 |                              /          | | 
 |    Emulation compleated     ^           v Client makes call to | 
 |      - restore int vectors  |           | emulated interface | 
 |                             ^           v   - patch exception vectors | 
 |                             |          / | 
 |                             `-emulating-. emulating the request | 
 |                              /          | | 
 |                             |           v Emulation encounters | 
 |    Client callback recovers ^           | data access exception | 
 |    from data exception and  |           v   - re-enable vm | 
 |    returns.                 ^           |   - call client callback | 
 |      - restart request      |          / | 
 |                             `--faulting | 
 |    */ | 
 |  | 
 |  | 
 | extern const os_emul emul_chirp; | 
 |  | 
 | #endif |