Files
linux-kernel-module-cheat/kernel_module/user/m5ops.c
Ciro Santilli 6d51da52bb gem5: add m5 fail 1 to /m5op.out
Document that m5 fail is not actually exiting status 1 on fs.py.
2018-08-24 16:56:19 +01:00

91 lines
1.9 KiB
C

/* https://github.com/cirosantilli/linux-kernel-module-cheat#m5ops-instructions */
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#define ENABLED 1
#if defined(__arm__)
static void m5_checkpoint(void)
{
__asm__ __volatile__ ("mov r0, #0; mov r1, #0; mov r2, #0; mov r3, #0; .inst 0xEE000110 | (0x43 << 16);");
};
static void m5_dump_stats(void)
{
__asm__ __volatile__ ("mov r0, #0; mov r1, #0; mov r2, #0; mov r3, #0; .inst 0xEE000110 | (0x41 << 16);");
};
static void m5_exit()
{
__asm__ __volatile__ ("mov r0, #0; .inst 0xEE000110 | (0x21 << 16);");
};
static void m5_fail_1(void)
{
__asm__ __volatile__ ("mov r0, #0; mov r1, #0; mov r2, #1; mov r3, #0; .inst 0xEE000110 | (0x22 << 16);");
};
static void m5_reset_stats(void)
{
__asm__ __volatile__ ("mov r0, #0; mov r1, #0; mov r2, #0; mov r3, #0; .inst 0xEE000110 | (0x40 << 16);");
};
#elif defined(__aarch64__)
static void m5_checkpoint(void)
{
__asm__ __volatile__ ("mov x0, #0; mov x1, #0; .inst 0xFF000110 | (0x43 << 16);");
};
static void m5_dump_stats(void)
{
__asm__ __volatile__ ("mov x0, #0; mov x1, #0; .inst 0xFF000110 | (0x41 << 16);");
};
static void m5_exit(void)
{
__asm__ __volatile__ ("mov x0, #0; .inst 0XFF000110 | (0x21 << 16);");
};
static void m5_fail_1(void)
{
__asm__ __volatile__ ("mov x0, #0; mov x1, #1; .inst 0xFF000110 | (0x22 << 16);");
};
static void m5_reset_stats(void)
{
__asm__ __volatile__ ("mov x0, #0; mov x1, #0; .inst 0XFF000110 | (0x40 << 16);");
};
#else
#undef ENABLED
#define ENABLED 0
#endif
int main(
#if ENABLED
int argc, char **argv
#else
void
#endif
)
{
#if ENABLED
char action;
if (argc > 1) {
action = argv[1][0];
} else {
action = 'e';
}
switch (action)
{
case 'c':
m5_checkpoint();
break;
case 'd':
m5_dump_stats();
break;
case 'e':
m5_exit();
break;
case 'f':
m5_fail_1();
break;
case 'r':
m5_reset_stats();
break;
}
#endif
return EXIT_SUCCESS;
}