summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZYH <[email protected]>2017-12-21 21:26:54 +0800
committerZYH <[email protected]>2017-12-21 21:26:54 +0800
commitfe27b9751cbb00397d93cb6bb4b355546c4f4d64 (patch)
treee801c2e85f95c8459ace48e5f51e3c03f1d16e2e
parent92f5b437f77a444f01ef78e258f1fe6c96b656a6 (diff)
parentd78f5eb6740310649db8e7f4ba81afeca826a5d5 (diff)
Merge remote-tracking branch 'upstream/master'
-rw-r--r--bsp/stm32f107/drivers/stm32_eth.c123
-rw-r--r--bsp/stm32f40x/drivers/stm32f4xx_eth.c122
-rw-r--r--components/CMSIS/Kconfig20
-rw-r--r--components/Kconfig2
-rw-r--r--components/dfs/Kconfig29
-rw-r--r--components/net/Kconfig7
-rw-r--r--components/net/lwip-2.0.2/src/netif/ethernetif.c24
-rw-r--r--libcpu/Kconfig8
-rw-r--r--libcpu/arm/AT91SAM7S/stack.c47
-rw-r--r--libcpu/arm/AT91SAM7X/stack.c48
-rw-r--r--libcpu/arm/am335x/stack.c55
-rw-r--r--libcpu/arm/arm926/stack.c13
-rw-r--r--libcpu/arm/armv6/stack.c71
-rw-r--r--libcpu/arm/cortex-a/stack.c52
-rw-r--r--libcpu/arm/cortex-r4/stack.c58
-rw-r--r--libcpu/arm/dm36x/stack.c70
-rw-r--r--libcpu/arm/lpc24xx/stack.c55
-rw-r--r--libcpu/arm/realview-a8-vmm/stack.c54
-rw-r--r--libcpu/arm/s3c24x0/stack.c49
-rw-r--r--libcpu/arm/s3c44b0/stack.c46
-rw-r--r--libcpu/arm/sep4020/stack.c48
-rw-r--r--libcpu/arm/zynq7000/stack.c28
-rw-r--r--tools/menuconfig.py10
23 files changed, 685 insertions, 354 deletions
diff --git a/bsp/stm32f107/drivers/stm32_eth.c b/bsp/stm32f107/drivers/stm32_eth.c
index 886ed5765a..bd7317090f 100644
--- a/bsp/stm32f107/drivers/stm32_eth.c
+++ b/bsp/stm32f107/drivers/stm32_eth.c
@@ -3027,6 +3027,9 @@ struct rt_stm32_eth
/* interface address info. */
rt_uint8_t dev_addr[MAX_ADDR_LEN]; /* hw address */
+
+ uint32_t ETH_HashTableHigh;
+ uint32_t ETH_HashTableLow;
};
static struct rt_stm32_eth stm32_eth_device;
static struct rt_semaphore tx_buf_free;
@@ -3082,10 +3085,118 @@ void ETH_IRQHandler(void)
/* RT-Thread Device Interface */
+#if (LWIP_IPV4 && LWIP_IGMP) || (LWIP_IPV6 && LWIP_IPV6_MLD)
+/* polynomial: 0x04C11DB7 */
+static uint32_t ethcrc(const uint8_t *data, size_t length)
+{
+ uint32_t crc = 0xffffffff;
+ size_t i;
+ int j;
+
+ for (i = 0; i < length; i++)
+ {
+ for (j = 0; j < 8; j++)
+ {
+ if (((crc >> 31) ^ (data[i] >> j)) & 0x01)
+ {
+ /* x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1 */
+ crc = (crc << 1) ^ 0x04C11DB7;
+ }
+ else
+ {
+ crc = crc << 1;
+ }
+ }
+ }
+
+ return ~crc;
+}
+
+#define HASH_BITS 6 /* #bits in hash */
+static void register_multicast_address(struct rt_stm32_eth *stm32_eth, const uint8_t *mac)
+{
+ uint32_t crc;
+ uint8_t hash;
+
+ /* calculate crc32 value of mac address */
+ crc = ethcrc(mac, 6);
+
+ /* only upper 6 bits (HASH_BITS) are used
+ * which point to specific bit in he hash registers
+ */
+ hash = (crc >> 26) & 0x3F;
+ //rt_kprintf("register_multicast_address crc: %08X hash: %02X\n", crc, hash);
+
+ if (hash > 31)
+ {
+ stm32_eth->ETH_HashTableHigh |= 1 << (hash - 32);
+ ETH->MACHTHR = stm32_eth->ETH_HashTableHigh;
+ }
+ else
+ {
+ stm32_eth->ETH_HashTableLow |= 1 << hash;
+ ETH->MACHTLR = stm32_eth->ETH_HashTableLow;
+ }
+}
+#endif /* (LWIP_IPV4 && LWIP_IGMP) || (LWIP_IPV6 && LWIP_IPV6_MLD) */
+
+#if LWIP_IPV4 && LWIP_IGMP
+static err_t igmp_mac_filter( struct netif *netif, const ip4_addr_t *ip4_addr, u8_t action )
+{
+ uint8_t mac[6];
+ const uint8_t *p = (const uint8_t *)ip4_addr;
+ struct rt_stm32_eth *stm32_eth = (struct rt_stm32_eth *)netif->state;
+
+ mac[0] = 0x01;
+ mac[1] = 0x00;
+ mac[2] = 0x5E;
+ mac[3] = *(p+1) & 0x7F;
+ mac[4] = *(p+2);
+ mac[5] = *(p+3);
+
+ register_multicast_address(stm32_eth, mac);
+
+ if(1)
+ {
+ rt_kprintf("%s %s %s ", __FUNCTION__, (action==NETIF_ADD_MAC_FILTER)?"add":"del", ip4addr_ntoa(ip4_addr));
+ rt_kprintf("%02X:%02X:%02X:%02X:%02X:%02X\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
+ }
+
+ return 0;
+}
+#endif /* LWIP_IPV4 && LWIP_IGMP */
+
+#if LWIP_IPV6 && LWIP_IPV6_MLD
+static err_t mld_mac_filter( struct netif *netif, const ip6_addr_t *ip6_addr, u8_t action )
+{
+ uint8_t mac[6];
+ const uint8_t *p = (const uint8_t *)&ip6_addr->addr[3];
+ struct rt_stm32_eth *stm32_eth = (struct rt_stm32_eth *)netif->state;
+
+ mac[0] = 0x33;
+ mac[1] = 0x33;
+ mac[2] = *(p+0);
+ mac[3] = *(p+1);
+ mac[4] = *(p+2);
+ mac[5] = *(p+3);
+
+ register_multicast_address(stm32_eth, mac);
+
+ if(1)
+ {
+ rt_kprintf("%s %s %s ", __FUNCTION__, (action==NETIF_ADD_MAC_FILTER)?"add":"del", ip6addr_ntoa(ip6_addr));
+ rt_kprintf("%02X:%02X:%02X:%02X:%02X:%02X\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
+ }
+
+ return 0;
+}
+#endif /* LWIP_IPV6 && LWIP_IPV6_MLD */
+
/* initialize the interface */
static rt_err_t rt_stm32_eth_init(rt_device_t dev)
{
vu32 Value = 0;
+ struct rt_stm32_eth * stm32_eth = (struct rt_stm32_eth *)dev;
/* Reset ETHERNET on AHB Bus */
ETH_DeInit();
@@ -3112,7 +3223,9 @@ static rt_err_t rt_stm32_eth_init(rt_device_t dev)
ETH_InitStructure.ETH_ReceiveAll = ETH_ReceiveAll_Enable;
ETH_InitStructure.ETH_BroadcastFramesReception = ETH_BroadcastFramesReception_Disable;
ETH_InitStructure.ETH_PromiscuousMode = ETH_PromiscuousMode_Disable;
- ETH_InitStructure.ETH_MulticastFramesFilter = ETH_MulticastFramesFilter_Perfect;
+ ETH_InitStructure.ETH_MulticastFramesFilter = ETH_MulticastFramesFilter_HashTable;
+ ETH_InitStructure.ETH_HashTableHigh = stm32_eth->ETH_HashTableHigh;
+ ETH_InitStructure.ETH_HashTableLow = stm32_eth->ETH_HashTableLow;
ETH_InitStructure.ETH_UnicastFramesFilter = ETH_UnicastFramesFilter_Perfect;
#if CHECKSUM_BY_HARDWARE
ETH_InitStructure.ETH_ChecksumOffload = ETH_ChecksumOffload_Enable;
@@ -3153,6 +3266,14 @@ static rt_err_t rt_stm32_eth_init(rt_device_t dev)
/* Enable MAC and DMA transmission and reception */
ETH_Start();
+#if LWIP_IPV4 && LWIP_IGMP
+ netif_set_igmp_mac_filter(stm32_eth->parent.netif, igmp_mac_filter);
+#endif /* LWIP_IPV4 && LWIP_IGMP */
+
+#if LWIP_IPV6 && LWIP_IPV6_MLD
+ netif_set_mld_mac_filter(stm32_eth->parent.netif, mld_mac_filter);
+#endif /* LWIP_IPV6 && LWIP_IPV6_MLD */
+
return RT_EOK;
}
diff --git a/bsp/stm32f40x/drivers/stm32f4xx_eth.c b/bsp/stm32f40x/drivers/stm32f4xx_eth.c
index dea2f48339..bf4c70bc49 100644
--- a/bsp/stm32f40x/drivers/stm32f4xx_eth.c
+++ b/bsp/stm32f40x/drivers/stm32f4xx_eth.c
@@ -3274,6 +3274,9 @@ struct rt_stm32_eth
uint32_t ETH_Speed; /*!< @ref ETH_Speed */
uint32_t ETH_Mode; /*!< @ref ETH_Duplex_Mode */
+
+ uint32_t ETH_HashTableHigh;
+ uint32_t ETH_HashTableLow;
};
static struct rt_stm32_eth stm32_eth_device;
static struct rt_semaphore tx_wait;
@@ -3408,6 +3411,113 @@ void ETH_IRQHandler(void)
#include <lwip/icmp.h>
#include "lwipopts.h"
+#if (LWIP_IPV4 && LWIP_IGMP) || (LWIP_IPV6 && LWIP_IPV6_MLD)
+/* polynomial: 0x04C11DB7 */
+static uint32_t ethcrc(const uint8_t *data, size_t length)
+{
+ uint32_t crc = 0xffffffff;
+ size_t i;
+ int j;
+
+ for (i = 0; i < length; i++)
+ {
+ for (j = 0; j < 8; j++)
+ {
+ if (((crc >> 31) ^ (data[i] >> j)) & 0x01)
+ {
+ /* x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1 */
+ crc = (crc << 1) ^ 0x04C11DB7;
+ }
+ else
+ {
+ crc = crc << 1;
+ }
+ }
+ }
+
+ return ~crc;
+}
+
+#define HASH_BITS 6 /* #bits in hash */
+static void register_multicast_address(struct rt_stm32_eth *stm32_eth, const uint8_t *mac)
+{
+ uint32_t crc;
+ uint8_t hash;
+
+ /* calculate crc32 value of mac address */
+ crc = ethcrc(mac, 6);
+
+ /* only upper 6 bits (HASH_BITS) are used
+ * which point to specific bit in he hash registers
+ */
+ hash = (crc >> 26) & 0x3F;
+ //rt_kprintf("register_multicast_address crc: %08X hash: %02X\n", crc, hash);
+
+ if (hash > 31)
+ {
+ stm32_eth->ETH_HashTableHigh |= 1 << (hash - 32);
+ ETH->MACHTHR = stm32_eth->ETH_HashTableHigh;
+ }
+ else
+ {
+ stm32_eth->ETH_HashTableLow |= 1 << hash;
+ ETH->MACHTLR = stm32_eth->ETH_HashTableLow;
+ }
+}
+#endif /* (LWIP_IPV4 && LWIP_IGMP) || (LWIP_IPV6 && LWIP_IPV6_MLD) */
+
+#if LWIP_IPV4 && LWIP_IGMP
+static err_t igmp_mac_filter( struct netif *netif, const ip4_addr_t *ip4_addr, u8_t action )
+{
+ uint8_t mac[6];
+ const uint8_t *p = (const uint8_t *)ip4_addr;
+ struct rt_stm32_eth *stm32_eth = (struct rt_stm32_eth *)netif->state;
+
+ mac[0] = 0x01;
+ mac[1] = 0x00;
+ mac[2] = 0x5E;
+ mac[3] = *(p+1) & 0x7F;
+ mac[4] = *(p+2);
+ mac[5] = *(p+3);
+
+ register_multicast_address(stm32_eth, mac);
+
+ if(1)
+ {
+ rt_kprintf("%s %s %s ", __FUNCTION__, (action==NETIF_ADD_MAC_FILTER)?"add":"del", ip4addr_ntoa(ip4_addr));
+ rt_kprintf("%02X:%02X:%02X:%02X:%02X:%02X\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
+ }
+
+ return 0;
+}
+#endif /* LWIP_IPV4 && LWIP_IGMP */
+
+#if LWIP_IPV6 && LWIP_IPV6_MLD
+static err_t mld_mac_filter( struct netif *netif, const ip6_addr_t *ip6_addr, u8_t action )
+{
+ uint8_t mac[6];
+ const uint8_t *p = (const uint8_t *)&ip6_addr->addr[3];
+ struct rt_stm32_eth *stm32_eth = (struct rt_stm32_eth *)netif->state;
+
+ mac[0] = 0x33;
+ mac[1] = 0x33;
+ mac[2] = *(p+0);
+ mac[3] = *(p+1);
+ mac[4] = *(p+2);
+ mac[5] = *(p+3);
+
+ register_multicast_address(stm32_eth, mac);
+
+ if(1)
+ {
+ rt_kprintf("%s %s %s ", __FUNCTION__, (action==NETIF_ADD_MAC_FILTER)?"add":"del", ip6addr_ntoa(ip6_addr));
+ rt_kprintf("%02X:%02X:%02X:%02X:%02X:%02X\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
+ }
+
+ return 0;
+}
+#endif /* LWIP_IPV6 && LWIP_IPV6_MLD */
+
/* initialize the interface */
static rt_err_t rt_stm32_eth_init(rt_device_t dev)
{
@@ -3445,7 +3555,9 @@ static rt_err_t rt_stm32_eth_init(rt_device_t dev)
ETH_InitStructure.ETH_ReceiveAll = ETH_ReceiveAll_Disable;
ETH_InitStructure.ETH_BroadcastFramesReception = ETH_BroadcastFramesReception_Enable;
ETH_InitStructure.ETH_PromiscuousMode = ETH_PromiscuousMode_Disable;
- ETH_InitStructure.ETH_MulticastFramesFilter = ETH_MulticastFramesFilter_Perfect;
+ ETH_InitStructure.ETH_MulticastFramesFilter = ETH_MulticastFramesFilter_HashTable;
+ ETH_InitStructure.ETH_HashTableHigh = stm32_eth->ETH_HashTableHigh;
+ ETH_InitStructure.ETH_HashTableLow = stm32_eth->ETH_HashTableLow;
ETH_InitStructure.ETH_UnicastFramesFilter = ETH_UnicastFramesFilter_Perfect;
#ifdef CHECKSUM_BY_HARDWARE
ETH_InitStructure.ETH_ChecksumOffload = ETH_ChecksumOffload_Enable;
@@ -3486,6 +3598,14 @@ static rt_err_t rt_stm32_eth_init(rt_device_t dev)
/* Enable MAC and DMA transmission and reception */
ETH_Start();
+#if LWIP_IPV4 && LWIP_IGMP
+ netif_set_igmp_mac_filter(stm32_eth->parent.netif, igmp_mac_filter);
+#endif /* LWIP_IPV4 && LWIP_IGMP */
+
+#if LWIP_IPV6 && LWIP_IPV6_MLD
+ netif_set_mld_mac_filter(stm32_eth->parent.netif, mld_mac_filter);
+#endif /* LWIP_IPV6 && LWIP_IPV6_MLD */
+
return RT_EOK;
}
diff --git a/components/CMSIS/Kconfig b/components/CMSIS/Kconfig
new file mode 100644
index 0000000000..8a27f44405
--- /dev/null
+++ b/components/CMSIS/Kconfig
@@ -0,0 +1,20 @@
+if ARCH_ARM_CORTEX_M
+
+menu "ARM CMSIS"
+
+config RT_USING_CMSIS_OS
+ bool "Using CMSIS RTOS API"
+ default n
+ help
+ Enable CMSIS RTOS API, which is implemented above RT-Thread.
+
+config RT_USING_RTT_CMSIS
+ bool "Using CMSIS Header files in RT-Thread"
+ default n
+ help
+ Use CMSIS header files in RT-Thread/components/CMSIS. Otherwise, use the
+ CMSIS header files in BSP.
+
+endmenu
+
+endif
diff --git a/components/Kconfig b/components/Kconfig
index b8c94b558a..40d9bee5e2 100644
--- a/components/Kconfig
+++ b/components/Kconfig
@@ -28,4 +28,6 @@ source "$RTT_DIR/components/vbus/Kconfig"
source "$RTT_DIR/components/utilities/Kconfig"
+source "$RTT_DIR/components/CMSIS/Kconfig"
+
endmenu
diff --git a/components/dfs/Kconfig b/components/dfs/Kconfig
index 91df96cb08..ec9985e21c 100644
--- a/components/dfs/Kconfig
+++ b/components/dfs/Kconfig
@@ -12,17 +12,20 @@ if RT_USING_DFS
default y
config DFS_FILESYSTEMS_MAX
- int "The maximal number of mounted file system"
- default 2
+ int "The maximal number of mounted file system"
+ default 4 if RT_USING_DFS_NFS
+ default 2
config DFS_FILESYSTEM_TYPES_MAX
int "The maximal number of file system type"
- default 2
+ default 4 if RT_USING_DFS_NFS
+ default 2
config DFS_FD_MAX
int "The maximal number of opened files"
+ default 16 if RT_USING_DFS_NFS
default 4
-
+
config RT_USING_DFS_ELMFAT
bool "Enable elm-chan fatfs"
default y
@@ -51,18 +54,18 @@ if RT_USING_DFS
config RT_DFS_ELM_USE_LFN_2
bool "2: LFN with dynamic LFN working buffer on the stack"
-
+
config RT_DFS_ELM_USE_LFN_3
bool "3: LFN with dynamic LFN working buffer on the heap"
endchoice
-
+
config RT_DFS_ELM_USE_LFN
int
default 0 if RT_DFS_ELM_USE_LFN_0
default 1 if RT_DFS_ELM_USE_LFN_1
default 2 if RT_DFS_ELM_USE_LFN_2
default 3 if RT_DFS_ELM_USE_LFN_3
-
+
config RT_DFS_ELM_MAX_LFN
int "Maximal size of file name length"
range 12 255
@@ -81,7 +84,7 @@ if RT_USING_DFS
config RT_DFS_ELM_USE_ERASE
bool "Enable sector erase feature"
default n
-
+
config RT_DFS_ELM_REENTRANT
bool "Enable the reentrancy (thread safe) of the FatFs module"
default y
@@ -91,7 +94,7 @@ if RT_USING_DFS
config RT_USING_DFS_DEVFS
bool "Using devfs for device objects"
default y
-
+
config RT_USING_DFS_NET
bool "Enable BSD socket operated by file system API"
select RT_USING_LWIP
@@ -140,23 +143,23 @@ if RT_USING_DFS
config RT_UFFS_ECC_MODE_2
bool "2: Flash driver(or by hardware) calculate the ECC"
-
+
config RT_UFFS_ECC_MODE_3
bool "3: Hardware calculate the ECC and automatically write to spare."
endchoice
-
+
config RT_UFFS_ECC_MODE
int
default 0 if RT_UFFS_ECC_MODE_0
default 1 if RT_UFFS_ECC_MODE_1
default 2 if RT_UFFS_ECC_MODE_2
default 3 if RT_UFFS_ECC_MODE_3
-
+
endif
config RT_USING_DFS_NFS
bool "Using NFS v3 client file system"
- depends on RT_USING_LWIP
+ select RT_USING_LWIP
default n
if RT_USING_DFS_NFS
diff --git a/components/net/Kconfig b/components/net/Kconfig
index af375e6c03..f75ed461b1 100644
--- a/components/net/Kconfig
+++ b/components/net/Kconfig
@@ -27,7 +27,7 @@ config RT_USING_LWIP
config RT_LWIP_IGMP
bool "IGMP protocol"
- default n
+ default y
config RT_LWIP_ICMP
bool "ICMP protocol"
@@ -91,12 +91,12 @@ config RT_USING_LWIP
config RT_LWIP_PPPOE
bool "PPPoE protocol"
default n
-
+
config RT_LWIP_PPPOS
bool "PPPoS protocol"
default n
endif
-
+
config RT_MEMP_NUM_NETCONN
int "the number of struct netconns"
default 8
@@ -111,6 +111,7 @@ config RT_USING_LWIP
config RT_LWIP_UDP_PCB_NUM
int "the number of UDP socket"
+ default 8 if RT_USING_DFS_NFS
default 4
if RT_LWIP_TCP
diff --git a/components/net/lwip-2.0.2/src/netif/ethernetif.c b/components/net/lwip-2.0.2/src/netif/ethernetif.c
index bd28815c4b..ba23528c58 100644
--- a/components/net/lwip-2.0.2/src/netif/ethernetif.c
+++ b/components/net/lwip-2.0.2/src/netif/ethernetif.c
@@ -173,10 +173,26 @@ static err_t eth_netif_device_init(struct netif *netif)
netif->flags = (ethif->flags & 0xff);
#if LWIP_IPV6
- netif->output_ip6 = ethip6_output;
- netif->ip6_autoconfig_enabled = 1;
- netif_create_ip6_linklocal_address(netif, 1);
- netif->flags |= NETIF_FLAG_MLD6;
+ netif->output_ip6 = ethip6_output;
+ netif->ip6_autoconfig_enabled = 1;
+ netif_create_ip6_linklocal_address(netif, 1);
+
+#if LWIP_IPV6_MLD
+ netif->flags |= NETIF_FLAG_MLD6;
+
+ /*
+ * For hardware/netifs that implement MAC filtering.
+ * All-nodes link-local is handled by default, so we must let the hardware know
+ * to allow multicast packets in.
+ * Should set mld_mac_filter previously. */
+ if (netif->mld_mac_filter != NULL)
+ {
+ ip6_addr_t ip6_allnodes_ll;
+ ip6_addr_set_allnodes_linklocal(&ip6_allnodes_ll);
+ netif->mld_mac_filter(netif, &ip6_allnodes_ll, NETIF_ADD_MAC_FILTER);
+ }
+#endif /* LWIP_IPV6_MLD */
+
#endif /* LWIP_IPV6 */
/* set default netif */
diff --git a/libcpu/Kconfig b/libcpu/Kconfig
index 0279ca1bcf..1c63f114ca 100644
--- a/libcpu/Kconfig
+++ b/libcpu/Kconfig
@@ -33,6 +33,14 @@ config ARCH_ARM_MMU
bool
depends on ARCH_ARM
+config ARCH_ARM_ARM9
+ bool
+ select ARCH_ARM
+
+config ARCH_ARM_ARM11
+ bool
+ select ARCH_ARM
+
config ARCH_ARM_CORTEX_A
bool
select ARCH_ARM
diff --git a/libcpu/arm/AT91SAM7S/stack.c b/libcpu/arm/AT91SAM7S/stack.c
index b0dc78db2c..14acc54456 100644
--- a/libcpu/arm/AT91SAM7S/stack.c
+++ b/libcpu/arm/AT91SAM7S/stack.c
@@ -30,31 +30,34 @@
* @return stack address
*/
rt_uint8_t *rt_hw_stack_init(void *tentry, void *parameter,
- rt_uint8_t *stack_addr, void *texit)
+ rt_uint8_t *stack_addr, void *texit)
{
- unsigned long *stk;
+ rt_uint32_t *stk;
- stk = (unsigned long *)stack_addr;
- *(stk) = (unsigned long)tentry; /* entry point */
- *(--stk) = (unsigned long)texit; /* lr */
- *(--stk) = 0; /* r12 */
- *(--stk) = 0; /* r11 */
- *(--stk) = 0; /* r10 */
- *(--stk) = 0; /* r9 */
- *(--stk) = 0; /* r8 */
- *(--stk) = 0; /* r7 */
- *(--stk) = 0; /* r6 */
- *(--stk) = 0; /* r5 */
- *(--stk) = 0; /* r4 */
- *(--stk) = 0; /* r3 */
- *(--stk) = 0; /* r2 */
- *(--stk) = 0; /* r1 */
- *(--stk) = (unsigned long)parameter; /* r0 : argument */
- *(--stk) = SVCMODE; /* cpsr */
- *(--stk) = SVCMODE; /* spsr */
+ stack_addr += sizeof(rt_uint32_t);
+ stack_addr = (rt_uint8_t *)RT_ALIGN_DOWN((rt_uint32_t)stack_addr, 8);
+ stk = (rt_uint32_t *)stack_addr;
- /* return task's current stack address */
- return (rt_uint8_t *)stk;
+ *(--stk) = (rt_uint32_t)tentry; /* entry point */
+ *(--stk) = (rt_uint32_t)texit; /* lr */
+ *(--stk) = 0xdeadbeef; /* r12 */
+ *(--stk) = 0xdeadbeef; /* r11 */
+ *(--stk) = 0xdeadbeef; /* r10 */
+ *(--stk) = 0xdeadbeef; /* r9 */
+ *(--stk) = 0xdeadbeef; /* r8 */
+ *(--stk) = 0xdeadbeef; /* r7 */
+ *(--stk) = 0xdeadbeef; /* r6 */
+ *(--stk) = 0xdeadbeef; /* r5 */
+ *(--stk) = 0xdeadbeef; /* r4 */
+ *(--stk) = 0xdeadbeef; /* r3 */
+ *(--stk) = 0xdeadbeef; /* r2 */
+ *(--stk) = 0xdeadbeef; /* r1 */
+ *(--stk) = (rt_uint32_t)parameter; /* r0 : argument */
+ *(--stk) = SVCMODE; /* cpsr */
+ *(--stk) = SVCMODE; /* spsr */
+
+ /* return task's current stack address */
+ return (rt_uint8_t *)stk;
}
/*@}*/
diff --git a/libcpu/arm/AT91SAM7X/stack.c b/libcpu/arm/AT91SAM7X/stack.c
index 6060b63722..d6711a5296 100644
--- a/libcpu/arm/AT91SAM7X/stack.c
+++ b/libcpu/arm/AT91SAM7X/stack.c
@@ -13,7 +13,7 @@
*/
#include <rtthread.h>
-#define SVCMODE 0x13
+#define SVCMODE 0x13
/**
* @addtogroup AT91SAM7
@@ -31,31 +31,33 @@
* @return stack address
*/
rt_uint8_t *rt_hw_stack_init(void *tentry, void *parameter,
- rt_uint8_t *stack_addr, void *texit)
+ rt_uint8_t *stack_addr, void *texit)
{
- unsigned long *stk;
+ rt_uint32_t *stk;
- stk = (unsigned long *)stack_addr;
- *(stk) = (unsigned long)tentry; /* entry point */
- *(--stk) = (unsigned long)texit; /* lr */
- *(--stk) = 0; /* r12 */
- *(--stk) = 0; /* r11 */
- *(--stk) = 0; /* r10 */
- *(--stk) = 0; /* r9 */
- *(--stk) = 0; /* r8 */
- *(--stk) = 0; /* r7 */
- *(--stk) = 0; /* r6 */
- *(--stk) = 0; /* r5 */
- *(--stk) = 0; /* r4 */
- *(--stk) = 0; /* r3 */
- *(--stk) = 0; /* r2 */
- *(--stk) = 0; /* r1 */
- *(--stk) = (unsigned long)parameter; /* r0 : argument */
- *(--stk) = SVCMODE; /* cpsr */
- *(--stk) = SVCMODE; /* spsr */
+ stack_addr += sizeof(rt_uint32_t);
+ stack_addr = (rt_uint8_t *)RT_ALIGN_DOWN((rt_uint32_t)stack_addr, 8);
+ stk = (rt_uint32_t *)stack_addr;
+ *(--stk) = (rt_uint32_t)tentry; /* entry point */
+ *(--stk) = (rt_uint32_t)texit; /* lr */
+ *(--stk) = 0xdeadbeef; /* r12 */
+ *(--stk) = 0xdeadbeef; /* r11 */
+ *(--stk) = 0xdeadbeef; /* r10 */
+ *(--stk) = 0xdeadbeef; /* r9 */
+ *(--stk) = 0xdeadbeef; /* r8 */
+ *(--stk) = 0xdeadbeef; /* r7 */
+ *(--stk) = 0xdeadbeef; /* r6 */
+ *(--stk) = 0xdeadbeef; /* r5 */
+ *(--stk) = 0xdeadbeef; /* r4 */
+ *(--stk) = 0xdeadbeef; /* r3 */
+ *(--stk) = 0xdeadbeef; /* r2 */
+ *(--stk) = 0xdeadbeef; /* r1 */
+ *(--stk) = (rt_uint32_t)parameter; /* r0 : argument */
+ *(--stk) = SVCMODE; /* cpsr */
+ *(--stk) = SVCMODE; /* spsr */
- /* return task's current stack address */
- return (rt_uint8_t *)stk;
+ /* return task's current stack address */
+ return (rt_uint8_t *)stk;
}
/*@}*/
diff --git a/libcpu/arm/am335x/stack.c b/libcpu/arm/am335x/stack.c
index e46f34f7cd..7415e230f5 100644
--- a/libcpu/arm/am335x/stack.c
+++ b/libcpu/arm/am335x/stack.c
@@ -24,42 +24,45 @@
* This function will initialize thread stack
*
* @param tentry the entry of thread
- * @param parameter the parameter of entry
+ * @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_t *rt_hw_stack_init(void *tentry, void *parameter,
- rt_uint8_t *stack_addr, void *texit)
+ rt_uint8_t *stack_addr, void *texit)
{
- rt_uint32_t *stk;
+ rt_uint32_t *stk;
- stk = (rt_uint32_t*)stack_addr;
- *(stk) = (rt_uint32_t)tentry; /* entry point */
- *(--stk) = (rt_uint32_t)texit; /* lr */
- *(--stk) = 0; /* r12 */
- *(--stk) = 0; /* r11 */
- *(--stk) = 0; /* r10 */
- *(--stk) = 0; /* r9 */
- *(--stk) = 0; /* r8 */
- *(--stk) = 0; /* r7 */
- *(--stk) = 0; /* r6 */
- *(--stk) = 0; /* r5 */
- *(--stk) = 0; /* r4 */
- *(--stk) = 0; /* r3 */
- *(--stk) = 0; /* r2 */
- *(--stk) = 0; /* r1 */
- *(--stk) = (rt_uint32_t)parameter; /* r0 : argument */
+ stack_addr += sizeof(rt_uint32_t);
+ stack_addr = (rt_uint8_t *)RT_ALIGN_DOWN((rt_uint32_t)stack_addr, 8);
+ stk = (rt_uint32_t *)stack_addr;
- /* cpsr */
- if ((rt_uint32_t)tentry & 0x01)
- *(--stk) = SVCMODE | 0x20; /* thumb mode */
- else
- *(--stk) = SVCMODE; /* arm mode */
+ *(--stk) = (rt_uint32_t)tentry; /* entry point */
+ *(--stk) = (rt_uint32_t)texit; /* lr */
+ *(--stk) = 0xdeadbeef; /* r12 */
+ *(--stk) = 0xdeadbeef; /* r11 */
+ *(--stk) = 0xdeadbeef; /* r10 */
+ *(--stk) = 0xdeadbeef; /* r9 */
+ *(--stk) = 0xdeadbeef; /* r8 */
+ *(--stk) = 0xdeadbeef; /* r7 */
+ *(--stk) = 0xdeadbeef; /* r6 */
+ *(--stk) = 0xdeadbeef; /* r5 */
+ *(--stk) = 0xdeadbeef; /* r4 */
+ *(--stk) = 0xdeadbeef; /* r3 */
+ *(--stk) = 0xdeadbeef; /* r2 */
+ *(--stk) = 0xdeadbeef; /* r1 */
+ *(--stk) = (rt_uint32_t)parameter; /* r0 : argument */
- /* return task's current stack address */
- return (rt_uint8_t *)stk;
+ /* cpsr */
+ if ((rt_uint32_t)tentry & 0x01)
+ *(--stk) = SVCMODE | 0x20; /* thumb mode */
+ else
+ *(--stk) = SVCMODE; /* arm mode */
+
+ /* return task's current stack address */
+ return (rt_uint8_t *)stk;
}
/*@}*/
diff --git a/libcpu/arm/arm926/stack.c b/libcpu/arm/arm926/stack.c
index ee29aad3ac..966088f829 100644
--- a/libcpu/arm/arm926/stack.c
+++ b/libcpu/arm/arm926/stack.c
@@ -50,10 +50,9 @@ rt_uint8_t *rt_hw_stack_init(void *tentry, void *parameter,
{
rt_uint32_t *stk;
- //stk = (rt_uint32_t*)stack_addr;
stack_addr += sizeof(rt_uint32_t);
stack_addr = (rt_uint8_t *)RT_ALIGN_DOWN((rt_uint32_t)stack_addr, 8);
- stk = (rt_uint32_t *)stack_addr;
+ stk = (rt_uint32_t *)stack_addr;
*(--stk) = (rt_uint32_t)tentry; /* entry point */
*(--stk) = (rt_uint32_t)texit; /* lr */
@@ -70,11 +69,11 @@ rt_uint8_t *rt_hw_stack_init(void *tentry, void *parameter,
*(--stk) = 0xdeadbeef; /* r2 */
*(--stk) = 0xdeadbeef; /* r1 */
*(--stk) = (rt_uint32_t)parameter; /* r0 : argument */
- /* cpsr */
- if ((rt_uint32_t)tentry & 0x01)
- *(--stk) = SVCMODE | 0x20; /* thumb mode */
- else
- *(--stk) = SVCMODE; /* arm mode */
+ /* cpsr */
+ if ((rt_uint32_t)tentry & 0x01)
+ *(--stk) = SVCMODE | 0x20; /* thumb mode */
+ else
+ *(--stk) = SVCMODE; /* arm mode */
/* return task's current stack address */
return (rt_uint8_t *)stk;
diff --git a/libcpu/arm/armv6/stack.c b/libcpu/arm/armv6/stack.c
index ceb04f0985..648ea7dbf5 100644
--- a/libcpu/arm/armv6/stack.c
+++ b/libcpu/arm/armv6/stack.c
@@ -26,54 +26,57 @@
/*****************************/
/* CPU Mode */
/*****************************/
-#define USERMODE 0x10
-#define FIQMODE 0x11
-#define IRQMODE 0x12
-#define SVCMODE 0x13
-#define ABORTMODE 0x17
-#define UNDEFMODE 0x1b
-#define MODEMASK 0x1f
-#define NOINT 0xc0
+#define USERMODE 0x10
+#define FIQMODE 0x11
+#define IRQMODE 0x12
+#define SVCMODE 0x13
+#define ABORTMODE 0x17
+#define UNDEFMODE 0x1b
+#define MODEMASK 0x1f
+#define NOINT 0xc0
/**
* This function will initialize thread stack
*
* @param tentry the entry of thread
- * @param parameter the parameter of entry
+ * @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_t *rt_hw_stack_init(void *tentry, void *parameter,
- rt_uint8_t *stack_addr, void *texit)
+ rt_uint8_t *stack_addr, void *texit)
{
- rt_uint32_t *stk;
+ rt_uint32_t *stk;
- stk = (rt_uint32_t*)stack_addr;
- *(stk) = (rt_uint32_t)tentry; /* entry point */
- *(--stk) = (rt_uint32_t)texit; /* lr */
- *(--stk) = 0; /* r12 */
- *(--stk) = 0; /* r11 */
- *(--stk) = 0; /* r10 */
- *(--stk) = 0; /* r9 */
- *(--stk) = 0; /* r8 */
- *(--stk) = 0; /* r7 */
- *(--stk) = 0; /* r6 */
- *(--stk) = 0; /* r5 */
- *(--stk) = 0; /* r4 */
- *(--stk) = 0; /* r3 */
- *(--stk) = 0; /* r2 */
- *(--stk) = 0; /* r1 */
- *(--stk) = (rt_uint32_t)parameter; /* r0 : argument */
+ stack_addr += sizeof(rt_uint32_t);
+ stack_addr = (rt_uint8_t *)RT_ALIGN_DOWN((rt_uint32_t)stack_addr, 8);
+ stk = (rt_uint32_t *)stack_addr;
- /* cpsr */
- if ((rt_uint32_t)tentry & 0x01)
- *(--stk) = SVCMODE | 0x20; /* thumb mode */
- else
- *(--stk) = SVCMODE; /* arm mode */
+ *(--stk) = (rt_uint32_t)tentry; /* entry point */
+ *(--stk) = (rt_uint32_t)texit; /* lr */
+ *(--stk) = 0xdeadbeef; /* r12 */
+ *(--stk) = 0xdeadbeef; /* r11 */
+ *(--stk) = 0xdeadbeef; /* r10 */
+ *(--stk) = 0xdeadbeef; /* r9 */
+ *(--stk) = 0xdeadbeef; /* r8 */
+ *(--stk) = 0xdeadbeef; /* r7 */
+ *(--stk) = 0xdeadbeef; /* r6 */
+ *(--stk) = 0xdeadbeef; /* r5 */
+ *(--stk) = 0xdeadbeef; /* r4 */
+ *(--stk) = 0xdeadbeef; /* r3 */
+ *(--stk) = 0xdeadbeef; /* r2 */
+ *(--stk) = 0xdeadbeef; /* r1 */
+ *(--stk) = (rt_uint32_t)parameter; /* r0 : argument */
- /* return task's current stack address */
- return (rt_uint8_t *)stk;
+ /* cpsr */
+ if ((rt_uint32_t)tentry & 0x01)
+ *(--stk) = SVCMODE | 0x20; /* thumb mode */
+ else
+ *(--stk) = SVCMODE; /* arm mode */
+
+ /* return task's current stack address */
+ return (rt_uint8_t *)stk;
}
diff --git a/libcpu/arm/cortex-a/stack.c b/libcpu/arm/cortex-a/stack.c
index e653c5d111..e60e8c7170 100644
--- a/libcpu/arm/cortex-a/stack.c
+++ b/libcpu/arm/cortex-a/stack.c
@@ -32,35 +32,37 @@
* @return stack address
*/
rt_uint8_t *rt_hw_stack_init(void *tentry, void *parameter,
- rt_uint8_t *stack_addr, void *texit)
+ rt_uint8_t *stack_addr, void *texit)
{
- rt_uint32_t *stk;
+ rt_uint32_t *stk;
- stk = (rt_uint32_t*)stack_addr;
- *(stk) = (rt_uint32_t)tentry; /* entry point */
- *(--stk) = (rt_uint32_t)texit; /* lr */
- *(--stk) = 0; /* r12 */
- *(--stk) = 0; /* r11 */
- *(--stk) = 0; /* r10 */
- *(--stk) = 0; /* r9 */
- *(--stk) = 0; /* r8 */
- *(--stk) = 0; /* r7 */
- *(--stk) = 0; /* r6 */
- *(--stk) = 0; /* r5 */
- *(--stk) = 0; /* r4 */
- *(--stk) = 0; /* r3 */
- *(--stk) = 0; /* r2 */
- *(--stk) = 0; /* r1 */
- *(--stk) = (rt_uint32_t)parameter; /* r0 : argument */
+ stack_addr += sizeof(rt_uint32_t);
+ stack_addr = (rt_uint8_t *)RT_ALIGN_DOWN((rt_uint32_t)stack_addr, 8);
+ stk = (rt_uint32_t *)stack_addr;
+ *(--stk) = (rt_uint32_t)tentry; /* entry point */
+ *(--stk) = (rt_uint32_t)texit; /* lr */
+ *(--stk) = 0xdeadbeef; /* r12 */
+ *(--stk) = 0xdeadbeef; /* r11 */
+ *(--stk) = 0xdeadbeef; /* r10 */
+ *(--stk) = 0xdeadbeef; /* r9 */
+ *(--stk) = 0xdeadbeef; /* r8 */
+ *(--stk) = 0xdeadbeef; /* r7 */
+ *(--stk) = 0xdeadbeef; /* r6 */
+ *(--stk) = 0xdeadbeef; /* r5 */
+ *(--stk) = 0xdeadbeef; /* r4 */
+ *(--stk) = 0xdeadbeef; /* r3 */
+ *(--stk) = 0xdeadbeef; /* r2 */
+ *(--stk) = 0xdeadbeef; /* r1 */
+ *(--stk) = (rt_uint32_t)parameter; /* r0 : argument */
- /* cpsr */
- if ((rt_uint32_t)tentry & 0x01)
- *(--stk) = SVCMODE | 0x20; /* thumb mode */
- else
- *(--stk) = SVCMODE; /* arm mode */
+ /* cpsr */
+ if ((rt_uint32_t)tentry & 0x01)
+ *(--stk) = SVCMODE | 0x20; /* thumb mode */
+ else
+ *(--stk) = SVCMODE; /* arm mode */
- /* return task's current stack address */
- return (rt_uint8_t *)stk;
+ /* return task's current stack address */
+ return (rt_uint8_t *)stk;
}
/*@}*/
diff --git a/libcpu/arm/cortex-r4/stack.c b/libcpu/arm/cortex-r4/stack.c
index 3c8e89444c..852c6ea384 100644
--- a/libcpu/arm/cortex-r4/stack.c
+++ b/libcpu/arm/cortex-r4/stack.c
@@ -24,39 +24,41 @@
* This function will initialize thread stack
*
* @param tentry the entry of thread
- * @param parameter the parameter of entry
+ * @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_t *rt_hw_stack_init(void *tentry, void *parameter,
- rt_uint8_t *stack_addr, void *texit)
+ rt_uint8_t *stack_addr, void *texit)
{
- unsigned long *stk;
+ rt_uint32_t *stk;
- stk = (unsigned long*)stack_addr;
- *( stk) = (unsigned long) tentry; /* entry point */
- *(--stk) = (unsigned long) texit; /* lr */
- *(--stk) = 0; /* r12 */
- *(--stk) = 0; /* r11 */
- *(--stk) = 0; /* r10 */
- *(--stk) = 0; /* r9 */
- *(--stk) = 0; /* r8 */
- *(--stk) = 0; /* r7 */
- *(--stk) = 0; /* r6 */
- *(--stk) = 0; /* r5 */
- *(--stk) = 0; /* r4 */
- *(--stk) = 0; /* r3 */
- *(--stk) = 0; /* r2 */
- *(--stk) = 0; /* r1 */
- *(--stk) = (unsigned long)parameter; /* r0 : argument */
+ stack_addr += sizeof(rt_uint32_t);
+ stack_addr = (rt_uint8_t *)RT_ALIGN_DOWN((rt_uint32_t)stack_addr, 8);
+ stk = (rt_uint32_t *)stack_addr;
+ *(--stk) = (rt_uint32_t)tentry; /* entry point */
+ *(--stk) = (rt_uint32_t)texit; /* lr */
+ *(--stk) = 0xdeadbeef; /* r12 */
+ *(--stk) = 0xdeadbeef; /* r11 */
+ *(--stk) = 0xdeadbeef; /* r10 */
+ *(--stk) = 0xdeadbeef; /* r9 */
+ *(--stk) = 0xdeadbeef; /* r8 */
+ *(--stk) = 0xdeadbeef; /* r7 */
+ *(--stk) = 0xdeadbeef; /* r6 */
+ *(--stk) = 0xdeadbeef; /* r5 */
+ *(--stk) = 0xdeadbeef; /* r4 */
+ *(--stk) = 0xdeadbeef; /* r3 */
+ *(--stk) = 0xdeadbeef; /* r2 */
+ *(--stk) = 0xdeadbeef; /* r1 */
+ *(--stk) = (rt_uint32_t)parameter; /* r0 : argument */
- /* cpsr */
- if ((rt_uint32_t)tentry & 0x01)
- *(--stk) = SVCMODE | 0x20; /* thumb mode */
- else
- *(--stk) = SVCMODE; /* arm mode */
+ /* cpsr */
+ if ((rt_uint32_t)tentry & 0x01)
+ *(--stk) = SVCMODE | 0x20; /* thumb mode */
+ else
+ *(--stk) = SVCMODE; /* arm mode */
#if defined(__TI_VFP_SUPPORT__) || (defined (__VFP_FP__) && !defined(__SOFTFP__))
#ifndef RT_VFP_LAZY_STACKING
@@ -73,13 +75,13 @@ rt_uint8_t *rt_hw_stack_init(void *tentry, void *parameter,
*(--stk) = 0x40000000;
}
#else
- /* FPEXC. Disable the FVP by default. */
- *(--stk) = 0x00000000;
+ /* FPEXC. Disable the FVP by default. */
+ *(--stk) = 0x00000000;
#endif
#endif
- /* return task's current stack address */
- return (rt_uint8_t *)stk;
+ /* return task's current stack address */
+ return (rt_uint8_t *)stk;
}
/*@}*/
diff --git a/libcpu/arm/dm36x/stack.c b/libcpu/arm/dm36x/stack.c
index b41b0b859c..fd56e7a497 100644
--- a/libcpu/arm/dm36x/stack.c
+++ b/libcpu/arm/dm36x/stack.c
@@ -26,54 +26,56 @@
/*****************************/
/* CPU Mode */
/*****************************/
-#define USERMODE 0x10
-#define FIQMODE 0x11
-#define IRQMODE 0x12
-#define SVCMODE 0x13
-#define ABORTMODE 0x17
-#define UNDEFMODE 0x1b
-#define MODEMASK 0x1f
-#define NOINT 0xc0
+#define USERMODE 0x10
+#define FIQMODE 0x11
+#define IRQMODE 0x12
+#define SVCMODE 0x13
+#define ABORTMODE 0x17
+#define UNDEFMODE 0x1b
+#define MODEMASK 0x1f
+#define NOINT 0xc0
/**
* This function will initialize thread stack
*
* @param tentry the entry of thread
- * @param parameter the parameter of entry
+ * @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_t *rt_hw_stack_init(void *tentry, void *parameter,
- rt_uint8_t *stack_addr, void *texit)
+ rt_uint8_t *stack_addr, void *texit)
{
- rt_uint32_t *stk;
+ rt_uint32_t *stk;
- stk = (rt_uint32_t*)stack_addr;
- *(stk) = (rt_uint32_t)tentry; /* entry point */
- *(--stk) = (rt_uint32_t)texit; /* lr */
- *(--stk) = 0; /* r12 */
- *(--stk) = 0; /* r11 */
- *(--stk) = 0; /* r10 */
- *(--stk) = 0; /* r9 */
- *(--stk) = 0; /* r8 */
- *(--stk) = 0; /* r7 */
- *(--stk) = 0; /* r6 */
- *(--stk) = 0; /* r5 */
- *(--stk) = 0; /* r4 */
- *(--stk) = 0; /* r3 */
- *(--stk) = 0; /* r2 */
- *(--stk) = 0; /* r1 */
- *(--stk) = (rt_uint32_t)parameter; /* r0 : argument */
+ stack_addr += sizeof(rt_uint32_t);
+ stack_addr = (rt_uint8_t *)RT_ALIGN_DOWN((rt_uint32_t)stack_addr, 8);
+ stk = (rt_uint32_t *)stack_addr;
+ *(--stk) = (rt_uint32_t)tentry; /* entry point */
+ *(--stk) = (rt_uint32_t)texit; /* lr */
+ *(--stk) = 0xdeadbeef; /* r12 */
+ *(--stk) = 0xdeadbeef; /* r11 */
+ *(--stk) = 0xdeadbeef; /* r10 */
+ *(--stk) = 0xdeadbeef; /* r9 */
+ *(--stk) = 0xdeadbeef; /* r8 */
+ *(--stk) = 0xdeadbeef; /* r7 */
+ *(--stk) = 0xdeadbeef; /* r6 */
+ *(--stk) = 0xdeadbeef; /* r5 */
+ *(--stk) = 0xdeadbeef; /* r4 */
+ *(--stk) = 0xdeadbeef; /* r3 */
+ *(--stk) = 0xdeadbeef; /* r2 */
+ *(--stk) = 0xdeadbeef; /* r1 */
+ *(--stk) = (rt_uint32_t)parameter; /* r0 : argument */
- /* cpsr */
- if ((rt_uint32_t)tentry & 0x01)
- *(--stk) = SVCMODE | 0x20; /* thumb mode */
- else
- *(--stk) = SVCMODE; /* arm mode */
+ /* cpsr */
+ if ((rt_uint32_t)tentry & 0x01)
+ *(--stk) = SVCMODE | 0x20; /* thumb mode */
+ else
+ *(--stk) = SVCMODE; /* arm mode */
- /* return task's current stack address */
- return (rt_uint8_t *)stk;
+ /* return task's current stack address */
+ return (rt_uint8_t *)stk;
}
diff --git a/libcpu/arm/lpc24xx/stack.c b/libcpu/arm/lpc24xx/stack.c
index ad6419da4b..f160e9c167 100644
--- a/libcpu/arm/lpc24xx/stack.c
+++ b/libcpu/arm/lpc24xx/stack.c
@@ -23,42 +23,45 @@
* This function will initialize thread stack
*
* @param tentry the entry of thread
- * @param parameter the parameter of entry
+ * @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_t *rt_hw_stack_init(void *tentry, void *parameter,
- rt_uint8_t *stack_addr, void *texit)
+ rt_uint8_t *stack_addr, void *texit)
{
- unsigned long *stk;
+ rt_uint32_t *stk;
- stk = (unsigned long *)stack_addr;
- *(stk) = (unsigned long)tentry; /* entry point */
- *(--stk) = (unsigned long)texit; /* lr */
- *(--stk) = 0; /* r12 */
- *(--stk) = 0; /* r11 */
- *(--stk) = 0; /* r10 */
- *(--stk) = 0; /* r9 */
- *(--stk) = 0; /* r8 */
- *(--stk) = 0; /* r7 */
- *(--stk) = 0; /* r6 */
- *(--stk) = 0; /* r5 */
- *(--stk) = 0; /* r4 */
- *(--stk) = 0; /* r3 */
- *(--stk) = 0; /* r2 */
- *(--stk) = 0; /* r1 */
- *(--stk) = (unsigned long)parameter; /* r0 : argument */
+ stack_addr += sizeof(rt_uint32_t);
+ stack_addr = (rt_uint8_t *)RT_ALIGN_DOWN((rt_uint32_t)stack_addr, 8);
+ stk = (rt_uint32_t *)stack_addr;
- /* cpsr */
- if ((rt_uint32_t)tentry & 0x01)
- *(--stk) = SVCMODE | 0x20; /* thumb mode */
- else
- *(--stk) = SVCMODE; /* arm mode */
+ *(--stk) = (rt_uint32_t)tentry; /* entry point */
+ *(--stk) = (rt_uint32_t)texit; /* lr */
+ *(--stk) = 0xdeadbeef; /* r12 */
+ *(--stk) = 0xdeadbeef; /* r11 */
+ *(--stk) = 0xdeadbeef; /* r10 */
+ *(--stk) = 0xdeadbeef; /* r9 */
+ *(--stk) = 0xdeadbeef; /* r8 */
+ *(--stk) = 0xdeadbeef; /* r7 */
+ *(--stk) = 0xdeadbeef; /* r6 */
+ *(--stk) = 0xdeadbeef; /* r5 */
+ *(--stk) = 0xdeadbeef; /* r4 */
+ *(--stk) = 0xdeadbeef; /* r3 */
+ *(--stk) = 0xdeadbeef; /* r2 */
+ *(--stk) = 0xdeadbeef; /* r1 */
+ *(--stk) = (rt_uint32_t)parameter; /* r0 : argument */
- /* return task's current stack address */
- return (rt_uint8_t *)stk;
+ /* cpsr */
+ if ((rt_uint32_t)tentry & 0x01)
+ *(--stk) = SVCMODE | 0x20; /* thumb mode */
+ else
+ *(--stk) = SVCMODE; /* arm mode */
+
+ /* return task's current stack address */
+ return (rt_uint8_t *)stk;
}
/*@}*/
diff --git a/libcpu/arm/realview-a8-vmm/stack.c b/libcpu/arm/realview-a8-vmm/stack.c
index 4ae1536a20..94080ae746 100644
--- a/libcpu/arm/realview-a8-vmm/stack.c
+++ b/libcpu/arm/realview-a8-vmm/stack.c
@@ -24,42 +24,44 @@
* This function will initialize thread stack
*
* @param tentry the entry of thread
- * @param parameter the parameter of entry
+ * @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_t *rt_hw_stack_init(void *tentry, void *parameter,
- rt_uint8_t *stack_addr, void *texit)
+ rt_uint8_t *stack_addr, void *texit)
{
- rt_uint32_t *stk;
+ rt_uint32_t *stk;
- stk = (rt_uint32_t*)stack_addr;
- *(stk) = (rt_uint32_t)tentry; /* entry point */
- *(--stk) = (rt_uint32_t)texit; /* lr */
- *(--stk) = 0; /* r12 */
- *(--stk) = 0; /* r11 */
- *(--stk) = 0; /* r10 */
- *(--stk) = 0; /* r9 */
- *(--stk) = 0; /* r8 */
- *(--stk) = 0; /* r7 */
- *(--stk) = 0; /* r6 */
- *(--stk) = 0; /* r5 */
- *(--stk) = 0; /* r4 */
- *(--stk) = 0; /* r3 */
- *(--stk) = 0; /* r2 */
- *(--stk) = 0; /* r1 */
- *(--stk) = (rt_uint32_t)parameter; /* r0 : argument */
+ stack_addr += sizeof(rt_uint32_t);
+ stack_addr = (rt_uint8_t *)RT_ALIGN_DOWN((rt_uint32_t)stack_addr, 8);
+ stk = (rt_uint32_t *)stack_addr;
+ *(--stk) = (rt_uint32_t)tentry; /* entry point */
+ *(--stk) = (rt_uint32_t)texit; /* lr */
+ *(--stk) = 0xdeadbeef; /* r12 */
+ *(--stk) = 0xdeadbeef; /* r11 */
+ *(--stk) = 0xdeadbeef; /* r10 */
+ *(--stk) = 0xdeadbeef; /* r9 */
+ *(--stk) = 0xdeadbeef; /* r8 */
+ *(--stk) = 0xdeadbeef; /* r7 */
+ *(--stk) = 0xdeadbeef; /* r6 */
+ *(--stk) = 0xdeadbeef; /* r5 */
+ *(--stk) = 0xdeadbeef; /* r4 */
+ *(--stk) = 0xdeadbeef; /* r3 */
+ *(--stk) = 0xdeadbeef; /* r2 */
+ *(--stk) = 0xdeadbeef; /* r1 */
+ *(--stk) = (rt_uint32_t)parameter; /* r0 : argument */
- /* cpsr */
- if ((rt_uint32_t)tentry & 0x01)
- *(--stk) = SVCMODE | 0x20; /* thumb mode */
- else
- *(--stk) = SVCMODE; /* arm mode */
+ /* cpsr */
+ if ((rt_uint32_t)tentry & 0x01)
+ *(--stk) = SVCMODE | 0x20; /* thumb mode */
+ else
+ *(--stk) = SVCMODE; /* arm mode */
- /* return task's current stack address */
- return (rt_uint8_t *)stk;
+ /* return task's current stack address */
+ return (rt_uint8_t *)stk;
}
/*@}*/
diff --git a/libcpu/arm/s3c24x0/stack.c b/libcpu/arm/s3c24x0/stack.c
index a284989fe8..315091d907 100644
--- a/libcpu/arm/s3c24x0/stack.c
+++ b/libcpu/arm/s3c24x0/stack.c
@@ -23,38 +23,41 @@
* This function will initialize thread stack
*
* @param tentry the entry of thread
- * @param parameter the parameter of entry
+ * @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_t *rt_hw_stack_init(void *tentry, void *parameter,
- rt_uint8_t *stack_addr, void *texit)
+ rt_uint8_t *stack_addr, void *texit)
{
- rt_uint32_t *stk;
+ rt_uint32_t *stk;
- stk = (rt_uint32_t*)stack_addr;
- *(stk) = (rt_uint32_t)tentry; /* entry point */
- *(--stk) = (rt_uint32_t)texit; /* lr */
- *(--stk) = 0; /* r12 */
- *(--stk) = 0; /* r11 */
- *(--stk) = 0; /* r10 */
- *(--stk) = 0; /* r9 */
- *(--stk) = 0; /* r8 */
- *(--stk) = 0; /* r7 */
- *(--stk) = 0; /* r6 */
- *(--stk) = 0; /* r5 */
- *(--stk) = 0; /* r4 */
- *(--stk) = 0; /* r3 */
- *(--stk) = 0; /* r2 */
- *(--stk) = 0; /* r1 */
- *(--stk) = (rt_uint32_t)parameter; /* r0 : argument */
- *(--stk) = SVCMODE; /* cpsr */
- *(--stk) = SVCMODE; /* spsr */
+ stack_addr += sizeof(rt_uint32_t);
+ stack_addr = (rt_uint8_t *)RT_ALIGN_DOWN((rt_uint32_t)stack_addr, 8);
+ stk = (rt_uint32_t *)stack_addr;
- /* return task's current stack address */
- return (rt_uint8_t *)stk;
+ *(--stk) = (rt_uint32_t)tentry; /* entry point */
+ *(--stk) = (rt_uint32_t)texit; /* lr */
+ *(--stk) = 0xdeadbeef; /* r12 */
+ *(--stk) = 0xdeadbeef; /* r11 */
+ *(--stk) = 0xdeadbeef; /* r10 */
+ *(--stk) = 0xdeadbeef; /* r9 */
+ *(--stk) = 0xdeadbeef; /* r8 */
+ *(--stk) = 0xdeadbeef; /* r7 */
+ *(--stk) = 0xdeadbeef; /* r6 */
+ *(--stk) = 0xdeadbeef; /* r5 */
+ *(--stk) = 0xdeadbeef; /* r4 */
+ *(--stk) = 0xdeadbeef; /* r3 */
+ *(--stk) = 0xdeadbeef; /* r2 */
+ *(--stk) = 0xdeadbeef; /* r1 */
+ *(--stk) = (rt_uint32_t)parameter; /* r0 : argument */
+ *(--stk) = SVCMODE; /* cpsr */
+ *(--stk) = SVCMODE; /* spsr */
+
+ /* return task's current stack address */
+ return (rt_uint8_t *)stk;
}
/*@}*/
diff --git a/libcpu/arm/s3c44b0/stack.c b/libcpu/arm/s3c44b0/stack.c
index 3f1d88a390..6f838cb173 100644
--- a/libcpu/arm/s3c44b0/stack.c
+++ b/libcpu/arm/s3c44b0/stack.c
@@ -30,31 +30,33 @@
* @return stack address
*/
rt_uint8_t *rt_hw_stack_init(void *tentry, void *parameter,
- rt_uint8_t *stack_addr, void *texit)
+ rt_uint8_t *stack_addr, void *texit)
{
- unsigned long *stk;
+ rt_uint32_t *stk;
- stk = (unsigned long *)stack_addr;
- *(stk) = (unsigned long)tentry; /* entry point */
- *(--stk) = (unsigned long)texit; /* lr */
- *(--stk) = 0; /* r12 */
- *(--stk) = 0; /* r11 */
- *(--stk) = 0; /* r10 */
- *(--stk) = 0; /* r9 */
- *(--stk) = 0; /* r8 */
- *(--stk) = 0; /* r7 */
- *(--stk) = 0; /* r6 */
- *(--stk) = 0; /* r5 */
- *(--stk) = 0; /* r4 */
- *(--stk) = 0; /* r3 */
- *(--stk) = 0; /* r2 */
- *(--stk) = 0; /* r1 */
- *(--stk) = (unsigned long)parameter; /* r0 : argument */
- *(--stk) = SVCMODE; /* cpsr */
- *(--stk) = SVCMODE; /* spsr */
+ stack_addr += sizeof(rt_uint32_t);
+ stack_addr = (rt_uint8_t *)RT_ALIGN_DOWN((rt_uint32_t)stack_addr, 8);
+ stk = (rt_uint32_t *)stack_addr;
+ *(--stk) = (rt_uint32_t)tentry; /* entry point */
+ *(--stk) = (rt_uint32_t)texit; /* lr */
+ *(--stk) = 0xdeadbeef; /* r12 */
+ *(--stk) = 0xdeadbeef; /* r11 */
+ *(--stk) = 0xdeadbeef; /* r10 */
+ *(--stk) = 0xdeadbeef; /* r9 */
+ *(--stk) = 0xdeadbeef; /* r8 */
+ *(--stk) = 0xdeadbeef; /* r7 */
+ *(--stk) = 0xdeadbeef; /* r6 */
+ *(--stk) = 0xdeadbeef; /* r5 */
+ *(--stk) = 0xdeadbeef; /* r4 */
+ *(--stk) = 0xdeadbeef; /* r3 */
+ *(--stk) = 0xdeadbeef; /* r2 */
+ *(--stk) = 0xdeadbeef; /* r1 */
+ *(--stk) = (rt_uint32_t)parameter; /* r0 : argument */
+ *(--stk) = SVCMODE; /* cpsr */
+ *(--stk) = SVCMODE; /* spsr */
- /* return task's current stack address */
- return (rt_uint8_t *)stk;
+ /* return task's current stack address */
+ return (rt_uint8_t *)stk;
}
/*@}*/
diff --git a/libcpu/arm/sep4020/stack.c b/libcpu/arm/sep4020/stack.c
index 7700373ff1..318b435f8e 100644
--- a/libcpu/arm/sep4020/stack.c
+++ b/libcpu/arm/sep4020/stack.c
@@ -22,38 +22,40 @@
* This function will initialize thread stack
*
* @param tentry the entry of thread
- * @param parameter the parameter of entry
+ * @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_t *rt_hw_stack_init(void *tentry, void *parameter,
- rt_uint8_t *stack_addr, void *texit)
+ rt_uint8_t *stack_addr, void *texit)
{
- rt_uint32_t *stk;
+ rt_uint32_t *stk;
- stk = (rt_uint32_t*)stack_addr;
- *(stk) = (rt_uint32_t)tentry; /* entry point */
- *(--stk) = (rt_uint32_t)texit; /* lr */
- *(--stk) = 0; /* r12 */
- *(--stk) = 0; /* r11 */
- *(--stk) = 0; /* r10 */
- *(--stk) = 0; /* r9 */
- *(--stk) = 0; /* r8 */
- *(--stk) = 0; /* r7 */
- *(--stk) = 0; /* r6 */
- *(--stk) = 0; /* r5 */
- *(--stk) = 0; /* r4 */
- *(--stk) = 0; /* r3 */
- *(--stk) = 0; /* r2 */
- *(--stk) = 0; /* r1 */
- *(--stk) = (rt_uint32_t)parameter; /* r0 : argument */
- *(--stk) = Mode_SVC; /* cpsr */
- *(--stk) = Mode_SVC; /* spsr */
+ stack_addr += sizeof(rt_uint32_t);
+ stack_addr = (rt_uint8_t *)RT_ALIGN_DOWN((rt_uint32_t)stack_addr, 8);
+ stk = (rt_uint32_t *)stack_addr;
+ *(--stk) = (rt_uint32_t)tentry; /* entry point */
+ *(--stk) = (rt_uint32_t)texit; /* lr */
+ *(--stk) = 0xdeadbeef; /* r12 */
+ *(--stk) = 0xdeadbeef; /* r11 */
+ *(--stk) = 0xdeadbeef; /* r10 */
+ *(--stk) = 0xdeadbeef; /* r9 */
+ *(--stk) = 0xdeadbeef; /* r8 */
+ *(--stk) = 0xdeadbeef; /* r7 */
+ *(--stk) = 0xdeadbeef; /* r6 */
+ *(--stk) = 0xdeadbeef; /* r5 */
+ *(--stk) = 0xdeadbeef; /* r4 */
+ *(--stk) = 0xdeadbeef; /* r3 */
+ *(--stk) = 0xdeadbeef; /* r2 */
+ *(--stk) = 0xdeadbeef; /* r1 */
+ *(--stk) = (rt_uint32_t)parameter; /* r0 : argument */
+ *(--stk) = Mode_SVC; /* cpsr */
+ *(--stk) = Mode_SVC; /* spsr */
- /* return task's current stack address */
- return (rt_uint8_t *)stk;
+ /* return task's current stack address */
+ return (rt_uint8_t *)stk;
}
/*@}*/
diff --git a/libcpu/arm/zynq7000/stack.c b/libcpu/arm/zynq7000/stack.c
index 8e1b86432e..08dd4b4dac 100644
--- a/libcpu/arm/zynq7000/stack.c
+++ b/libcpu/arm/zynq7000/stack.c
@@ -31,21 +31,23 @@ rt_uint8_t *rt_hw_stack_init(void *tentry, void *parameter,
{
rt_uint32_t *stk;
+ stack_addr += sizeof(rt_uint32_t);
+ stack_addr = (rt_uint8_t *)RT_ALIGN_DOWN((rt_uint32_t)stack_addr, 8);
stk = (rt_uint32_t *)stack_addr;
- *(stk) = (rt_uint32_t)tentry; /* entry point */
+ *(--stk) = (rt_uint32_t)tentry; /* entry point */
*(--stk) = (rt_uint32_t)texit; /* lr */
- *(--stk) = 0; /* r12 */
- *(--stk) = 0; /* r11 */
- *(--stk) = 0; /* r10 */
- *(--stk) = 0; /* r9 */
- *(--stk) = 0; /* r8 */
- *(--stk) = 0; /* r7 */
- *(--stk) = 0; /* r6 */
- *(--stk) = 0; /* r5 */
- *(--stk) = 0; /* r4 */
- *(--stk) = 0; /* r3 */
- *(--stk) = 0; /* r2 */
- *(--stk) = 0; /* r1 */
+ *(--stk) = 0xdeadbeef; /* r12 */
+ *(--stk) = 0xdeadbeef; /* r11 */
+ *(--stk) = 0xdeadbeef; /* r10 */
+ *(--stk) = 0xdeadbeef; /* r9 */
+ *(--stk) = 0xdeadbeef; /* r8 */
+ *(--stk) = 0xdeadbeef; /* r7 */
+ *(--stk) = 0xdeadbeef; /* r6 */
+ *(--stk) = 0xdeadbeef; /* r5 */
+ *(--stk) = 0xdeadbeef; /* r4 */
+ *(--stk) = 0xdeadbeef; /* r3 */
+ *(--stk) = 0xdeadbeef; /* r2 */
+ *(--stk) = 0xdeadbeef; /* r1 */
*(--stk) = (rt_uint32_t)parameter; /* r0 : argument */
/* cpsr */
diff --git a/tools/menuconfig.py b/tools/menuconfig.py
index 4ffcd9372f..4a339ec14b 100644
--- a/tools/menuconfig.py
+++ b/tools/menuconfig.py
@@ -80,7 +80,17 @@ def touch_env():
os.mkdir(env_dir)
os.mkdir(os.path.join(env_dir, 'local_pkgs'))
os.mkdir(os.path.join(env_dir, 'packages'))
+
+ os.system('git clone https://github.com/RT-Thread/packages.git ~/.env/packages/packages')
+
kconfig = file(os.path.join(env_dir, 'packages', 'Kconfig'), 'w')
+ kconfig.write('source "$PKGS_DIR/packages/Kconfig"')
+
+ os.mkdir(os.path.join(env_dir, 'tools'))
+ os.system('git clone https://github.com/RT-Thread/env.git ~/.env/tools/scripts')
+
+ env_sh = file(os.path.join(env_dir, 'env.sh'), 'w')
+ env_sh.write('export $PATH=~/.env/tools/scripts:$PATH')
# menuconfig for Linux
def menuconfig(RTT_ROOT):