| /* 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 |