71 lines
1.2 KiB
C++
71 lines
1.2 KiB
C++
|
#define XBYAK_NO_OP_NAMES
|
||
|
#include <xbyak/xbyak.h>
|
||
|
|
||
|
struct Code1 : Xbyak::CodeGenerator {
|
||
|
Code1()
|
||
|
: Xbyak::CodeGenerator(4096, Xbyak::DontSetProtectRWE)
|
||
|
{
|
||
|
mov(eax, 123);
|
||
|
ret();
|
||
|
}
|
||
|
void update()
|
||
|
{
|
||
|
db(0);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
void test1(bool updateCode)
|
||
|
{
|
||
|
Code1 c;
|
||
|
c.setProtectModeRE();
|
||
|
if (updateCode) c.update(); // segmentation fault
|
||
|
int (*f)() = c.getCode<int (*)()>();
|
||
|
printf("f=%d\n", f());
|
||
|
|
||
|
c.setProtectModeRW();
|
||
|
c.update();
|
||
|
puts("ok");
|
||
|
}
|
||
|
|
||
|
struct Code2 : Xbyak::CodeGenerator {
|
||
|
Code2()
|
||
|
: Xbyak::CodeGenerator(4096, Xbyak::AutoGrow)
|
||
|
{
|
||
|
mov(eax, 123);
|
||
|
ret();
|
||
|
}
|
||
|
void update()
|
||
|
{
|
||
|
db(0);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
void test2(bool updateCode)
|
||
|
{
|
||
|
Code2 c;
|
||
|
c.readyRE();
|
||
|
if (updateCode) c.update(); // segmentation fault
|
||
|
int (*f)() = c.getCode<int (*)()>();
|
||
|
printf("f=%d\n", f());
|
||
|
|
||
|
c.setProtectModeRW();
|
||
|
c.update();
|
||
|
puts("ok");
|
||
|
}
|
||
|
|
||
|
int main(int argc, char *argv[])
|
||
|
{
|
||
|
if (argc < 2) {
|
||
|
fprintf(stderr, "%s <testNum> [update]\n", argv[0]);
|
||
|
return 0;
|
||
|
}
|
||
|
bool update = argc == 3;
|
||
|
int n = atoi(argv[1]);
|
||
|
printf("n=%d update=%d\n", n, update);
|
||
|
switch (n) {
|
||
|
case 1: test1(update); break;
|
||
|
case 2: test2(update); break;
|
||
|
default: fprintf(stderr, "no test %d\n", n); break;
|
||
|
}
|
||
|
}
|