annotate src/proc-asm.S @ 80:4db99a52863e
fixed the "endianess" of the text messages in the ATA identify info block. this
is the first time I've seen wrong byteorder in ascii text, the ATA committee
should be commended.
author |
John Tsiombikas <nuclear@member.fsf.org> |
date |
Tue, 06 Dec 2011 13:35:39 +0200 |
parents |
437360696883 |
children |
|
rev |
line source |
nuclear@54
|
1 .text
|
nuclear@57
|
2 /* switch_stack(uint32_t new_stack, uint32_t *old_stack_ptr)
|
nuclear@57
|
3 * switches to the new stack and returns the old stack pointer, which is
|
nuclear@57
|
4 * also copied to the address passed as the second argument.
|
nuclear@54
|
5 */
|
nuclear@54
|
6 .globl switch_stack
|
nuclear@54
|
7 switch_stack:
|
nuclear@57
|
8 movl %esp, %eax /* old stack in eax */
|
nuclear@57
|
9 movl 8(%esp), %edx
|
nuclear@57
|
10 cmpl $0, %edx /* if old_stack_ptr is null, skip ahead */
|
nuclear@57
|
11 jz oldp_is_null
|
nuclear@57
|
12 movl %eax, (%edx) /* otherwise *old_stack_ptr = eax */
|
nuclear@57
|
13 oldp_is_null:
|
nuclear@57
|
14 movl 4(%esp), %esp /* set the new stack */
|
nuclear@54
|
15 ret
|
nuclear@57
|
16
|
nuclear@57
|
17 /* get_instr_stack_ptr(uint32_t *eip, uint32_t *esp)
|
nuclear@57
|
18 * returns the current instruction and stack pointers at the same
|
nuclear@57
|
19 * point in execution, so that a newly-forked process with these
|
nuclear@57
|
20 * values will just return from this function and continue on.
|
nuclear@57
|
21 */
|
nuclear@57
|
22 .globl get_instr_stack_ptr
|
nuclear@57
|
23 get_instr_stack_ptr:
|
nuclear@57
|
24 call get_instr_ptr
|
nuclear@57
|
25 movl %eax, 4(%esp)
|
nuclear@57
|
26 movl %esp, 8(%esp)
|
nuclear@57
|
27 ret
|
nuclear@57
|
28
|
nuclear@57
|
29 /* get_instr_ptr(void)
|
nuclear@57
|
30 * returns the address of the next instruction after the call to this function
|
nuclear@57
|
31 */
|
nuclear@57
|
32 .globl get_instr_ptr
|
nuclear@57
|
33 get_instr_ptr:
|
nuclear@57
|
34 movl (%esp), %eax
|
nuclear@57
|
35 ret
|
nuclear@57
|
36
|
nuclear@57
|
37 /* get_caller_instr_ptr(void)
|
nuclear@57
|
38 * returns the address of the next instruction after the call to the function that
|
nuclear@57
|
39 * called this function.
|
nuclear@57
|
40 * NOTE: will only work properly when called from a function that uses ebp to point
|
nuclear@57
|
41 * to its stack frame, which means all of the C functions but pretty much none of
|
nuclear@57
|
42 * our assembly functions.
|
nuclear@57
|
43 */
|
nuclear@57
|
44 .globl get_caller_instr_ptr
|
nuclear@57
|
45 get_caller_instr_ptr:
|
nuclear@57
|
46 movl 4(%ebp), %eax
|
nuclear@57
|
47 ret
|
nuclear@57
|
48
|
nuclear@58
|
49 /* this is where we end up when we first context_switch to a newly forked
|
nuclear@58
|
50 * process. The interrupt frame is already there, so we just call intr_ret
|
nuclear@58
|
51 * to return to user space
|
nuclear@58
|
52 */
|
nuclear@57
|
53 .globl just_forked
|
nuclear@57
|
54 just_forked:
|
nuclear@57
|
55 call intr_ret
|