view src/impl/KernelError.cbc @ 378:297515214d9b

add SyscallEntry interface
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Mon, 13 Jul 2020 16:09:22 +0900
parents f0b337cb6024
children 3f243b59bcee
line wrap: on
line source

#include "param.h"
#include "proc.h"
#interface "Err.h"

// ----
// typedef struct KernelError <Type, Isa> impl Error {
//   __code infinity_loop(Type* error, next(...));
// } KernelError;
// ----

Err* createKernelError(struct Context* cbc_context) {
    struct Err* err  = new Err();
    struct KernelError* kernel_error = new KernelError();
    err->err = (union Data*)kernel_error;
    kernel_error->err = (union Data*)kernel_error;
    kernel_error->infinity_loop = C_infinity_loopKernelError;
    err->error = C_errorKernelError;
    err->panic = C_panicKernelError;
    return err;
}

__code infinity_loopKernelError(struct KernelError* err, __code next(...)) {
  goto next(...);
}

__code errorKernelError(struct KernelError* err, int err_code, __code next(...)) {

    goto next(...);
}

__code panicKernelError(struct KernelError* err, char* msg) {
    cli();
    cons.locking = 0;

    cprintf("cpu%d: panic: ", cpu->id);

    show_callstk(msg);
    panicked = 1; // freeze other CPU

    goto infinity_loopKernelError(err, err->inifinity_loop);
}