1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-10 14:00:21 +02:00

Moved here from parent directory.

This commit is contained in:
Marius Vollmer 2002-08-01 18:42:11 +00:00
parent c3b6ed76e3
commit f9482b3108
2 changed files with 130 additions and 0 deletions

96
qt/md/arm.h Normal file
View file

@ -0,0 +1,96 @@
/*
* QuickThreads -- Threads-building toolkit.
* Copyright (c) 1993 by David Keppel
* Copyright (c) 2002 by Marius Vollmer
*
* Permission to use, copy, modify and distribute this software and
* its documentation for any purpose and without fee is hereby
* granted, provided that the above copyright notice and this notice
* appear in all copies. This software is provided as a
* proof-of-concept and for demonstration purposes; there is no
* representation about the suitability of this software for any
* purpose.
*/
#ifndef QT_ARM_H
#define QT_ARM_H
typedef unsigned long qt_word_t;
#define QT_GROW_DOWN
/* Stack layout on the ARM:
Callee-save registers are: r4-r11 (f4-f7)
Also save r14, link register, and restore as pc.
+---
| lr/pc
| r11
| r10
| r9
| r8
| r7
| r6
| r5
| r4 <- sp of a suspended thread
+---
Startup:
+---
| only
| user
| argt
| argu <- sp on entry to qt_start
+---
| pc == qt_start
| r11
| r10
| r9
| r8
| r7
| r6
| r5
| r4
+---
*/
/* Stack must be word aligned. */
#define QT_STKALIGN (4) /* Doubleword aligned. */
/* How much space is allocated to hold all the crud for
initialization: r4-r11, r14, and the four args for qt_start. */
#define QT_STKBASE ((9+4)*4)
/* Offsets of various registers, in words, relative to final value of SP. */
#define QT_LR 8
#define QT_11 7
#define QT_10 6
#define QT_9 5
#define QT_8 4
#define QT_7 3
#define QT_6 2
#define QT_5 1
#define QT_4 0
/* When a never-before-run thread is restored, the return pc points
to a fragment of code that starts the thread running. For
non-vargs functions, it just calls the client's `only' function.
*/
extern void qt_start(void);
#define QT_ARGS_MD(sp) (QT_SPUT (sp, QT_LR, qt_start))
/* The *index* (positive offset) of where to put each value. */
#define QT_ONLY_INDEX (12)
#define QT_USER_INDEX (11)
#define QT_ARGT_INDEX (10)
#define QT_ARGU_INDEX (9)
#endif /* ndef QT_ARM_H */

34
qt/md/arm.s Normal file
View file

@ -0,0 +1,34 @@
.text
.align 2
.global qt_abort
.global qt_block
.global qt_blocki
# r0: helper
# r1: arg1
# r2: arg2
# r3: new_sp
qt_abort:
qt_block:
qt_blocki:
stmfd sp!, {r4-r11,lr}
mov ip, r0
mov r0, sp
mov sp, r3
mov lr, pc
mov pc, ip
ldmfd sp!, {r4-r11,pc}
.global qt_start
.global qt_error
.type qt_start,function
qt_start:
ldr r0, [sp]
ldr r1, [sp, #4]
ldr r2, [sp, #8]
ldr lr, qt_error_loc
ldr pc, [sp, #12]
qt_error_loc:
.word qt_error