ETISS 0.11.2
ExtendableTranslatingInstructionSetSimulator(version0.11.2)
Loading...
Searching...
No Matches
System.cpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSD-3-Clause
2//
3// This file is part of ETISS. It is licensed under the BSD 3-Clause License; you may not use this file except in
4// compliance with the License. You should have received a copy of the license along with this project. If not, see the
5// LICENSE file.
16#include <stdlib.h>
17
18#include "etiss/System.h"
19#include "etiss/jit/System.h"
20#include "etiss/jit/CPU.h"
21
23{
24 return ((etiss::System *)handle)->iread(cpu, addr, length);
25}
26static etiss_int32 system_call_iwrite(void *handle, ETISS_CPU *cpu, etiss_uint64 addr, etiss_uint8 *buffer,
28{
29 return ((etiss::System *)handle)->iwrite(cpu, addr, buffer, length);
30}
31
32static etiss_int32 system_call_dread(void *handle, ETISS_CPU *cpu, etiss_uint64 addr, etiss_uint8 *buffer,
34{
35 return ((etiss::System *)handle)->dread(cpu, addr, buffer, length);
36}
37static etiss_int32 system_call_dwrite(void *handle, ETISS_CPU *cpu, etiss_uint64 addr, etiss_uint8 *buffer,
39{
40 return ((etiss::System *)handle)->dwrite(cpu, addr, buffer, length);
41}
42
44{
45 return ((etiss::System *)handle)->dbg_read(addr, buffer, length);
46}
47
49{
50 return ((etiss::System *)handle)->dbg_write(addr, buffer, length);
51}
52
53#ifdef ETISS_ENABLE_SYNCTIME_EXCEPTIONS
54static etiss_int32
55#else
56static void
57#endif
59{
60#ifdef ETISS_ENABLE_SYNCTIME_EXCEPTIONS
61 return ((etiss::System *)handle)->syncTime(cpu);
62#else
63 ((etiss::System *)handle)->syncTime(cpu);
64#endif
65}
66
67std::shared_ptr<ETISS_System> etiss::wrap(etiss::System *sys)
68{
69 if (sys == 0)
70 return 0;
71 ETISS_System *ret = new ETISS_System();
72
75
78
81
83
84 ret->handle = (void *)sys;
85
86 return std::shared_ptr<ETISS_System>(ret);
87}
88
89#ifdef __cplusplus
90extern "C"
91{
92#endif
94 {
95 return sys->iread != 0 && sys->iwrite != 0 && sys->dread != 0 && sys->dwrite != 0 && sys->syncTime != 0;
96 }
97
98#ifdef __cplusplus
99}
100#endif
101
102namespace etiss
103{
104
105etiss::int32 SimpleSystem::iread(ETISS_CPU *cpu, etiss::uint64 addr, etiss::uint32 len)
106{
107 // disabled since this read function is only intended for timing purpose
108 // if (!read(false,cpu,addr,0,len))
109 // return IBUS_READ_ERROR;
110
111 return 0;
112}
113etiss::int32 SimpleSystem::iwrite(ETISS_CPU *cpu, etiss::uint64 addr, etiss::uint8 *buf, etiss::uint32 len)
114{
115 if (!write(false, cpu, addr, buf, len))
116 return etiss::RETURNCODE::IBUS_WRITE_ERROR;
117
118 return 0;
119}
120etiss::int32 SimpleSystem::dread(ETISS_CPU *cpu, etiss::uint64 addr, etiss::uint8 *buf, etiss::uint32 len)
121{
122 if (!read(false, cpu, addr, buf, len))
123 return etiss::RETURNCODE::DBUS_READ_ERROR;
124
125 return 0;
126}
127etiss::int32 SimpleSystem::dwrite(ETISS_CPU *cpu, etiss::uint64 addr, etiss::uint8 *buf, etiss::uint32 len)
128{
129 if (!write(false, cpu, addr, buf, len))
130 return etiss::RETURNCODE::IBUS_WRITE_ERROR;
131
132 return 0;
133}
134etiss::int32 SimpleSystem::dbg_read(etiss::uint64 addr, etiss::uint8 *buf, etiss::uint32 len)
135{
136 if (!read(true, 0, addr, buf, len))
137 return etiss::RETURNCODE::DBUS_READ_ERROR;
138
139 return 0;
140}
141etiss::int32 SimpleSystem::dbg_write(etiss::uint64 addr, etiss::uint8 *buf, etiss::uint32 len)
142{
143 if (!write(true, 0, addr, buf, len))
144 return etiss::RETURNCODE::DBUS_WRITE_ERROR;
145
146 return 0;
147}
148#ifdef ETISS_ENABLE_SYNCTIME_EXCEPTIONS
149etiss::int32
150#else
151void
152#endif
154{
155#ifdef ETISS_ENABLE_SYNCTIME_EXCEPTIONS
156 return etiss::RETURNCODE::NOERROR;
157#endif
158}
159etiss::int32 dbg_print(etiss::uint32 reg)
160{
161 // NOP
162 return 0;
163}
164} // namespace etiss
static void system_call_syncTime(void *handle, ETISS_CPU *cpu)
Definition System.cpp:58
static etiss_int32 system_call_dbg_read(void *handle, etiss_uint64 addr, etiss_uint8 *buffer, etiss_uint32 length)
Definition System.cpp:43
static etiss_int32 system_call_iread(void *handle, ETISS_CPU *cpu, etiss_uint64 addr, etiss_uint32 length)
Definition System.cpp:22
static etiss_int32 system_call_dwrite(void *handle, ETISS_CPU *cpu, etiss_uint64 addr, etiss_uint8 *buffer, etiss_uint32 length)
Definition System.cpp:37
static etiss_int32 system_call_dread(void *handle, ETISS_CPU *cpu, etiss_uint64 addr, etiss_uint8 *buffer, etiss_uint32 length)
Definition System.cpp:32
int ETISS_System_isvalid(ETISS_System *sys)
Definition System.cpp:93
static etiss_int32 system_call_dbg_write(void *handle, etiss_uint64 addr, etiss_uint8 *buffer, etiss_uint32 length)
Definition System.cpp:48
static etiss_int32 system_call_iwrite(void *handle, ETISS_CPU *cpu, etiss_uint64 addr, etiss_uint8 *buffer, etiss_uint32 length)
Definition System.cpp:26
uint64_t etiss_uint64
Definition types.h:58
uint32_t etiss_uint32
Definition types.h:55
uint8_t etiss_uint8
Definition types.h:49
int32_t etiss_int32
Definition types.h:54
virtual etiss::int32 dread(ETISS_CPU *cpu, etiss::uint64 addr, etiss::uint8 *buf, etiss::uint32 len)
Data read operation.
Definition System.cpp:120
virtual etiss::int32 dwrite(ETISS_CPU *cpu, etiss::uint64 addr, etiss::uint8 *buf, etiss::uint32 len)
Data write operation.
Definition System.cpp:127
virtual etiss::int32 iread(ETISS_CPU *cpu, etiss::uint64 addr, etiss::uint32 len)
Instruction read operation.
Definition System.cpp:105
virtual bool write(bool debug, ETISS_CPU *cpu, etiss::uint64 addr, etiss::uint8 *buf, etiss::uint32 len)=0
virtual etiss::int32 dbg_read(etiss::uint64 addr, etiss::uint8 *buf, etiss::uint32 len)
Debug read operation.
Definition System.cpp:134
virtual etiss::int32 dbg_write(etiss::uint64 addr, etiss::uint8 *buf, etiss::uint32 len)
Debug write operation.
Definition System.cpp:141
virtual bool read(bool debug, ETISS_CPU *cpu, etiss::uint64 addr, etiss::uint8 *buf, etiss::uint32 len)=0
virtual etiss::int32 iwrite(ETISS_CPU *cpu, etiss::uint64 addr, etiss::uint8 *buf, etiss::uint32 len)
Instruction write operation.
Definition System.cpp:113
virtual void syncTime(ETISS_CPU *cpu)
Synchronize simulation time.
Definition System.cpp:153
System Interface for the basic system IO operations and time synchronization.
Definition System.h:38
conatins a convinience class that can be wrapped as a ETISS_System structure
forwards: include/jit/*
Definition Benchmark.h:17
etiss::int32 dbg_print(etiss::uint32 reg)
Definition System.cpp:159
std::shared_ptr< ETISS_System > wrap(etiss::System *sys)
wraps a etiss::System in a ETISS_System structure.
Definition System.cpp:67
float __ovld __cnfn length(float p)
Return the length of vector p, i.e., sqrt(p.x2 + p.y 2 + ...)
basic cpu state structure needed for execution of any cpu architecture.
Definition CPU.h:51
memory access and time synchronization functions.
Definition System.h:40
etiss_int32(* dwrite)(void *handle, ETISS_CPU *cpu, etiss_uint64 addr, etiss_uint8 *buffer, etiss_uint32 length)
write data
Definition System.h:59
etiss_int32(* iread)(void *handle, ETISS_CPU *cpu, etiss_uint64 addr, etiss_uint32 length)
used to simulate an instruction fetch.
Definition System.h:46
void * handle
custom handle that will be passed to the functions of this structure
Definition System.h:81
etiss_int32(* dbg_write)(void *handle, etiss_uint64 addr, etiss_uint8 *buffer, etiss_uint32 length)
direct debug write
Definition System.h:70
etiss_int32(* dbg_read)(void *handle, etiss_uint64 addr, etiss_uint8 *buffer, etiss_uint32 length)
direct debug read
Definition System.h:66
etiss_int32(* dread)(void *handle, ETISS_CPU *cpu, etiss_uint64 addr, etiss_uint8 *buffer, etiss_uint32 length)
read data
Definition System.h:55
void(* syncTime)(void *handle, ETISS_CPU *cpu)
called after a block to synchronize the time
Definition System.h:79
etiss_int32(* iwrite)(void *handle, ETISS_CPU *cpu, etiss_uint64 addr, etiss_uint8 *buffer, etiss_uint32 length)
write instruction data over instruction bus
Definition System.h:50