All of lore.kernel.org
 help / color / mirror / Atom feed
From: Allan Graves <allan.graves@oracle.com>
To: user-mode-linux-devel@lists.sourceforge.net
Subject: [uml-devel] stack and scheduler patches
Date: Wed, 31 Aug 2005 19:06:33 -0400	[thread overview]
Message-ID: <431637F9.6030101@oracle.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 64 bytes --]

Jeff,
Here's the patches.  Hope these meet your approval!
Allan

[-- Attachment #2: sched_um.patch --]
[-- Type: text/plain, Size: 5148 bytes --]

diff -uNr -x '.dep*' -x '.hdep*' -x '*.[oas]' -x '*~' -x '#*' -x '*CVS*' -x '*.orig' -x '*.rej' -x '*.old' -x '.menu*' -x asm -x local.h -x System.map -x autoconf.h -x compile.h -x version.h -x .version -x defkaymap.c -x uni_hash.tbl linux-2.6.13/arch/um/kernel/process_kern.c linux-2.6.13-stack/arch/um/kernel/process_kern.c
--- linux-2.6.13/arch/um/kernel/process_kern.c	2005-08-28 19:41:01.000000000 -0400
+++ linux-2.6.13-stack/arch/um/kernel/process_kern.c	2005-08-31 17:50:17.000000000 -0400
@@ -113,8 +113,17 @@
 
 void *_switch_to(void *prev, void *next, void *last)
 {
-	return(CHOOSE_MODE(switch_to_tt(prev, next), 
-			   switch_to_skas(prev, next)));
+        struct task_struct *from=(struct task_struct*)prev;
+        struct task_struct *to=(struct task_struct*)next;
+
+        to->thread.prev_sched = from;
+        set_current(to);
+
+          CHOOSE_MODE(switch_to_tt(prev, next),
+             switch_to_skas(prev, next));
+
+        return(current->thread.prev_sched); 
+
 }
 
 void interrupt_end(void)
diff -uNr -x '.dep*' -x '.hdep*' -x '*.[oas]' -x '*~' -x '#*' -x '*CVS*' -x '*.orig' -x '*.rej' -x '*.old' -x '.menu*' -x asm -x local.h -x System.map -x autoconf.h -x compile.h -x version.h -x .version -x defkaymap.c -x uni_hash.tbl linux-2.6.13/arch/um/kernel/skas/include/mode_kern-skas.h linux-2.6.13-stack/arch/um/kernel/skas/include/mode_kern-skas.h
--- linux-2.6.13/arch/um/kernel/skas/include/mode_kern-skas.h	2005-08-28 19:41:01.000000000 -0400
+++ linux-2.6.13-stack/arch/um/kernel/skas/include/mode_kern-skas.h	2005-08-30 16:46:17.000000000 -0400
@@ -11,7 +11,7 @@
 #include "asm/ptrace.h"
 
 extern void flush_thread_skas(void);
-extern void *switch_to_skas(void *prev, void *next);
+extern int switch_to_skas(void *prev, void *next);
 extern void start_thread_skas(struct pt_regs *regs, unsigned long eip,
 			      unsigned long esp);
 extern int copy_thread_skas(int nr, unsigned long clone_flags,
diff -uNr -x '.dep*' -x '.hdep*' -x '*.[oas]' -x '*~' -x '#*' -x '*CVS*' -x '*.orig' -x '*.rej' -x '*.old' -x '.menu*' -x asm -x local.h -x System.map -x autoconf.h -x compile.h -x version.h -x .version -x defkaymap.c -x uni_hash.tbl linux-2.6.13/arch/um/kernel/skas/process_kern.c linux-2.6.13-stack/arch/um/kernel/skas/process_kern.c
--- linux-2.6.13/arch/um/kernel/skas/process_kern.c	2005-08-28 19:41:01.000000000 -0400
+++ linux-2.6.13-stack/arch/um/kernel/skas/process_kern.c	2005-08-31 15:48:35.000000000 -0400
@@ -24,7 +24,7 @@
 #include "proc_mm.h"
 #include "registers.h"
 
-void *switch_to_skas(void *prev, void *next)
+int switch_to_skas(void *prev, void *next)
 {
 	struct task_struct *from, *to;
 
@@ -35,8 +35,6 @@
 	if(current->pid == 0)
 		switch_timers(0);
 
-	to->thread.prev_sched = from;
-	set_current(to);
 
 	switch_threads(&from->thread.mode.skas.switch_buf, 
 		       to->thread.mode.skas.switch_buf);
@@ -44,7 +42,7 @@
 	if(current->pid == 0)
 		switch_timers(1);
 
-	return(current->thread.prev_sched);
+	return(0);
 }
 
 extern void schedule_tail(struct task_struct *prev);
diff -uNr -x '.dep*' -x '.hdep*' -x '*.[oas]' -x '*~' -x '#*' -x '*CVS*' -x '*.orig' -x '*.rej' -x '*.old' -x '.menu*' -x asm -x local.h -x System.map -x autoconf.h -x compile.h -x version.h -x .version -x defkaymap.c -x uni_hash.tbl linux-2.6.13/arch/um/kernel/tt/include/mode_kern-tt.h linux-2.6.13-stack/arch/um/kernel/tt/include/mode_kern-tt.h
--- linux-2.6.13/arch/um/kernel/tt/include/mode_kern-tt.h	2005-08-28 19:41:01.000000000 -0400
+++ linux-2.6.13-stack/arch/um/kernel/tt/include/mode_kern-tt.h	2005-08-31 11:15:55.000000000 -0400
@@ -11,7 +11,7 @@
 #include "asm/ptrace.h"
 #include "asm/uaccess.h"
 
-extern void *switch_to_tt(void *prev, void *next);
+extern int switch_to_tt(void *prev, void *next);
 extern void flush_thread_tt(void);
 extern void start_thread_tt(struct pt_regs *regs, unsigned long eip,
 			   unsigned long esp);
diff -uNr -x '.dep*' -x '.hdep*' -x '*.[oas]' -x '*~' -x '#*' -x '*CVS*' -x '*.orig' -x '*.rej' -x '*.old' -x '.menu*' -x asm -x local.h -x System.map -x autoconf.h -x compile.h -x version.h -x .version -x defkaymap.c -x uni_hash.tbl linux-2.6.13/arch/um/kernel/tt/process_kern.c linux-2.6.13-stack/arch/um/kernel/tt/process_kern.c
--- linux-2.6.13/arch/um/kernel/tt/process_kern.c	2005-08-28 19:41:01.000000000 -0400
+++ linux-2.6.13-stack/arch/um/kernel/tt/process_kern.c	2005-08-31 15:48:31.000000000 -0400
@@ -26,7 +26,7 @@
 #include "init.h"
 #include "tt.h"
 
-void *switch_to_tt(void *prev, void *next, void *last)
+int switch_to_tt(void *prev, void *next, void *last)
 {
 	struct task_struct *from, *to, *prev_sched;
 	unsigned long flags;
@@ -36,7 +36,6 @@
 	from = prev;
 	to = next;
 
-	to->thread.prev_sched = from;
 
 	cpu = from->thread_info->cpu;
 	if(cpu == 0)
@@ -53,7 +52,6 @@
 	forward_pending_sigio(to->thread.mode.tt.extern_pid);
 
 	c = 0;
-	set_current(to);
 
 	err = os_write_file(to->thread.mode.tt.switch_pipe[1], &c, sizeof(c));
 	if(err != sizeof(c))
@@ -86,7 +84,7 @@
 	flush_tlb_all();
 	local_irq_restore(flags);
 
-	return(current->thread.prev_sched);
+        return(0);
 }
 
 void release_thread_tt(struct task_struct *task)

[-- Attachment #3: stack_trace.patch --]
[-- Type: text/plain, Size: 6271 bytes --]

diff -uNr -x '.dep*' -x '.hdep*' -x '*.[oas]' -x '*~' -x '#*' -x '*CVS*' -x '*.orig' -x '*.rej' -x '*.old' -x '.menu*' -x asm -x local.h -x System.map -x autoconf.h -x compile.h -x version.h -x .version -x defkaymap.c -x uni_hash.tbl linux-2.6.13/arch/um/drivers/mconsole_kern.c linux-2.6.13-stack/arch/um/drivers/mconsole_kern.c
--- linux-2.6.13/arch/um/drivers/mconsole_kern.c	2005-08-28 19:41:01.000000000 -0400
+++ linux-2.6.13-stack/arch/um/drivers/mconsole_kern.c	2005-08-31 16:24:51.000000000 -0400
@@ -32,6 +32,7 @@
 #include "os.h"
 #include "umid.h"
 #include "irq_kern.h"
+#include "choose-mode.h"
 
 static int do_unlink_socket(struct notifier_block *notifier, 
 			    unsigned long what, void *data)
@@ -276,6 +277,7 @@
     go - continue the UML after a 'stop' \n\
     log <string> - make UML enter <string> into the kernel log\n\
     proc <file> - returns the contents of the UML's /proc/<file>\n\
+    stack <pid> - returns the stack of the specified pid\n\
 "
 
 void mconsole_help(struct mc_request *req)
@@ -479,6 +481,54 @@
 }
 #endif
 
+/* Mconsole stack trace
+   Added by Allan Graves, Jeff Dike
+   Dumps a stacks registers to the linux console.
+   Usage stack <pid>.  */
+void do_stack(struct mc_request *req)
+{
+        char *ptr = req->request.data; 
+        int pid_requested=-1;
+        struct task_struct *from=NULL;
+	struct task_struct *to=NULL;
+       
+        /* Would be nice:
+           1) Send showregs output to mconsole.
+           2) Add a way to stack dump all pids.
+        */
+
+        ptr += strlen("stack");
+        while(isspace(*ptr)) ptr++;
+
+        /* Should really check for multiple pids or reject bad args here */
+        /* What do the arguments in mconsole_reply mean? */
+        if (0==sscanf(ptr, "%d", &pid_requested) || pid_requested==-1) {
+                mconsole_reply(req, "Please specify a pid", 1, 0);
+                return;
+        }
+
+        from=current;
+        to=find_task_by_pid(pid_requested);
+
+        if((!to) || (pid_requested ==0)) {
+                mconsole_reply(req, "Couldn't find that pid", 1, 0);
+                return;
+        }
+        to->thread.saved_task=current;
+
+        switch_to(from,to,from);
+        mconsole_reply(req, "Stack Dumped to console and message log", 0, 0);
+
+}
+
+void mconsole_stack(struct mc_request *req)
+{
+	/* This command doesn't work in TT mode, so let's check and then get out of here */
+	CHOOSE_MODE(mconsole_reply(req, "Sorry, this doesn't work in TT mode", 1, 0),
+          do_stack(req));
+}
+
+
 /* Changed by mconsole_setup, which is __setup, and called before SMP is
  * active.
  */
diff -uNr -x '.dep*' -x '.hdep*' -x '*.[oas]' -x '*~' -x '#*' -x '*CVS*' -x '*.orig' -x '*.rej' -x '*.old' -x '.menu*' -x asm -x local.h -x System.map -x autoconf.h -x compile.h -x version.h -x .version -x defkaymap.c -x uni_hash.tbl linux-2.6.13/arch/um/drivers/mconsole_user.c linux-2.6.13-stack/arch/um/drivers/mconsole_user.c
--- linux-2.6.13/arch/um/drivers/mconsole_user.c	2005-08-28 19:41:01.000000000 -0400
+++ linux-2.6.13-stack/arch/um/drivers/mconsole_user.c	2005-08-31 16:59:51.000000000 -0400
@@ -30,6 +30,7 @@
 	{ "go", mconsole_go, MCONSOLE_INTR },
 	{ "log", mconsole_log, MCONSOLE_INTR },
 	{ "proc", mconsole_proc, MCONSOLE_PROC },
+        { "stack", mconsole_stack, MCONSOLE_INTR },
 };
 
 /* Initialized in mconsole_init, which is an initcall */
Binary files linux-2.6.13/arch/um/drivers/.mconsole_user.c.swp and linux-2.6.13-stack/arch/um/drivers/.mconsole_user.c.swp differ
diff -uNr -x '.dep*' -x '.hdep*' -x '*.[oas]' -x '*~' -x '#*' -x '*CVS*' -x '*.orig' -x '*.rej' -x '*.old' -x '.menu*' -x asm -x local.h -x System.map -x autoconf.h -x compile.h -x version.h -x .version -x defkaymap.c -x uni_hash.tbl linux-2.6.13/arch/um/include/mconsole.h linux-2.6.13-stack/arch/um/include/mconsole.h
--- linux-2.6.13/arch/um/include/mconsole.h	2005-08-28 19:41:01.000000000 -0400
+++ linux-2.6.13-stack/arch/um/include/mconsole.h	2005-08-29 17:09:47.000000000 -0400
@@ -81,6 +81,7 @@
 extern void mconsole_go(struct mc_request *req);
 extern void mconsole_log(struct mc_request *req);
 extern void mconsole_proc(struct mc_request *req);
+extern void mconsole_stack(struct mc_request *req);
 
 extern int mconsole_get_request(int fd, struct mc_request *req);
 extern int mconsole_notify(char *sock_name, int type, const void *data, 
diff -uNr -x '.dep*' -x '.hdep*' -x '*.[oas]' -x '*~' -x '#*' -x '*CVS*' -x '*.orig' -x '*.rej' -x '*.old' -x '.menu*' -x asm -x local.h -x System.map -x autoconf.h -x compile.h -x version.h -x .version -x defkaymap.c -x uni_hash.tbl linux-2.6.13/arch/um/kernel/process_kern.c linux-2.6.13-stack/arch/um/kernel/process_kern.c
--- linux-2.6.13/arch/um/kernel/process_kern.c	2005-08-31 18:35:52.000000000 -0400
+++ linux-2.6.13-stack/arch/um/kernel/process_kern.c	2005-08-31 18:46:45.000000000 -0400
@@ -119,8 +120,18 @@
         to->thread.prev_sched = from;
         set_current(to);
 
+        do 
+        { 
+          current->thread.saved_task = NULL ;
           CHOOSE_MODE(switch_to_tt(prev, next),
              switch_to_skas(prev, next));
+          if(current->thread.saved_task) 
+            show_regs(&(current->thread.regs));
+            next=(void *)current->thread.saved_task;
+            prev=(void*)current;
+        } while(current->thread.saved_task);
+
+
 
         return(current->thread.prev_sched); 
 
diff -uNr -x '.dep*' -x '.hdep*' -x '*.[oas]' -x '*~' -x '#*' -x '*CVS*' -x '*.orig' -x '*.rej' -x '*.old' -x '.menu*' -x asm -x local.h -x System.map -x autoconf.h -x compile.h -x version.h -x .version -x defkaymap.c -x uni_hash.tbl linux-2.6.13/include/asm-um/processor-generic.h linux-2.6.13-stack/include/asm-um/processor-generic.h
--- linux-2.6.13/include/asm-um/processor-generic.h	2005-08-28 19:41:01.000000000 -0400
+++ linux-2.6.13-stack/include/asm-um/processor-generic.h	2005-08-30 11:26:03.000000000 -0400
@@ -21,6 +21,7 @@
 	 * copy_thread) to mark that we are begin called from userspace (fork /
 	 * vfork / clone), and reset to 0 after. It is left to 0 when called
 	 * from kernelspace (i.e. kernel_thread() or fork_idle(), as of 2.6.11). */
+	struct task_struct *saved_task;
 	int forking;
 	int nsyscalls;
 	struct pt_regs regs;

             reply	other threads:[~2005-08-31 23:06 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-08-31 23:06 Allan Graves [this message]
2005-09-02 16:59 ` [uml-devel] stack and scheduler patches Jeff Dike
2005-09-04 11:51   ` Blaisorblade
2005-09-06 15:37     ` Jeff Dike
2005-09-06 16:10     ` [uml-devel] sched and stack patch changelogs Allan Graves
2005-09-06 15:46   ` [uml-devel] stack and scheduler patches Allan Graves

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=431637F9.6030101@oracle.com \
    --to=allan.graves@oracle.com \
    --cc=user-mode-linux-devel@lists.sourceforge.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.