PERFORCE change 114193 for review
Roman Divacky
rdivacky at FreeBSD.org
Wed Feb 7 18:28:31 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=114193
Change 114193 by rdivacky at rdivacky_witten on 2007/02/07 18:27:32
Dont "return" in linux_clone() after we forked the new process in a case
of problems.
Affected files ...
.. //depot/projects/linuxolator/src/sys/amd64/linux32/linux32_machdep.c#34 edit
.. //depot/projects/linuxolator/src/sys/i386/linux/linux_machdep.c#28 edit
Differences ...
==== //depot/projects/linuxolator/src/sys/amd64/linux32/linux32_machdep.c#34 (text+ko) ====
@@ -610,6 +610,10 @@
if ((args->flags & 0xffffff00) == THREADING_FLAGS)
ff |= RFTHREAD;
+ if (args->flags & CLONE_PARENT_SETTID)
+ if (args->parent_tidptr == NULL)
+ return (EINVAL);
+
error = fork1(td, ff, 0, &p2);
if (error)
return (error);
@@ -629,15 +633,9 @@
KASSERT(em != NULL, ("clone: emuldata not found.\n"));
/* and adjust it */
if (args->flags & CLONE_PARENT_SETTID) {
- if (args->parent_tidptr == NULL) {
- EMUL_UNLOCK(&emul_lock);
- return (EINVAL);
- }
error = copyout(&p2->p_pid, args->parent_tidptr, sizeof(p2->p_pid));
- if (error) {
- EMUL_UNLOCK(&emul_lock);
- return (error);
- }
+ if (error)
+ printf(LMSG("copyout failed!"));
}
if (args->flags & CLONE_THREAD) {
@@ -679,52 +677,56 @@
int idx;
error = copyin((void *)td->td_frame->tf_rsi, &info, sizeof(struct l_user_desc));
- if (error)
- return (error);
+ if (error) {
+ printf(LMSG("copyin failed!"));
+ } else {
- idx = info.entry_number;
+ idx = info.entry_number;
- /*
- * looks like we're getting the idx we returned
- * in the set_thread_area() syscall
- */
- if (idx != 6 && idx != GUGS32_SEL)
- return (EINVAL);
+ /*
+ * looks like we're getting the idx we returned
+ * in the set_thread_area() syscall
+ */
+ if (idx != 6 && idx != GUGS32_SEL) {
+ printf(LMSG("resetting idx!"));
+ idx = 6; /* or GUGS32_SEL? */
+ }
- /* this doesnt happen in practice */
- if (idx == 6) {
- /* we might copy out the entry_number as GUGS32_SEL */
- info.entry_number = GUGS32_SEL;
- error = copyout(&info, (void *) td->td_frame->tf_rsi, sizeof(struct l_user_desc));
- if (error)
- return (error);
- }
+ /* this doesnt happen in practice */
+ if (idx == 6) {
+ /* we might copy out the entry_number as GUGS32_SEL */
+ info.entry_number = GUGS32_SEL;
+ error = copyout(&info, (void *) td->td_frame->tf_rsi, sizeof(struct l_user_desc));
+ if (error)
+ printf(LMSG("copyout failed!"));
+ }
- a[0] = LDT_entry_a(&info);
- a[1] = LDT_entry_b(&info);
+ a[0] = LDT_entry_a(&info);
+ a[1] = LDT_entry_b(&info);
- memcpy(&sd, &a, sizeof(a));
+ memcpy(&sd, &a, sizeof(a));
#ifdef DEBUG
- if (ldebug(clone))
- printf("Segment created in clone with CLONE_SETTLS: "
- "lobase: %x, hibase: %x, lolimit: %x, hilimit: %x, "
- "type: %i, dpl: %i, p: %i, xx: %i, long: %i, "
- "def32: %i, gran: %i\n",
- sd.sd_lobase,
- sd.sd_hibase,
- sd.sd_lolimit,
- sd.sd_hilimit,
- sd.sd_type,
- sd.sd_dpl,
- sd.sd_p,
- sd.sd_xx,
- sd.sd_long,
- sd.sd_def32,
- sd.sd_gran);
+ if (ldebug(clone))
+ printf("Segment created in clone with CLONE_SETTLS: "
+ "lobase: %x, hibase: %x, lolimit: %x, hilimit: %x, "
+ "type: %i, dpl: %i, p: %i, xx: %i, long: %i, "
+ "def32: %i, gran: %i\n",
+ sd.sd_lobase,
+ sd.sd_hibase,
+ sd.sd_lolimit,
+ sd.sd_hilimit,
+ sd.sd_type,
+ sd.sd_dpl,
+ sd.sd_p,
+ sd.sd_xx,
+ sd.sd_long,
+ sd.sd_def32,
+ sd.sd_gran);
#endif
- td2->td_pcb->pcb_gsbase = (register_t)info.base_addr;
- td2->td_pcb->pcb_gs32p = (caddr_t)&gdt[GUGS32_SEL];
- memcpy(&td2->td_pcb->pcb_gs32sd, &sd, sizeof(sd));
+ td2->td_pcb->pcb_gsbase = (register_t)info.base_addr;
+ td2->td_pcb->pcb_gs32p = (caddr_t)&gdt[GUGS32_SEL];
+ memcpy(&td2->td_pcb->pcb_gs32sd, &sd, sizeof(sd));
+ }
}
#ifdef DEBUG
==== //depot/projects/linuxolator/src/sys/i386/linux/linux_machdep.c#28 (text+ko) ====
@@ -423,6 +423,10 @@
if ((args->flags & 0xffffff00) == THREADING_FLAGS)
ff |= RFTHREAD;
+ if (args->flags & CLONE_PARENT_SETTID)
+ if (args->parent_tidptr == NULL)
+ return (EINVAL);
+
error = fork1(td, ff, 0, &p2);
if (error)
return (error);
@@ -442,15 +446,9 @@
KASSERT(em != NULL, ("clone: emuldata not found.\n"));
/* and adjust it */
if (args->flags & CLONE_PARENT_SETTID) {
- if (args->parent_tidptr == NULL) {
- EMUL_UNLOCK(&emul_lock);
- return (EINVAL);
- }
error = copyout(&p2->p_pid, args->parent_tidptr, sizeof(p2->p_pid));
- if (error) {
- EMUL_UNLOCK(&emul_lock);
- return (error);
- }
+ if (error)
+ printf(LMSG("copyout failed!"));
}
if (args->flags & CLONE_THREAD) {
@@ -492,34 +490,37 @@
struct segment_descriptor sd;
error = copyin((void *)td->td_frame->tf_esi, &info, sizeof(struct l_user_desc));
- if (error)
- return (error);
+ if (error) {
+ printf(LMSG("copyin failed!"));
+ } else {
- idx = info.entry_number;
+ idx = info.entry_number;
- /*
- * looks like we're getting the idx we returned
- * in the set_thread_area() syscall
- */
- if (idx != 6 && idx != 3)
- return (EINVAL);
+ /*
+ * looks like we're getting the idx we returned
+ * in the set_thread_area() syscall
+ */
+ if (idx != 6 && idx != 3) {
+ printf(LMSG("resetting idx!"));
+ idx = 3;
+ }
- /* this doesnt happen in practice */
- if (idx == 6) {
- /* we might copy out the entry_number as 3 */
- info.entry_number = 3;
- error = copyout(&info, (void *) td->td_frame->tf_esi, sizeof(struct l_user_desc));
- if (error)
- return (error);
- }
+ /* this doesnt happen in practice */
+ if (idx == 6) {
+ /* we might copy out the entry_number as 3 */
+ info.entry_number = 3;
+ error = copyout(&info, (void *) td->td_frame->tf_esi, sizeof(struct l_user_desc));
+ if (error)
+ printf(LMSG("copyout failed!"));
+ }
- a[0] = LDT_entry_a(&info);
- a[1] = LDT_entry_b(&info);
+ a[0] = LDT_entry_a(&info);
+ a[1] = LDT_entry_b(&info);
- memcpy(&sd, &a, sizeof(a));
+ memcpy(&sd, &a, sizeof(a));
#ifdef DEBUG
- if (ldebug(clone))
- printf("Segment created in clone with CLONE_SETTLS: lobase: %x, hibase: %x, lolimit: %x, hilimit: %x, type: %i, dpl: %i, p: %i, xx: %i, def32: %i, gran: %i\n", sd.sd_lobase,
+ if (ldebug(clone))
+ printf("Segment created in clone with CLONE_SETTLS: lobase: %x, hibase: %x, lolimit: %x, hilimit: %x, type: %i, dpl: %i, p: %i, xx: %i, def32: %i, gran: %i\n", sd.sd_lobase,
sd.sd_hibase,
sd.sd_lolimit,
sd.sd_hilimit,
@@ -531,9 +532,10 @@
sd.sd_gran);
#endif
- /* set %gs */
- td2->td_pcb->pcb_gsd = sd;
- td2->td_pcb->pcb_gs = GSEL(GUGS_SEL, SEL_UPL);
+ /* set %gs */
+ td2->td_pcb->pcb_gsd = sd;
+ td2->td_pcb->pcb_gs = GSEL(GUGS_SEL, SEL_UPL);
+ }
}
#ifdef DEBUG
More information about the p4-projects
mailing list