1 | /* Copyright (c) 2013 Red Hat, Inc. All rights reserved. |
---|
2 | |
---|
3 | This copyrighted material is made available to anyone wishing to use, |
---|
4 | modify, copy, or redistribute it subject to the terms and conditions |
---|
5 | of the BSD License. This program is distributed in the hope that |
---|
6 | it will be useful, but WITHOUT ANY WARRANTY expressed or implied, |
---|
7 | including the implied warranties of MERCHANTABILITY or FITNESS FOR |
---|
8 | A PARTICULAR PURPOSE. A copy of this license is available at |
---|
9 | http://www.opensource.org/licenses. Any Red Hat trademarks that are |
---|
10 | incorporated in the source code or documentation are not subject to |
---|
11 | the BSD License and may only be used or replicated with the express |
---|
12 | permission of Red Hat, Inc. |
---|
13 | */ |
---|
14 | |
---|
15 | # setjmp/longjmp for msp430. The jmpbuf looks like this: |
---|
16 | # |
---|
17 | # Register Jmpbuf offset |
---|
18 | # small large |
---|
19 | # r0 (pc) 0x00 0x00 |
---|
20 | # r1 (sp) 0x02 0x04 |
---|
21 | # r4 0x04 0x08 |
---|
22 | # r5 0x06 0x0c |
---|
23 | # r6 0x08 0x10 |
---|
24 | # r7 0x0a 0x14 |
---|
25 | # r8 0x0c 0x18 |
---|
26 | # r9 0x0e 0x1c |
---|
27 | # r10 0x10 0x20 |
---|
28 | |
---|
29 | .text |
---|
30 | .global setjmp |
---|
31 | setjmp: |
---|
32 | ; Upon entry r12 points to the jump buffer. |
---|
33 | ; Returns 0 to caller. |
---|
34 | |
---|
35 | #if defined __MSP430X_LARGE__ |
---|
36 | mova @r1, r13 |
---|
37 | mova r13, 0(r12) |
---|
38 | mova r1, 4(r12) |
---|
39 | mova r4, 8(r12) |
---|
40 | mova r5, 12(r12) |
---|
41 | mova r6, 16(r12) |
---|
42 | mova r7, 20(r12) |
---|
43 | mova r8, 24(r12) |
---|
44 | mova r9, 28(r12) |
---|
45 | mova r10, 32(r12) |
---|
46 | clr r12 |
---|
47 | reta |
---|
48 | #else |
---|
49 | ;; Get the return address off the stack |
---|
50 | mov.w @r1, r13 |
---|
51 | mov.w r13, 0(r12) |
---|
52 | mov.w r1, 2(r12) |
---|
53 | mov.w r4, 4(r12) |
---|
54 | mov.w r5, 6(r12) |
---|
55 | mov.w r6, 8(r12) |
---|
56 | mov.w r7, 10(r12) |
---|
57 | mov.w r8, 12(r12) |
---|
58 | mov.w r9, 14(r12) |
---|
59 | mov.w r10, 16(r12) |
---|
60 | clr r12 |
---|
61 | ret |
---|
62 | #endif |
---|
63 | .size setjmp , . - setjmp |
---|
64 | |
---|
65 | |
---|
66 | .global longjmp |
---|
67 | longjmp: |
---|
68 | ; Upon entry r12 points to the jump buffer and |
---|
69 | ; r13 contains the value to be returned by setjmp. |
---|
70 | |
---|
71 | #if defined __MSP430X_LARGE__ |
---|
72 | mova @r12+, r14 |
---|
73 | mova @r12+, r1 |
---|
74 | mova @r12+, r4 |
---|
75 | mova @r12+, r5 |
---|
76 | mova @r12+, r6 |
---|
77 | mova @r12+, r7 |
---|
78 | mova @r12+, r8 |
---|
79 | mova @r12+, r9 |
---|
80 | mova @r12+, r10 |
---|
81 | #else |
---|
82 | mov.w @r12+, r14 |
---|
83 | mov.w @r12+, r1 |
---|
84 | mov.w @r12+, r4 |
---|
85 | mov.w @r12+, r5 |
---|
86 | mov.w @r12+, r6 |
---|
87 | mov.w @r12+, r7 |
---|
88 | mov.w @r12+, r8 |
---|
89 | mov.w @r12+, r9 |
---|
90 | mov.w @r12+, r10 |
---|
91 | #endif |
---|
92 | ; If caller attempts to return 0, return 1 instead. |
---|
93 | cmp.w #0, r13 |
---|
94 | jne .Lnot_zero |
---|
95 | mov.w #1, r13 |
---|
96 | .Lnot_zero: |
---|
97 | mov.w r13, r12 |
---|
98 | |
---|
99 | #if defined __MSP430X_LARGE__ |
---|
100 | adda #4, r1 |
---|
101 | mova r14, r0 |
---|
102 | #else |
---|
103 | add.w #2, r1 |
---|
104 | mov.w r14, r0 |
---|
105 | #endif |
---|
106 | .size longjmp , . - longjmp |
---|
107 | |
---|