From b3d47e246fe62d0ad06ed7d7b719cdfd4f73681b Mon Sep 17 00:00:00 2001 From: "chao.an" Date: Wed, 13 Apr 2022 18:09:27 +0800 Subject: [PATCH] arch/stack_color: correct the stack top of running task This PR to ensure the stack pointer is locate to the stack top Signed-off-by: chao.an --- arch/arm/src/common/arm_checkstack.c | 30 +++++++++++++-------- arch/ceva/src/common/up_createstack.c | 23 ++++++++++++---- arch/or1k/src/common/up_createstack.c | 23 ++++++++++++---- arch/risc-v/src/common/riscv_createstack.c | 30 +++++++++++++-------- arch/sim/src/sim/up_createstack.c | 23 ++++++++++++---- arch/sparc/src/common/up_checkstack.c | 30 +++++++++++++-------- arch/xtensa/src/common/xtensa_createstack.c | 30 +++++++++++++-------- 7 files changed, 130 insertions(+), 59 deletions(-) diff --git a/arch/arm/src/common/arm_checkstack.c b/arch/arm/src/common/arm_checkstack.c index 54fc37917c..31d583be7c 100644 --- a/arch/arm/src/common/arm_checkstack.c +++ b/arch/arm/src/common/arm_checkstack.c @@ -148,28 +148,36 @@ static size_t do_stackcheck(FAR void *stackbase, size_t nbytes) void arm_stack_color(FAR void *stackbase, size_t nbytes) { - uintptr_t start; - uintptr_t end; - size_t nwords; - FAR uint32_t *ptr; + uint32_t *stkptr; + uintptr_t stkend; + size_t nwords; uintptr_t sp; /* Take extra care that we do not write outside the stack boundaries */ - start = STACK_ALIGN_UP((uintptr_t)stackbase); - end = nbytes ? STACK_ALIGN_DOWN((uintptr_t)stackbase + nbytes) : - (uintptr_t)&sp; /* 0: colorize the running stack */ + stkptr = (uint32_t *)STACK_ALIGN_UP((uintptr_t)stackbase); - /* Get the adjusted size based on the top and bottom of the stack */ + if (nbytes == 0) /* 0: colorize the running stack */ + { + stkend = up_getsp(); + if (stkend > (uintptr_t)&sp) + { + stkend = (uintptr_t)&sp; + } + } + else + { + stkend = (uintptr_t)stackbase + nbytes; + } - nwords = (end - start) >> 2; - ptr = (FAR uint32_t *)start; + stkend = STACK_ALIGN_DOWN(stkend); + nwords = (stkend - (uintptr_t)stackbase) >> 2; /* Set the entire stack to the coloration value */ while (nwords-- > 0) { - *ptr++ = STACK_COLOR; + *stkptr++ = STACK_COLOR; } } diff --git a/arch/ceva/src/common/up_createstack.c b/arch/ceva/src/common/up_createstack.c index d0ba7d28ac..1f4eacd886 100644 --- a/arch/ceva/src/common/up_createstack.c +++ b/arch/ceva/src/common/up_createstack.c @@ -230,16 +230,29 @@ int up_create_stack(FAR struct tcb_s *tcb, size_t stack_size, uint8_t ttype) #ifdef CONFIG_STACK_COLORATION void up_stack_color(FAR void *stackbase, size_t nbytes) { - /* Take extra care that we do not write outsize the stack boundaries */ - uint32_t *stkptr; uintptr_t stkend; size_t nwords; uintptr_t sp; - stkptr = (uint32_t *)(((uintptr_t)stackbase + 3) & ~3); - stkend = nbytes ? (((uintptr_t)stackbase + nbytes) & ~3) : - (uintptr_t)&sp; /* 0: colorize the running stack */ + /* Take extra care that we do not write outside the stack boundaries */ + + stkptr = (uint32_t *)STACK_ALIGN_UP((uintptr_t)stackbase); + + if (nbytes == 0) /* 0: colorize the running stack */ + { + stkend = up_getsp(); + if (stkend > (uintptr_t)&sp) + { + stkend = (uintptr_t)&sp; + } + } + else + { + stkend = (uintptr_t)stackbase + nbytes; + } + + stkend = STACK_ALIGN_DOWN(stkend); nwords = (stkend - (uintptr_t)stackbase) >> 2; /* Set the entire stack to the coloration value */ diff --git a/arch/or1k/src/common/up_createstack.c b/arch/or1k/src/common/up_createstack.c index 731c5b64b0..983e9d4d12 100644 --- a/arch/or1k/src/common/up_createstack.c +++ b/arch/or1k/src/common/up_createstack.c @@ -203,16 +203,29 @@ int up_create_stack(FAR struct tcb_s *tcb, size_t stack_size, uint8_t ttype) #ifdef CONFIG_STACK_COLORATION void up_stack_color(FAR void *stackbase, size_t nbytes) { - /* Take extra care that we do not write outsize the stack boundaries */ - uint32_t *stkptr; uintptr_t stkend; size_t nwords; uintptr_t sp; - stkptr = (uint32_t *)(((uintptr_t)stackbase + 3) & ~3); - stkend = nbytes ? (((uintptr_t)stackbase + nbytes) & ~3) : - (uintptr_t)&sp; /* 0: colorize the running stack */ + /* Take extra care that we do not write outside the stack boundaries */ + + stkptr = (uint32_t *)STACK_ALIGN_UP((uintptr_t)stackbase); + + if (nbytes == 0) /* 0: colorize the running stack */ + { + stkend = up_getsp(); + if (stkend > (uintptr_t)&sp) + { + stkend = (uintptr_t)&sp; + } + } + else + { + stkend = (uintptr_t)stackbase + nbytes; + } + + stkend = STACK_ALIGN_DOWN(stkend); nwords = (stkend - (uintptr_t)stackbase) >> 2; /* Set the entire stack to the coloration value */ diff --git a/arch/risc-v/src/common/riscv_createstack.c b/arch/risc-v/src/common/riscv_createstack.c index d8a27bcb42..c15e1b0e81 100644 --- a/arch/risc-v/src/common/riscv_createstack.c +++ b/arch/risc-v/src/common/riscv_createstack.c @@ -213,28 +213,36 @@ int up_create_stack(struct tcb_s *tcb, size_t stack_size, uint8_t ttype) #ifdef CONFIG_STACK_COLORATION void riscv_stack_color(void *stackbase, size_t nbytes) { - uintptr_t start; - uintptr_t end; - size_t nwords; - uint32_t *ptr; + uint32_t *stkptr; + uintptr_t stkend; + size_t nwords; uintptr_t sp; /* Take extra care that we do not write outside the stack boundaries */ - start = STACK_ALIGN_UP((uintptr_t)stackbase); - end = nbytes ? STACK_ALIGN_DOWN((uintptr_t)stackbase + nbytes) : - (uintptr_t)&sp; /* 0: colorize the running stack */ + stkptr = (uint32_t *)STACK_ALIGN_UP((uintptr_t)stackbase); - /* Get the adjusted size based on the top and bottom of the stack */ + if (nbytes == 0) /* 0: colorize the running stack */ + { + stkend = up_getsp(); + if (stkend > (uintptr_t)&sp) + { + stkend = (uintptr_t)&sp; + } + } + else + { + stkend = (uintptr_t)stackbase + nbytes; + } - nwords = (end - start) >> 2; - ptr = (uint32_t *)start; + stkend = STACK_ALIGN_DOWN(stkend); + nwords = (stkend - (uintptr_t)stackbase) >> 2; /* Set the entire stack to the coloration value */ while (nwords-- > 0) { - *ptr++ = STACK_COLOR; + *stkptr++ = STACK_COLOR; } } #endif diff --git a/arch/sim/src/sim/up_createstack.c b/arch/sim/src/sim/up_createstack.c index 71381f3b29..a079abab68 100644 --- a/arch/sim/src/sim/up_createstack.c +++ b/arch/sim/src/sim/up_createstack.c @@ -159,16 +159,29 @@ int up_create_stack(FAR struct tcb_s *tcb, size_t stack_size, uint8_t ttype) void nostackprotect_function up_stack_color(FAR void *stackbase, size_t nbytes) { - /* Take extra care that we do not write outsize the stack boundaries */ - uint32_t *stkptr; uintptr_t stkend; size_t nwords; uintptr_t sp; - stkptr = (uint32_t *)(((uintptr_t)stackbase + 3) & ~3); - stkend = nbytes ? (((uintptr_t)stackbase + nbytes) & ~3) : - (uintptr_t)&sp; /* 0: colorize the running stack */ + /* Take extra care that we do not write outside the stack boundaries */ + + stkptr = (uint32_t *)STACK_ALIGN_UP((uintptr_t)stackbase); + + if (nbytes == 0) /* 0: colorize the running stack */ + { + stkend = up_getsp(); + if (stkend > (uintptr_t)&sp) + { + stkend = (uintptr_t)&sp; + } + } + else + { + stkend = (uintptr_t)stackbase + nbytes; + } + + stkend = STACK_ALIGN_DOWN(stkend); nwords = (stkend - (uintptr_t)stackbase) >> 2; /* Set the entire stack to the coloration value */ diff --git a/arch/sparc/src/common/up_checkstack.c b/arch/sparc/src/common/up_checkstack.c index ca80866696..50825498de 100644 --- a/arch/sparc/src/common/up_checkstack.c +++ b/arch/sparc/src/common/up_checkstack.c @@ -149,28 +149,36 @@ static size_t do_stackcheck(FAR void *stackbase, size_t nbytes) void up_stack_color(FAR void *stackbase, size_t nbytes) { - uintptr_t start; - uintptr_t end; - size_t nwords; - FAR uint32_t *ptr; + uint32_t *stkptr; + uintptr_t stkend; + size_t nwords; uintptr_t sp; /* Take extra care that we do not write outside the stack boundaries */ - start = STACK_ALIGN_UP((uintptr_t)stackbase); - end = nbytes ? STACK_ALIGN_DOWN((uintptr_t)stackbase + nbytes) : - (uintptr_t)&sp; /* 0: colorize the running stack */ + stkptr = (uint32_t *)STACK_ALIGN_UP((uintptr_t)stackbase); - /* Get the adjusted size based on the top and bottom of the stack */ + if (nbytes == 0) /* 0: colorize the running stack */ + { + stkend = up_getsp(); + if (stkend > (uintptr_t)&sp) + { + stkend = (uintptr_t)&sp; + } + } + else + { + stkend = (uintptr_t)stackbase + nbytes; + } - nwords = (end - start) >> 2; - ptr = (FAR uint32_t *)start; + stkend = STACK_ALIGN_DOWN(stkend); + nwords = (stkend - (uintptr_t)stackbase) >> 2; /* Set the entire stack to the coloration value */ while (nwords-- > 0) { - *ptr++ = STACK_COLOR; + *stkptr++ = STACK_COLOR; } } diff --git a/arch/xtensa/src/common/xtensa_createstack.c b/arch/xtensa/src/common/xtensa_createstack.c index aeea6c2c8a..d8a972ee08 100644 --- a/arch/xtensa/src/common/xtensa_createstack.c +++ b/arch/xtensa/src/common/xtensa_createstack.c @@ -219,28 +219,36 @@ int up_create_stack(struct tcb_s *tcb, size_t stack_size, uint8_t ttype) #ifdef CONFIG_STACK_COLORATION void xtensa_stack_color(void *stackbase, size_t nbytes) { - uintptr_t start; - uintptr_t end; - size_t nwords; - uint32_t *ptr; + uint32_t *stkptr; + uintptr_t stkend; + size_t nwords; uintptr_t sp; /* Take extra care that we do not write outside the stack boundaries */ - start = STACK_ALIGN_UP((uintptr_t)stackbase); - end = nbytes ? STACK_ALIGN_DOWN((uintptr_t)stackbase + nbytes) : - (uintptr_t)&sp; /* 0: colorize the running stack */ + stkptr = (uint32_t *)STACK_ALIGN_UP((uintptr_t)stackbase); - /* Get the adjusted size based on the top and bottom of the stack */ + if (nbytes == 0) /* 0: colorize the running stack */ + { + stkend = up_getsp(); + if (stkend > (uintptr_t)&sp) + { + stkend = (uintptr_t)&sp; + } + } + else + { + stkend = (uintptr_t)stackbase + nbytes; + } - nwords = (end - start) >> 2; - ptr = (uint32_t *)start; + stkend = STACK_ALIGN_DOWN(stkend); + nwords = (stkend - (uintptr_t)stackbase) >> 2; /* Set the entire stack to the coloration value */ while (nwords-- > 0) { - *ptr++ = STACK_COLOR; + *stkptr++ = STACK_COLOR; } } #endif