cpuport.c 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. /*
  2. * Copyright (c) 2018, Synopsys, Inc.
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include <rtthread.h>
  7. #include "arc/arc_exception.h"
  8. #if ARC_FEATURE_STACK_CHECK
  9. #define ARC_INIT_STATUS ((1 << AUX_STATUS_BIT_SC) | AUX_STATUS_MASK_IE | ((-1 - INT_PRI_MIN) << 1) | STATUS32_RESET_VALUE)
  10. #else
  11. #define ARC_INIT_STATUS (AUX_STATUS_MASK_IE | ((-1 - INT_PRI_MIN) << 1) | STATUS32_RESET_VALUE)
  12. #endif
  13. extern void start_r(void);
  14. rt_uint32_t rt_thread_switch_interrupt_flag;
  15. rt_uint32_t rt_interrupt_from_thread;
  16. rt_uint32_t rt_interrupt_to_thread;
  17. rt_uint32_t exc_nest_count;
  18. struct init_stack_frame {
  19. rt_uint32_t pc;
  20. rt_uint32_t blink;
  21. rt_uint32_t task;
  22. rt_uint32_t status32;
  23. rt_uint32_t r0;
  24. };
  25. rt_uint8_t *rt_hw_stack_init(void *tentry,
  26. void *parameter,
  27. rt_uint8_t *stack_addr,
  28. void *texit)
  29. {
  30. struct init_stack_frame *stack_frame;
  31. rt_uint8_t *stk;
  32. stk = stack_addr + sizeof(rt_uint32_t);
  33. stk = (rt_uint8_t *)RT_ALIGN_DOWN((rt_uint32_t)stk, 8);
  34. stk -= sizeof(struct init_stack_frame);
  35. stack_frame = (struct init_stack_frame *)stk;
  36. stack_frame->pc = (rt_uint32_t)start_r;
  37. stack_frame->blink = (rt_uint32_t)texit;
  38. stack_frame->task = (rt_uint32_t)tentry;
  39. stack_frame->status32 = ARC_INIT_STATUS;
  40. stack_frame->r0 = (rt_uint32_t)parameter;
  41. return stk;
  42. }
  43. /**
  44. * This function set the hook, which is invoked on fault exception handling.
  45. *
  46. * @param exception_handle the exception handling hook function.
  47. */
  48. void rt_hw_exception_install(rt_err_t (*exception_handle)(void *context))
  49. {
  50. exception_handle = exception_handle;
  51. }
  52. void set_hw_stack_check(rt_uint32_t *from, rt_uint32_t *to)
  53. {
  54. struct rt_thread *rt_thread_to;
  55. if (to != NULL) {
  56. rt_thread_to = rt_container_of(to, struct rt_thread, sp);
  57. #if ARC_FEATURE_SEC_PRESENT
  58. arc_aux_write(AUX_S_KSTACK_TOP, (uint32_t)(rt_thread_to->stack_addr));
  59. arc_aux_write(AUX_S_KSTACK_BASE, (uint32_t)(rt_thread_to->stack_addr)+rt_thread_to->stack_size);
  60. #else
  61. arc_aux_write(AUX_KSTACK_TOP, (uint32_t)(rt_thread_to->stack_addr));
  62. arc_aux_write(AUX_KSTACK_BASE, (uint32_t)(rt_thread_to->stack_addr)+rt_thread_to->stack_size);
  63. #endif
  64. }
  65. }