summaryrefslogtreecommitdiff
path: root/libcpu/ia32/stack.c
diff options
context:
space:
mode:
authorbernard.xiong <[email protected]>2009-07-02 23:17:11 +0000
committerbernard.xiong <[email protected]>2009-07-02 23:17:11 +0000
commit1d74273319cd82ebd3b569f40b38fdd33cef2de7 (patch)
tree83acf6ac99ac7fff82d54780220d0a8cc9d70e7a /libcpu/ia32/stack.c
parentbda4730a9482c23083006abea939ee8d95d6ecff (diff)
import lm3s, lpc2148/lpc2478, x86/qemu, AT91SAM7S/7X, s3c44b0, STM32F103ZE bsp
git-svn-id: https://rt-thread.googlecode.com/svn/trunk@3 bbd45198-f89e-11dd-88c7-29a3b14d5316
Diffstat (limited to 'libcpu/ia32/stack.c')
-rw-r--r--libcpu/ia32/stack.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/libcpu/ia32/stack.c b/libcpu/ia32/stack.c
new file mode 100644
index 0000000000..3efaf3f240
--- /dev/null
+++ b/libcpu/ia32/stack.c
@@ -0,0 +1,59 @@
+/*
+ * File : stack.c
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2006, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://openlab.rt-thread.com/license/LICENSE
+ *
+ * Change Logs:
+ * Date Author Notes
+ */
+
+#include <rtthread.h>
+
+#include <i386.h>
+
+/**
+ * @addtogroup I386
+ */
+/*@{*/
+
+/**
+ * This function will initialize thread stack
+ *
+ * @param tentry the entry of thread
+ * @param parameter the parameter of entry
+ * @param stack_addr the beginning stack address
+ * @param texit the function will be called when thread exit
+ *
+ * @return stack address
+ */
+rt_uint8 *rt_hw_stack_init(void *tentry, void *parameter,
+ rt_uint8 *stack_addr, void *texit)
+{
+ unsigned long *stk;
+
+ stk = (unsigned long *)stack_addr;
+ *(--stk) = (unsigned long)parameter;
+ *(--stk) = (unsigned long)texit;
+ *(--stk) = 0x200; /*flags*/
+ *(--stk) = 0x08; /*cs*/
+ *(--stk) = (unsigned long)tentry; /*eip*/
+ *(--stk) = 0; /*irqno*/
+ *(--stk) = 0x10; /*ds*/
+ *(--stk) = 0x10; /*es*/
+ *(--stk) = 0; /*eax*/
+ *(--stk) = 0; /*ecx*/
+ *(--stk) = 0; /*edx*/
+ *(--stk) = 0; /*ebx*/
+ *(--stk) = 0; /*esp*/
+ *(--stk) = 0; /*ebp*/
+ *(--stk) = 0; /*esi*/
+ *(--stk) = 0; /*edi*/
+
+ /* return task's current stack address */
+ return (rt_uint8 *)stk;
+}
+/*@}*/