Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
recolic-hust
hust-x86-simulator
Commits
f30d68cb
Commit
f30d68cb
authored
Jan 03, 2020
by
Recolic Keghart
Browse files
Merge branch 'check' into 'pa2'
Check See merge request
!3
parents
b2d955b3
e48eb1ea
Pipeline
#817
passed with stages
in 9 minutes and 51 seconds
Changes
8
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
nemu/include/monitor/watchpoint.h
View file @
f30d68cb
...
...
@@ -17,7 +17,7 @@ struct WP {
bool
evalulate
()
{
auto
new_value
=
evaluate_expr
(
expr
);
std
::
swap
(
new_value
,
curr_value
);
return
new_value
!=
curr_value
;
return
new_value
!=
curr_value
&&
curr_value
!=
0
;
}
WP
(
std
::
string
e
,
int
id
)
:
expr
(
e
),
id
(
id
)
{
evalulate
();
// initial expr value.
...
...
nemu/prebuilt/nemu-eb60a1a27066a289437c541b605da103dc5b71e4
0 → 100755
View file @
f30d68cb
File added
nemu/prebuilt/nemu-nommio-eb60a1a27066a289437c541b605da103dc5b71e4
0 → 100755
View file @
f30d68cb
File added
nemu/src/device/device.cc
View file @
f30d68cb
...
...
@@ -40,8 +40,6 @@ static void timer_sig_handler(int signum) {
Assert
(
ret
==
0
,
"Can not set timer"
);
}
void
device_update
()
{}
// Now an independent thread will do it.
void
device_update_impl
()
{
if
(
update_screen_flag
)
{
update_screen
();
...
...
@@ -72,7 +70,16 @@ void device_update_impl() {
}
}
static
void
device_update_thread_daemon
()
{
void
device_update
()
{
#ifdef ENABLE_ASYNC_RENDER
#else
if
(
device_update_flag
.
exchange
(
false
))
{
device_update_impl
();
}
#endif
}
[[
maybe_unused
]]
static
void
device_update_thread_daemon
()
{
while
(
true
)
{
if
(
device_update_flag
.
exchange
(
false
))
{
device_update_impl
();
...
...
@@ -104,7 +111,9 @@ void init_device() {
ret
=
setitimer
(
ITIMER_VIRTUAL
,
&
it
,
NULL
);
Assert
(
ret
==
0
,
"Can not set timer"
);
#ifdef ENABLE_ASYNC_RENDER
std
::
thread
(
device_update_thread_daemon
).
detach
();
#endif
}
#else
...
...
nemu/src/device/vga.cc
View file @
f30d68cb
...
...
@@ -19,9 +19,11 @@ static uint32_t (*vmem) [SCREEN_W];
static
uint32_t
*
screensize_port_base
;
inline
void
SDL_ErrorCheck
(
int
ret
)
{
#ifdef DEBUG
if
(
ret
!=
0
)
{
rlib
::
println
(
"SDL_Error: ret="
,
ret
,
", GETERR="
,
SDL_GetError
());
}
#endif
}
static
void
init_vga_impl
()
{
...
...
@@ -38,7 +40,9 @@ static void init_vga_impl() {
void
update_screen
()
{
#ifndef DISABLE_MMIO
#ifdef ENABLE_ASYNC_RENDER
if
(
window
==
nullptr
)
init_vga_impl
();
#endif
SDL_ErrorCheck
(
SDL_UpdateTexture
(
texture
,
NULL
,
vmem
,
SCREEN_W
*
sizeof
(
vmem
[
0
][
0
])));
SDL_ErrorCheck
(
SDL_RenderClear
(
renderer
));
SDL_ErrorCheck
(
SDL_RenderCopy
(
renderer
,
texture
,
NULL
,
NULL
));
...
...
@@ -47,8 +51,12 @@ void update_screen() {
}
void
init_vga
()
{
#ifdef ENABLE_ASYNC_RENDER
// Because of fucking SDL design, vga_init should be done in updating thread.
// Do nothing in main thread.
#else
init_vga_impl
();
#endif
}
#endif
/* HAS_IOE */
nemu/src/monitor/debug/expr_impl/lexer.l
View file @
f30d68cb
...
...
@@ -13,7 +13,7 @@
%%
[ \t\n] {}
0
x
[0-9a-f]+ {yylval.ival = (int)strtol(yytext, NULL, 16); return T_INT;}
0
[xX]
[0-9a-f]+ {yylval.ival = (int)strtol(yytext, NULL, 16); return T_INT;}
[0-9]+ {yylval.ival = atoi(yytext); return T_INT;}
"==" {return T_EQUAL;}
"!=" {return T_NEQUAL;}
...
...
@@ -21,6 +21,7 @@
[-+*/()] {return yytext[0];}
"%"[a-z]{3} {yylval.ival = ((uint32_t)yytext[2] << 8) + yytext[3]; return T_REG;}
"$"[a-z]{3} {yylval.ival = ((uint32_t)yytext[2] << 8) + yytext[3]; return T_REG;}
. {throw std::runtime_error(std::string("lexer error around token: ") + yytext);}
%%
// Registers: eax='a'+'x', ebx='b'+'x', ...
nemu/src/monitor/debug/ui.cc
View file @
f30d68cb
...
...
@@ -70,6 +70,7 @@ static struct {
{
"help"
,
"Display informations about all supported commands"
,
cmd_help
},
{
"c"
,
"Continue the execution of the program"
,
cmd_c
},
{
"n"
,
"= GDB `n`"
,
cmd_n
},
{
"si"
,
"= GDB `n`"
,
cmd_n
},
{
"info"
,
"= GDB `info`, supporting `info r` / `info w`"
,
cmd_info
},
{
"x"
,
"x <bytes> <startAddr or expr>, dump memory content."
,
cmd_x
},
{
"w"
,
"w <expr>, add watchpoint for $expr"
,
cmd_w
},
...
...
@@ -201,7 +202,7 @@ static int cmd_w(char *_args) {
if
(
_args
==
NULL
)
throw
std
::
invalid_argument
(
"w <expr>"
);
watchpoints
.
emplace_front
(
std
::
string
(
_args
),
++
max_watchpoint_id
);
watchpoints
.
emplace_front
(
std
::
string
(
_args
),
max_watchpoint_id
++
);
auto
iter
=
watchpoints
.
begin
();
// not thread-safe.
rlib
::
println
(
"Add watchpoint:"
,
*
iter
);
return
0
;
...
...
nexus-am/apps/typing/draw.c
View file @
f30d68cb
#include
"game.h"
//
#define SCREEN_STRETCH
#define SCREEN_STRETCH
static
uint32_t
canvas
[
H
][
W
];
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment