1 /* emulos.c -- Small OS emulation
2 Copyright 1999-2019 Free Software Foundation, Inc.
3 Written by Stephane Carrez (stcarrez@worldnet.fr)
5 This file is part of GDB, GAS, and the GNU binutils.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
26 #include <sys/types.h>
29 /* This file emulates some OS system calls.
30 It's basically used to give access to the host OS facilities
31 like: stdin, stdout, files, time of day. */
32 static int bench_mode
= -1;
33 static struct timeval bench_start
;
34 static struct timeval bench_stop
;
37 emul_bench (sim_cpu
*cpu
)
46 gettimeofday (&bench_start
, 0);
50 gettimeofday (&bench_stop
, 0);
52 printf ("bench start not called...\n");
59 int addr
= cpu_get_x (cpu
);
60 double t_start
, t_stop
, t
;
64 t_start
= (double) (bench_start
.tv_sec
) * 1.0e6
;
65 t_start
+= (double) (bench_start
.tv_usec
);
66 t_stop
= (double) (bench_stop
.tv_sec
) * 1.0e6
;
67 t_stop
+= (double) (bench_stop
.tv_usec
);
71 buf
[sz
] = memory_read8 (cpu
, addr
);
81 printf ("bench_stop not called");
85 printf ("%-40.40s [%6d] %3.3f us\n", buf
,
86 op
, t
/ (double) (op
));
94 emul_write (sim_cpu
*cpu
)
96 int addr
= cpu_get_x (cpu
) & 0x0FFFF;
97 int size
= cpu_get_d (cpu
) & 0x0FFFF;
99 if (addr
+ size
> 0x0FFFF) {
100 size
= 0x0FFFF - addr
;
102 cpu
->cpu_running
= 0;
105 uint8 val
= memory_read8 (cpu
, addr
);
113 /* emul_exit () is used by the default startup code of GCC to implement
114 the exit (). For a real target, this will create an ILLEGAL fault.
115 But doing an exit () on a real target is really a non-sense.
116 exit () is important for the validation of GCC. The exit status
117 is passed in 'D' register. */
119 emul_exit (sim_cpu
*cpu
)
121 sim_engine_halt (CPU_STATE (cpu
), cpu
,
122 NULL
, NULL_CIA
, sim_exited
,
127 emul_os (int code
, sim_cpu
*cpu
)
129 cpu
->cpu_current_cycle
= 8;