i_deref(parent);
return 0;
}
- if (parent && i_lock(parent) && (ino = newfile(parent, "core"))) {
- ino->c_node.i_mode = F_REG | 0400;
- setftime(ino, A_TIME | M_TIME | C_TIME);
- wr_inode(ino);
- f_trunc(ino);
-
- /* FIXME: need to add some arch specific header bits, and
- also pull stuff like the true sp and registers out of
- the return stack properly */
-
- corehdr.ch_base = MAPBASE;
- corehdr.ch_break = udata.u_break;
- corehdr.ch_sp = udata.u_syscall_sp;
- corehdr.ch_top = PROGTOP;
- udata.u_offset = 0;
- udata.u_base = (uint8_t *)&corehdr;
- udata.u_sysio = true;
- udata.u_count = sizeof(corehdr);
- writei(ino, 0);
- udata.u_sysio = false;
- udata.u_base = MAPBASE;
- udata.u_count = udata.u_break - MAPBASE;
- writei(ino, 0);
- udata.u_base = udata.u_sp;
- udata.u_count = PROGTOP - (uint16_t)udata.u_sp;
- writei(ino, 0);
- i_unlock_deref(ino);
- return W_COREDUMP;
+ if (parent) {
+ i_lock(parent);
+ if (ino = newfile(parent, "core")) {
+ ino->c_node.i_mode = F_REG | 0400;
+ setftime(ino, A_TIME | M_TIME | C_TIME);
+ wr_inode(ino);
+ f_trunc(ino);
+
+ /* FIXME: need to add some arch specific header bits, and
+ also pull stuff like the true sp and registers out of
+ the return stack properly */
+
+ corehdr.ch_base = MAPBASE;
+ corehdr.ch_break = udata.u_break;
+ corehdr.ch_sp = udata.u_syscall_sp;
+ corehdr.ch_top = PROGTOP;
+ udata.u_offset = 0;
+ udata.u_base = (uint8_t *)&corehdr;
+ udata.u_sysio = true;
+ udata.u_count = sizeof(corehdr);
+ writei(ino, 0);
+ udata.u_sysio = false;
+ udata.u_base = MAPBASE;
+ udata.u_count = udata.u_break - MAPBASE;
+ writei(ino, 0);
+ udata.u_base = udata.u_sp;
+ udata.u_count = PROGTOP - (uint16_t)udata.u_sp;
+ writei(ino, 0);
+ i_unlock_deref(ino);
+ return W_COREDUMP;
+ }
}
return 0;
}