#define RAMSIZE (64 * 1024 * 1024)
#define PROGSTART 0x20000000
+enum {
+ SPR_LR,
+};
+
static void nukenewline(char buf[]) {
unsigned i;
for (i = 0; buf[i]; i++) {
exit(0);
}
-static void parseregs(const char name[], const uint8_t gpr) {
+static void parseregs(const char name[], const uint8_t gpr, struct kvm_regs *regs,
+ struct kvm_fpu *fpregs) {
FILE *f = fopen(name, "r");
if (!f) {
const uint64_t val = strtol(ptr, NULL, 0);
- // TODO apply reg
+ // apply reg
if (gpr) {
+ regs->gpr[reg] = val;
} else {
+ fpregs->fpr[reg] = val;
}
}
fclose(f);
}
-static void parsesprs(const char name[]) {
+static void parsesprs(const char name[], struct kvm_regs *regs) {
FILE *f = fopen(name, "r");
if (!f) {
#define check(a) if (!strncasecmp(buf, a, sizeof(a) - 1))
check("LR:") {
- // TODO reg = ;
+ reg = SPR_LR;
}
#undef check
const uint64_t val = strtol(ptr, NULL, 0);
- // TODO apply reg
+ // apply reg
+ switch (reg) {
+ case SPR_LR:
+ regs->lr = val;
+ break;
+ }
}
fclose(f);
struct kvm_run *run;
struct kvm_regs regs;
struct kvm_sregs sregs;
+ struct kvm_fpu fpregs;
int kvm, vmfd, vcpu;
FILE *binary = NULL, *trace = NULL;
char dumps[MAXDUMPS][PATH_MAX];
uint8_t *ram, *progmem;
const char *binpath;
+ memset(®s, 0, sizeof(struct kvm_regs));
+ memset(&fpregs, 0, sizeof(struct kvm_fpu));
+
+ regs.lr = -1;
+ regs.pc = PROGSTART;
+
while (1) {
const int c = getopt_long(argc, argv, opts, longopts, NULL);
if (c == -1)
binpath = strdup(optarg);
break;
case 'g':
- parseregs(optarg, 1);
+ parseregs(optarg, 1, ®s, &fpregs);
break;
case 'f':
- parseregs(optarg, 0);
+ parseregs(optarg, 0, ®s, &fpregs);
break;
case 's':
- parsesprs(optarg);
+ parsesprs(optarg, ®s);
break;
case 'l':
load(optarg);
const unsigned binlen = ftell(binary);
rewind(binary);
- printf("Loading binary %u bytes\n", binlen); // TODO
+ printf("Loading binary %u bytes\n", binlen);
if (posix_memalign((void **) &progmem, 64 * 1024, binlen))
abort();