Hi -

On 2017-10-13 at 11:30 'Dmitry Vyukov' via Akaros wrote:
> I need to skip faulting operations in a C program. On linux I do the 
> following:

> [snip]

> Is it possible to return from handler and alter thread's context? Just
> altering RIP would do, because I can set RIP a another function which
> will longjmp.

This is definitely doable on Akaros, though not with a long jump from a
signal handler.  Our POSIX support isn't 100%, esp for signal handling.

The trick is to cast the ucontext to struct user_context.  Then you can
modify rip in place.  The structs are in kern/include/ros/trapframe.h
and kern/arch/x86/ros/trapframe64.h.


Example:

#include <stdlib.h>
#include <parlib/stdio.h>
#include <parlib/parlib.h>
#include <unistd.h>
#include <signal.h>
#include <pthread.h>

static void sig_action(int signr, siginfo_t *info, void *__ctx)
{
        struct user_context *u_ctx = __ctx;

        printf("Got posix signal %d, info %p, u_ctx %p\n", signr, info, u_ctx);
        assert(u_ctx->type = ROS_HW_CTX);
        u_ctx->tf.hw_tf.tf_rip += 8;
}

struct sigaction sigact = {.sa_sigaction = sig_action, 0};

int main(int argc, char **argv)
{
        pthread_self(); /* force usage of pthread 2LS, which supports signals */
        sigaction(SIGSEGV, &sigact, 0);
        printf("Hello world from program %s!!\n", argv[0]);
        /* 8 byte instruction */
        asm volatile("movq 0x0, %%rax" : : : "eax");
        printf("continued!!\n");
        return 0;
}

> Is there any way to turn "Uthread sighandler faulted" into a
> non-error? I don't see why it should terminate my program. Faulting in
> a signal handler should be OK.

Probably, though it'd make our signal handling more difficult.  Right
now, every uthread can run a signal handler as part of an alternate
context.  But it doesn't nest yet. (user/parlib/signal.c L 179 or so).
This is probably why you were able to longjmp out of the signal handler
just once.  The first time, you got out, but the uthread thought it was
still in the signal handling mode.  If you need this to work, I can try
and sort it out.

Thanks,

Barret

-- 
You received this message because you are subscribed to the Google Groups 
"Akaros" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to