| [258] | 1 | /////////////////////////////////////////////////////////////////////////////////// | 
|---|
 | 2 | // File     : sim_driver.c | 
|---|
 | 3 | // Date     : 23/11/2013 | 
|---|
 | 4 | // Author   : alain greiner / cesar fuguet | 
|---|
 | 5 | // Copyright (c) UPMC-LIP6 | 
|---|
 | 6 | /////////////////////////////////////////////////////////////////////////////////// | 
|---|
 | 7 | // The sim_driver.c and sim_driver.h files are part ot the GIET-VM nano-kernel. | 
|---|
 | 8 | // This driver supports the vci_sim_helper component. | 
|---|
 | 9 | // There is at most one such component in the architecture. | 
|---|
| [320] | 10 | // | 
|---|
 | 11 | // The SEG_SIM_BASE address must be defined in the hard_config.h file. | 
|---|
| [258] | 12 | //////////////////////////////////////////////////////////////////////////////// | 
|---|
 | 13 |  | 
|---|
| [320] | 14 | #include <hard_config.h> | 
|---|
| [258] | 15 | #include <giet_config.h> | 
|---|
 | 16 | #include <sim_driver.h> | 
|---|
 | 17 |  | 
|---|
| [320] | 18 | #if !defined(SEG_SIM_BASE)  | 
|---|
 | 19 | # error: You must define SEG_SIM_BASE in the hard_config.h file | 
|---|
 | 20 | #endif | 
|---|
 | 21 |  | 
|---|
| [258] | 22 | //////////////////////////////////////////////////////////////////////////////// | 
|---|
 | 23 | // _sim_helper_access() | 
|---|
 | 24 | // Accesses the Simulation Helper Component. | 
|---|
 | 25 | // | 
|---|
 | 26 | // If the access is on a writable register (except SIMHELPER_PAUSE_SIM), | 
|---|
 | 27 | // the simulation will stop. | 
|---|
 | 28 | // If the access is on a readable register, value is written in retval buffer. | 
|---|
 | 29 | // Returns 0 on success, 1 on failure. | 
|---|
 | 30 | //////////////////////////////////////////////////////////////////////////////// | 
|---|
 | 31 | unsigned int _sim_helper_access( unsigned int register_index, | 
|---|
 | 32 |                                  unsigned int value, | 
|---|
 | 33 |                                  unsigned int * retval)  | 
|---|
 | 34 | { | 
|---|
| [345] | 35 |     volatile unsigned int* sim_helper_address = (unsigned int*)&seg_sim_base; | 
|---|
| [258] | 36 |      | 
|---|
 | 37 |     if (register_index == SIMHELPER_SC_STOP         || | 
|---|
 | 38 |         register_index == SIMHELPER_END_WITH_RETVAL || | 
|---|
 | 39 |         register_index == SIMHELPER_EXCEPT_WITH_VAL || | 
|---|
 | 40 |         register_index == SIMHELPER_PAUSE_SIM       || | 
|---|
 | 41 |         register_index == SIMHELPER_SIGINT)  | 
|---|
 | 42 |     { | 
|---|
 | 43 |         sim_helper_address[register_index] = value; | 
|---|
 | 44 |         return 0; | 
|---|
 | 45 |     } | 
|---|
 | 46 |     else if (register_index == SIMHELPER_CYCLES)  | 
|---|
 | 47 |     { | 
|---|
 | 48 |         *retval = sim_helper_address[register_index]; | 
|---|
 | 49 |         return 0; | 
|---|
 | 50 |     } | 
|---|
 | 51 |     else  | 
|---|
 | 52 |     { | 
|---|
 | 53 |         _tty_get_lock( 0 ); | 
|---|
 | 54 |         _puts("\n[GIET ERROR] in _sim_helper_access() : access to unmapped register\n"); | 
|---|
 | 55 |         _tty_release_lock( 0 ); | 
|---|
 | 56 |         return 1; | 
|---|
 | 57 |     } | 
|---|
 | 58 | } | 
|---|
 | 59 |  | 
|---|
 | 60 | // Local Variables: | 
|---|
 | 61 | // tab-width: 4 | 
|---|
 | 62 | // c-basic-offset: 4 | 
|---|
 | 63 | // c-file-offsets:((innamespace . 0)(inline-open . 0)) | 
|---|
 | 64 | // indent-tabs-mode: nil | 
|---|
 | 65 | // End: | 
|---|
 | 66 | // vim: filetype=c:expandtab:shiftwidth=4:tabstop=4:softtabstop=4 | 
|---|
 | 67 |  | 
|---|