Skip to content

Commit bc2ba5e

Browse files
author
Eric Holk
committed
---
yaml --- r: 3323 b: refs/heads/master c: 860e8fd h: refs/heads/master i: 3321: 0683d45 3319: fd9c989 v: v3
1 parent 33ee773 commit bc2ba5e

File tree

3 files changed

+21
-58
lines changed

3 files changed

+21
-58
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: 98dee91f2568522bc129f8cffcaa2879b43646c3
2+
refs/heads/master: 860e8fd98b07cc0dfbb3ff33124778c2225ba81d

trunk/src/rt/arch/i386/_context.s

Lines changed: 15 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,17 @@ Saves a set of registers. This is used by our implementation of
1313
getcontext.
1414
1515
The registers_t variable is in (%esp)
16-
*/
17-
18-
.globl get_registers
19-
get_registers:
20-
movl 4(%esp), %eax
21-
movl %eax, 0(%eax)
16+
*/
17+
18+
// swap_registers(registers_t *oregs, registers_t *regs)
19+
.globl swap_registers
20+
swap_registers:
21+
// save the old context
22+
movl 4(%esp), %eax
23+
//movl %eax, 0(%eax)
2224
movl %ebx, 4(%eax)
23-
movl %ecx, 8(%eax)
24-
movl %edx, 12(%eax)
25+
//movl %ecx, 8(%eax)
26+
//movl %edx, 12(%eax)
2527
movl %ebp, 16(%eax)
2628
movl %esi, 20(%eax)
2729
movl %edi, 24(%eax)
@@ -43,17 +45,12 @@ get_registers:
4345
movl %esp, 28(%eax)
4446
movl %ecx, 48(%eax)
4547

46-
// return 0
47-
xor %eax, %eax
48-
jmp *%ecx
49-
50-
.globl set_registers
51-
set_registers:
52-
movl 4(%esp), %eax
48+
// restore the new context
49+
movl 4(%esp), %eax
5350

5451
movl 4(%eax), %ebx
5552
// save ecx for later...
56-
movl 12(%eax), %edx
53+
//movl 12(%eax), %edx
5754
movl 16(%eax), %ebp
5855
movl 20(%eax), %esi
5956
movl 24(%eax), %edi
@@ -71,36 +68,5 @@ set_registers:
7168
push %ecx
7269
popf
7370

74-
// get ready to return.
75-
mov 48(%eax), %ecx
76-
push %ecx
77-
78-
// okay, now we can restore ecx.
79-
movl 8(%eax), %ecx
80-
81-
// return 1 to the saved eip
82-
movl $1, %eax
83-
ret
84-
85-
// swap_registers(registers_t *oregs, registers_t *regs)
86-
.globl swap_registers
87-
swap_registers:
88-
// %eax = get_registers(oregs);
89-
movl 4(%esp), %eax
90-
push %eax
91-
call get_registers
92-
93-
// if(!%eax) goto call_set
94-
test %eax, %eax
95-
jz call_set
96-
97-
// else
98-
addl $4, %esp
99-
ret
100-
101-
call_set:
102-
// set_registers(regs)
103-
movl 12(%esp), %eax
104-
movl %eax, 0(%esp)
105-
call set_registers
106-
// set_registers never returns
71+
// Return!
72+
jmp *48(%eax)

trunk/src/rt/arch/i386/context.cpp

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,12 @@
55
#include <stdio.h>
66
#include <stdlib.h>
77

8-
//extern "C" uint32_t CDECL get_registers(registers_t *regs)
9-
// asm ("get_registers");
108
extern "C" uint32_t CDECL swap_registers(registers_t *oregs,
119
registers_t *regs)
1210
asm ("swap_registers");
1311

1412
context::context()
15-
: next(NULL)
1613
{
17-
//get_registers(&regs);
18-
swap_registers(&regs, &regs);
1914
}
2015

2116
void context::swap(context &out)
@@ -24,13 +19,15 @@ void context::swap(context &out)
2419
}
2520

2621
void context::call(void *f, void *arg, void *stack) {
22+
// Get the current context, which we will then modify to call the
23+
// given function.
24+
swap(*this);
25+
2726
// set up the trampoline frame
2827
uint32_t *sp = (uint32_t *)stack;
2928

3029
// Shift the stack pointer so the alignment works out right.
31-
sp = align_down(sp) - 2;
32-
33-
*--sp = (uint32_t)this;
30+
sp = align_down(sp) - 3;
3431
*--sp = (uint32_t)arg;
3532
*--sp = 0xdeadbeef;
3633

0 commit comments

Comments
 (0)