On Mon, Jan 24, 2005 at 04:16:45PM -0500, Jan Harkes wrote:
>
> Can't find the patch anywhere. I might have deleted it accidentally
> while deleting spam from my inbox.
>
heh - I know the feeling ;) I may be mistaken but I thought I logged it
as a bug/enhancement but, no matter... here is the code:
--- src/process.S.orig 2001-10-05 06:44:08.000000000 +0930
+++ src/process.S
@@ -400,7 +400,83 @@ returnto:
.end returnto
#endif /* mips */
-#ifdef i386
+#if defined(__amd64)
+
+#include <machine/asm.h>
+
+/*
+ savecontext(f, area1, newsp)
+ int (*f)();
+ struct savearea *area1;
+ char *newsp;
+
+ f will be in %rdi
+ *area1 will be in %rsi
+ *newsp will be in %rdx
+*/
+
+ .text
+ENTRY(savecontext)
+ pushq %rsp
+ pushq %rax
+ pushq %rcx
+ pushq %rdx
+ pushq %rbx
+ pushq %rbp
+ pushq %rsi
+ pushq %rdi
+ pushq %r8
+ pushq %r9
+ pushq %r10
+ pushq %r11
+ pushq %r12
+ pushq %r13
+ pushq %r14
+ pushq %r15
+
+ movq %rsp, (%rsi) /* Store sp in savearea. */
+
+ cmpq $0, %rdx /* Check if newsp is NULL */
+ je L1 /* Don't change the stack if newsp is
zero. */
+ movq %rdx, %rsp
+
+L1: xorq %rbp, %rbp /* clear stackframe */
+ call *%rdi /* f(); */
+
+ /* Trigger a segfault, we shouldn't get here anyway. */
+ movq $0, 0
+
+/*
+ returnto(area2)
+ struct savearea *area2;
+
+ area2 will be in %rdi
+*/
+#define area2 8
+
+ENTRY(returnto)
+ mov (%rdi), %rsp /* Restore stack pointer. */
+ popq %r15
+ popq %r14
+ popq %r13
+ popq %r12
+ popq %r11
+ popq %r10
+ popq %r9
+ popq %r8
+ popq %rdi
+ popq %rsi
+ popq %rbp
+ popq %rbx
+ popq %rdx
+ popq %rcx
+ popq %rax
+ popq %rsp
+ ret
+
+#endif /* amd64 */
+
+#if defined(i386)
/*
savecontext(f, area1, newsp)
*snip*snip*snip*
> It actually seems to work now and it should be more portable.
>
Hmmmm would it not be better to use pthreads instead? Most, if not all,
OS's these days have or can have a libpthread which makes the code even
more portable...
>
> It is probably something with the marshalling/unmarshalling, where we
> stick a 64-bit value in the outgoing packet buffer, but then only
> increment by 4 bytes, so we end up losing half of the original
> information and when unpacking we end up copying the overwritten part
> back. This should be solvable by forcing RPC2_Integer to be a 32-bit
> integer instead of the current (64-bit) long.
>
ok - that sounds like fun (not). I was looking at coda and cleaning up
some of the warnings there, mainly trying to use longs to store pointers
which does not work well in 64 bit land :) I suppose I should bash on rpc2
for a while and see what I can do/damage ;)
--
Brett Lymn