annotate packages/hal/arm/arch/current/src/context.S @ 66:bf00f99aec69 ecos-sw-2000-02-02

Merge from eCos master repository on 2000-02-02-19:16:44-GMT
author jlarmour
date Wed, 02 Feb 2000 19:57:02 +0000
parents c38311975d4f
children 435cced73e2f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
1 // #=============================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
2 // #
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
3 // # context.S
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
4 // #
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
5 // # PowerPC context switch code
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
6 // #
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
7 // #=============================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
8 // ####COPYRIGHTBEGIN####
64
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 38
diff changeset
9 //
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 38
diff changeset
10 // -------------------------------------------
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 38
diff changeset
11 // The contents of this file are subject to the Red Hat eCos Public License
66
bf00f99aec69 Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents: 64
diff changeset
12 // Version 1.1 (the "License"); you may not use this file except in
64
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 38
diff changeset
13 // compliance with the License. You may obtain a copy of the License at
66
bf00f99aec69 Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents: 64
diff changeset
14 // http://www.redhat.com/
64
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 38
diff changeset
15 //
66
bf00f99aec69 Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents: 64
diff changeset
16 // Software distributed under the License is distributed on an "AS IS"
64
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 38
diff changeset
17 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 38
diff changeset
18 // License for the specific language governing rights and limitations under
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 38
diff changeset
19 // the License.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 38
diff changeset
20 //
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 38
diff changeset
21 // The Original Code is eCos - Embedded Configurable Operating System,
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 38
diff changeset
22 // released September 30, 1998.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 38
diff changeset
23 //
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 38
diff changeset
24 // The Initial Developer of the Original Code is Red Hat.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 38
diff changeset
25 // Portions created by Red Hat are
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 38
diff changeset
26 // Copyright (C) 1998, 1999, 2000 Red Hat, Inc.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 38
diff changeset
27 // All Rights Reserved.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 38
diff changeset
28 // -------------------------------------------
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 38
diff changeset
29 //
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
30 // ####COPYRIGHTEND####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
31 // #=============================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
32 // ######DESCRIPTIONBEGIN####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
33 // #
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
34 // # Author(s): nickg, gthomas
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
35 // # Contributors: nickg, gthomas
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
36 // # Date: 1998-09-15
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
37 // # Purpose: ARM context switch code
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
38 // # Description: This file contains implementations of the thread context
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
39 // # switch routines. It also contains the longjmp() and setjmp()
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
40 // # routines.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
41 // #
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
42 // #####DESCRIPTIONEND####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
43 // #
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
44 // #=============================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
45
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
46 #include <pkgconf/hal.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
47
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
48 #include "arm.inc"
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
49
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
50 .text
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
51
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
52 // ------------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
53 // function declaration macro
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
54
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
55 #define FUNC_START(name) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
56 .globl name; \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
57 name:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
58
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
59 // ------------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
60 // hal_thread_switch_context
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
61 // Switch thread contexts
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
62 // R0 = address of sp of next thread to execute
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
63 // R1 = address of sp save location of current thread
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
64
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
65 // Need to save/restore R4..R12, R13 (sp), R14 (lr)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
66
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
67 // Note: this is a little wasteful since r0..r3 don't need to be saved.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
68 // They are saved here though so that the information can match the HAL_SavedRegisters
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
69
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
70 FUNC_START(hal_thread_switch_context)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
71 mov ip,sp // saved stack pointer
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 20
diff changeset
72 stmfd sp!,{fp,ip,lr,pc} // filler
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 20
diff changeset
73 stmfd sp!,{r0-r10,fp,ip,lr,pc}
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
74 mrs r2,cpsr
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
75 str r2,[sp,#armreg_cpsr]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
76 str sp,[r1] // return new stack pointer
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
77
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
78 # Now load the destination thread by dropping through
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
79 # to hal_thread_load_context
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
80
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
81 // ------------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
82 // hal_thread_load_context
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
83 // Load thread context
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
84 // R0 = address of sp of next thread to execute
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
85 // Note that this function is also the second half of hal_thread_switch_context
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
86 // and is simply dropped into from it.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
87
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
88 FUNC_START(hal_thread_load_context)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
89 ldr fp,[r0] // get context to restore
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
90 mrs r0,cpsr // disable IRQ's
20
5f5102441818 Merge from eCos master repository on 1999-07-02-23:17:07-BST
jlarmour
parents: 2
diff changeset
91 orr r0,r0,#CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
92 msr cpsr,r0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
93 ldr r0,[fp,#armreg_cpsr]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
94 msr spsr,r0
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 20
diff changeset
95 ldmfd fp,{r0-r10,fp,sp,lr}
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 20
diff changeset
96 movs pc,lr // also restores saved PSR
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
97
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
98 // ------------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
99 // HAL longjmp, setjmp implementations
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
100 // hal_setjmp saves only to callee save registers 4-14
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
101 // and lr into buffer supplied in r0[arg0]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
102
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
103 FUNC_START(hal_setjmp)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
104 stmea r0,{r4-r14}
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
105 mov r0,#0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
106 mov pc,lr; # return
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
107
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
108 // hal_longjmp loads state from r0[arg0] and returns
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
109
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
110 FUNC_START(hal_longjmp)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
111 ldmfd r0,{r4-r14}
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
112 mov r0,r1; # return [arg1]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
113 mov pc,lr
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
114
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
115 // ------------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
116 // end of context.S
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
117
64
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 38
diff changeset
118