add error handling for prepare_process
This commit is contained in:
@ -30,6 +30,7 @@ struct program_load_desc {
|
|||||||
int status;
|
int status;
|
||||||
int cpu;
|
int cpu;
|
||||||
int pid;
|
int pid;
|
||||||
|
int err;
|
||||||
unsigned long entry;
|
unsigned long entry;
|
||||||
unsigned long user_start;
|
unsigned long user_start;
|
||||||
unsigned long user_end;
|
unsigned long user_end;
|
||||||
|
|||||||
@ -87,6 +87,11 @@ static long mcexec_prepare_image(ihk_os_t os,
|
|||||||
|
|
||||||
wait_event_interruptible(usrdata->wq_prepare, pdesc->status);
|
wait_event_interruptible(usrdata->wq_prepare, pdesc->status);
|
||||||
|
|
||||||
|
if(pdesc->err == -1){
|
||||||
|
ret = -EFAULT;
|
||||||
|
goto free_out;
|
||||||
|
}
|
||||||
|
|
||||||
usrdata->rpgtable = pdesc->rpgtable;
|
usrdata->rpgtable = pdesc->rpgtable;
|
||||||
if (copy_to_user(udesc, pdesc, sizeof(struct program_load_desc) +
|
if (copy_to_user(udesc, pdesc, sizeof(struct program_load_desc) +
|
||||||
sizeof(struct program_image_section) * desc.num_sections)) {
|
sizeof(struct program_image_section) * desc.num_sections)) {
|
||||||
@ -517,11 +522,12 @@ long __mcctrl_control(ihk_os_t os, unsigned int req, unsigned long arg)
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void mcexec_prepare_ack(ihk_os_t os, unsigned long arg)
|
void mcexec_prepare_ack(ihk_os_t os, unsigned long arg, int err)
|
||||||
{
|
{
|
||||||
struct program_load_desc *desc = phys_to_virt(arg);
|
struct program_load_desc *desc = phys_to_virt(arg);
|
||||||
struct mcctrl_usrdata *usrdata = ihk_host_os_get_usrdata(os);
|
struct mcctrl_usrdata *usrdata = ihk_host_os_get_usrdata(os);
|
||||||
|
|
||||||
|
desc->err = err;
|
||||||
desc->status = 1;
|
desc->status = 1;
|
||||||
|
|
||||||
wake_up_all(&usrdata->wq_prepare);
|
wake_up_all(&usrdata->wq_prepare);
|
||||||
|
|||||||
@ -15,7 +15,7 @@
|
|||||||
|
|
||||||
//struct mcctrl_channel *channels;
|
//struct mcctrl_channel *channels;
|
||||||
|
|
||||||
void mcexec_prepare_ack(ihk_os_t os, unsigned long arg);
|
void mcexec_prepare_ack(ihk_os_t os, unsigned long arg, int err);
|
||||||
static void mcctrl_ikc_init(ihk_os_t os, int cpu, unsigned long rphys);
|
static void mcctrl_ikc_init(ihk_os_t os, int cpu, unsigned long rphys);
|
||||||
int mcexec_syscall(struct mcctrl_channel *c, unsigned long arg);
|
int mcexec_syscall(struct mcctrl_channel *c, unsigned long arg);
|
||||||
|
|
||||||
@ -31,7 +31,11 @@ static int syscall_packet_handler(struct ihk_ikc_channel_desc *c,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case SCD_MSG_PREPARE_PROCESS_ACKED:
|
case SCD_MSG_PREPARE_PROCESS_ACKED:
|
||||||
mcexec_prepare_ack(__os, pisp->arg);
|
mcexec_prepare_ack(__os, pisp->arg, 0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SCD_MSG_PREPARE_PROCESS_NACKED:
|
||||||
|
mcexec_prepare_ack(__os, pisp->arg, -1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SCD_MSG_SYSCALL_ONESIDE:
|
case SCD_MSG_SYSCALL_ONESIDE:
|
||||||
|
|||||||
@ -89,6 +89,7 @@ struct program_load_desc {
|
|||||||
int status;
|
int status;
|
||||||
int cpu;
|
int cpu;
|
||||||
int pid;
|
int pid;
|
||||||
|
int err;
|
||||||
unsigned long entry;
|
unsigned long entry;
|
||||||
unsigned long user_start;
|
unsigned long user_start;
|
||||||
unsigned long user_end;
|
unsigned long user_end;
|
||||||
|
|||||||
Reference in New Issue
Block a user