summaryrefslogtreecommitdiff
path: root/src/sys/arch/amd64/os/os_proc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sys/arch/amd64/os/os_proc.c')
-rw-r--r--src/sys/arch/amd64/os/os_proc.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/sys/arch/amd64/os/os_proc.c b/src/sys/arch/amd64/os/os_proc.c
index 8c7b6f3..1064c10 100644
--- a/src/sys/arch/amd64/os/os_proc.c
+++ b/src/sys/arch/amd64/os/os_proc.c
@@ -39,6 +39,8 @@
#include <machine/lapic.h>
#include <string.h>
+extern struct proc g_rootproc;
+
/*
* Put the current process into userland for its first
* run. The catch is that we have never been in userland
@@ -212,3 +214,41 @@ done:
lapic_eoi();
lapic_timer_oneshot_us(SCHED_QUANTUM);
}
+
+/*
+ * Commit procedural murder
+ */
+int
+md_proc_kill(struct proc *procp, int flags)
+{
+ struct proc *self;
+ struct pcore *core = this_core();
+ struct md_pcb *pcbp;
+
+ if (core == NULL) {
+ return -ENXIO;
+ }
+
+ /* Default to ourself */
+ if (procp == NULL) {
+ procp = core->curproc;
+ }
+
+ /* Release the VAS */
+ pcbp = &procp->pcb;
+ mmu_free_vas(&pcbp->vas);
+
+ /* Sanity check */
+ if ((self = core->curproc) == NULL) {
+ printf("kill: could not get self, using rootproc\n");
+ self = &g_rootproc;
+ }
+
+ /* If this is us, spin time */
+ if (self->pid == procp->pid) {
+ core->curproc = NULL;
+ md_proc_yield();
+ }
+
+ return 0;
+}