diff --git a/executer/kernel/control.c b/executer/kernel/control.c index 6fb89685..60df3cda 100644 --- a/executer/kernel/control.c +++ b/executer/kernel/control.c @@ -87,8 +87,8 @@ static long mcexec_prepare_image(ihk_os_t os, wait_event_interruptible(usrdata->wq_prepare, pdesc->status); - if(pdesc->err == -1){ - ret = -EFAULT; + if(pdesc->err < 0){ + ret = pdesc->err; goto free_out; } diff --git a/executer/kernel/ikc.c b/executer/kernel/ikc.c index eb2db620..4f1dbed1 100644 --- a/executer/kernel/ikc.c +++ b/executer/kernel/ikc.c @@ -35,7 +35,7 @@ static int syscall_packet_handler(struct ihk_ikc_channel_desc *c, break; case SCD_MSG_PREPARE_PROCESS_NACKED: - mcexec_prepare_ack(__os, pisp->arg, -1); + mcexec_prepare_ack(__os, pisp->arg, pisp->err); break; case SCD_MSG_SYSCALL_ONESIDE: diff --git a/executer/kernel/mcctrl.h b/executer/kernel/mcctrl.h index 36f1a162..88d7a3ff 100644 --- a/executer/kernel/mcctrl.h +++ b/executer/kernel/mcctrl.h @@ -24,6 +24,7 @@ struct ikc_scd_packet { int msg; int ref; + int err; unsigned long arg; }; diff --git a/kernel/host.c b/kernel/host.c index 147c2b22..cd9e9b9d 100644 --- a/kernel/host.c +++ b/kernel/host.c @@ -367,6 +367,7 @@ static int syscall_packet_handler(struct ihk_ikc_channel_desc *c, { struct ikc_scd_packet *packet = __packet; struct ikc_scd_packet pckt; + int rc; switch (packet->msg) { case SCD_MSG_INIT_CHANNEL_ACKED: @@ -375,10 +376,14 @@ static int syscall_packet_handler(struct ihk_ikc_channel_desc *c, return 0; case SCD_MSG_PREPARE_PROCESS: - if(process_msg_prepare_process(packet->arg) == 0) + if((rc = process_msg_prepare_process(packet->arg)) == 0){ pckt.msg = SCD_MSG_PREPARE_PROCESS_ACKED; - else + pckt.err = 0; + } + else{ pckt.msg = SCD_MSG_PREPARE_PROCESS_NACKED; + pckt.err = rc; + } pckt.ref = packet->ref; pckt.arg = packet->arg; syscall_channel_send(c, &pckt); diff --git a/kernel/include/syscall.h b/kernel/include/syscall.h index 16f8c75a..5622af0e 100644 --- a/kernel/include/syscall.h +++ b/kernel/include/syscall.h @@ -73,6 +73,7 @@ struct user_desc { struct ikc_scd_packet { int msg; int ref; + int err; unsigned long arg; };