修复栈泄露的bug
This commit is contained in:
@@ -1,38 +1,38 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file Project/STM32F2xx_StdPeriph_Template/stm32f2xx_it.c
|
||||
* @author MCD Application Team
|
||||
* @version V1.1.0
|
||||
* @date 13-April-2012
|
||||
* @brief Main Interrupt Service Routines.
|
||||
* This file provides template for all exceptions handler and
|
||||
* peripherals interrupt service routine.
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2012 STMicroelectronics</center></h2>
|
||||
*
|
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
|
||||
* You may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at:
|
||||
*
|
||||
* http://www.st.com/software_license_agreement_liberty_v2
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
******************************************************************************
|
||||
* @file Project/STM32F2xx_StdPeriph_Template/stm32f2xx_it.c
|
||||
* @author MCD Application Team
|
||||
* @version V1.1.0
|
||||
* @date 13-April-2012
|
||||
* @brief Main Interrupt Service Routines.
|
||||
* This file provides template for all exceptions handler and
|
||||
* peripherals interrupt service routine.
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2012 STMicroelectronics</center></h2>
|
||||
*
|
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
|
||||
* You may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at:
|
||||
*
|
||||
* http://www.st.com/software_license_agreement_liberty_v2
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "stm32f2xx_it.h"
|
||||
|
||||
/** @addtogroup Template_Project
|
||||
* @{
|
||||
*/
|
||||
* @{
|
||||
*/
|
||||
|
||||
/* Private typedef -----------------------------------------------------------*/
|
||||
/* Private define ------------------------------------------------------------*/
|
||||
@@ -46,19 +46,19 @@
|
||||
/******************************************************************************/
|
||||
|
||||
/**
|
||||
* @brief This function handles NMI exception.
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
* @brief This function handles NMI exception.
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void NMI_Handler(void)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles Hard Fault exception.
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
* @brief This function handles Hard Fault exception.
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void HardFault_Handler(void)
|
||||
{
|
||||
/* Go to infinite loop when Hard Fault exception occurs */
|
||||
@@ -68,10 +68,10 @@ void HardFault_Handler(void)
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles Memory Manage exception.
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
* @brief This function handles Memory Manage exception.
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void MemManage_Handler(void)
|
||||
{
|
||||
/* Go to infinite loop when Memory Manage exception occurs */
|
||||
@@ -81,10 +81,10 @@ void MemManage_Handler(void)
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles Bus Fault exception.
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
* @brief This function handles Bus Fault exception.
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void BusFault_Handler(void)
|
||||
{
|
||||
/* Go to infinite loop when Bus Fault exception occurs */
|
||||
@@ -94,10 +94,10 @@ void BusFault_Handler(void)
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles Usage Fault exception.
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
* @brief This function handles Usage Fault exception.
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void UsageFault_Handler(void)
|
||||
{
|
||||
/* Go to infinite loop when Usage Fault exception occurs */
|
||||
@@ -107,37 +107,37 @@ void UsageFault_Handler(void)
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles SVCall exception.
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
* @brief This function handles SVCall exception.
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void SVC_Handler(void)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles Debug Monitor exception.
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
* @brief This function handles Debug Monitor exception.
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void DebugMon_Handler(void)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles PendSVC exception.
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
* @brief This function handles PendSVC exception.
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void PendSV_Handler(void)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles SysTick Handler.
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
* @brief This function handles SysTick Handler.
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void SysTick_Handler(void)
|
||||
{
|
||||
// TimingDelay_Decrement();
|
||||
@@ -151,17 +151,16 @@ void SysTick_Handler(void)
|
||||
/******************************************************************************/
|
||||
|
||||
/**
|
||||
* @brief This function handles PPP interrupt request.
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
* @brief This function handles PPP interrupt request.
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
/*void PPP_IRQHandler(void)
|
||||
{
|
||||
}*/
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
* @}
|
||||
*/
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
||||
|
||||
@@ -44,5 +44,6 @@ void arch_init(void)
|
||||
mpu_init();
|
||||
SCB->SHCSR |= SCB_SHCSR_USGFAULTENA_Msk;
|
||||
SCB->SHCSR |= SCB_SHCSR_BUSFAULTENA_Msk;
|
||||
((uint8_t *)(0xE000E008))[0] |= 0x6;
|
||||
}
|
||||
INIT_LOW_HARD(arch_init);
|
||||
|
||||
@@ -30,13 +30,13 @@ PendSV_Handler:
|
||||
|
||||
//将更改的值放回要传的参数中去
|
||||
TST LR,#4
|
||||
ITE EQ
|
||||
ITTEE EQ
|
||||
MSREQ MSP, r3
|
||||
MOVEQ r1,r3
|
||||
MSRNE PSP, r3
|
||||
MOVNE r0,r3
|
||||
thread_sche:
|
||||
MOV r0, r3
|
||||
MOV r1, r2
|
||||
// r0:sp r1:(0为msp 1 psp)
|
||||
// r0:psp r1:msp r2:(0为msp 1 psp)
|
||||
LDR.w r3,=schde_to
|
||||
BLX r3
|
||||
//取得下一个任务的参数 r1 psp r2 msp
|
||||
@@ -76,8 +76,10 @@ super_mode: //更新下msp的值
|
||||
MOV R0,#0
|
||||
MSR CONTROL, R0
|
||||
to_ret:
|
||||
CPSIE I
|
||||
push {r0-r3, lr}
|
||||
bl mpu_switch_to
|
||||
pop {r0-r3, lr}
|
||||
CPSIE I
|
||||
DSB
|
||||
ISB
|
||||
BX LR
|
||||
|
||||
@@ -115,6 +115,14 @@ void MemManage_Handler(void)
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
printk("semgement fault.\n");
|
||||
/*TODO:杀死进程*/
|
||||
while (1)
|
||||
{
|
||||
}
|
||||
}
|
||||
/* Go to infinite loop when Memory Manage exception occurs */
|
||||
}
|
||||
|
||||
@@ -141,7 +149,30 @@ void BusFault_Handler(void)
|
||||
void UsageFault_Handler(void)
|
||||
{
|
||||
printk("%s\n", __FUNCTION__);
|
||||
|
||||
if (SCB->CFSR & (1 << 16))
|
||||
{
|
||||
printk("未定义指令错误\n");
|
||||
}
|
||||
if (SCB->CFSR & (1 << 17))
|
||||
{
|
||||
printk("试图切换到错误的状态\n");
|
||||
}
|
||||
if (SCB->CFSR & (1 << 18))
|
||||
{
|
||||
printk("试图执行EXC_RETURN错误的异常\n");
|
||||
}
|
||||
if (SCB->CFSR & (1 << 19))
|
||||
{
|
||||
printk("试图执行协处理器指令\n");
|
||||
}
|
||||
if (SCB->CFSR & (1 << 24))
|
||||
{
|
||||
printk("产生了非对其访问错误\n");
|
||||
}
|
||||
if (SCB->CFSR & (1 << 25))
|
||||
{
|
||||
printk("除零错误\n");
|
||||
}
|
||||
/* Go to infinite loop when Usage Fault exception occurs */
|
||||
while (1)
|
||||
{
|
||||
|
||||
@@ -23,7 +23,6 @@ syscall_exit:
|
||||
.type syscall_ret_user, %function
|
||||
syscall_ret_user:
|
||||
//存放返回值
|
||||
@ mov r3,r0
|
||||
|
||||
//还原msp的值
|
||||
mrs r0, msp
|
||||
@@ -31,8 +30,6 @@ syscall_ret_user:
|
||||
ldmfd r0!,{r4-r11}
|
||||
msr msp,r0
|
||||
pop {r0,r1,r2,lr}
|
||||
//设置用户态返回的数据
|
||||
@ str r3, [r0, #0]
|
||||
|
||||
msr CONTROL, r1
|
||||
bx lr
|
||||
@@ -32,5 +32,5 @@ enum region_rights
|
||||
region_info_t *mm_space_alloc_pt_region(mm_space_t *m_space);
|
||||
void mm_space_free_pt_region(mm_space_t *m_space, region_info_t *ri);
|
||||
|
||||
void mm_space_init(mm_space_t *mm_space);
|
||||
void mm_space_init(mm_space_t *mm_space, int is_knl);
|
||||
bool_t mm_space_add(mm_space_t *m_space, umword_t addr, umword_t size, uint8_t attrs);
|
||||
@@ -17,5 +17,5 @@ typedef struct task
|
||||
} task_t;
|
||||
|
||||
task_t *thread_get_current_task(void);
|
||||
void task_init(task_t *task, ram_limit_t *ram);
|
||||
task_t *task_create(ram_limit_t *lim);
|
||||
void task_init(task_t *task, ram_limit_t *ram, int is_knl);
|
||||
task_t *task_create(ram_limit_t *lim, int is_knl);
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
#include "util.h"
|
||||
#include "arch.h"
|
||||
|
||||
#define THREAD_BLOCK_SIZE 0x200 //!< 线程块大小,栈在块的顶部
|
||||
#define THREAD_BLOCK_SIZE 0x400 //!< 线程块大小,栈在块的顶部
|
||||
|
||||
enum thread_state
|
||||
{
|
||||
@@ -75,7 +75,7 @@ static inline pf_t *thread_get_current_pf(void)
|
||||
return thread_get_pf(thread_get_current());
|
||||
}
|
||||
void thread_init(thread_t *th);
|
||||
void thread_set_exc_regs(thread_t *th, umword_t pc);
|
||||
void thread_set_exc_regs(thread_t *th, umword_t pc, umword_t sp);
|
||||
thread_t *thread_create(ram_limit_t *ram);
|
||||
void thread_bind(thread_t *th, kobject_t *tk);
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#include "mpu.h"
|
||||
#include "assert.h"
|
||||
|
||||
void mm_space_init(mm_space_t *mm_space)
|
||||
void mm_space_init(mm_space_t *mm_space, int is_knl)
|
||||
{
|
||||
region_info_t *regi_info;
|
||||
|
||||
@@ -13,10 +13,12 @@ void mm_space_init(mm_space_t *mm_space)
|
||||
{
|
||||
mm_space->pt_regions[i].region_inx = -1;
|
||||
}
|
||||
|
||||
regi_info = mm_space_alloc_pt_region(mm_space);
|
||||
assert(regi_info);
|
||||
mm_pages_init(&mm_space->mm_pages, regi_info);
|
||||
if (!is_knl)
|
||||
{
|
||||
regi_info = mm_space_alloc_pt_region(mm_space);
|
||||
assert(regi_info);
|
||||
mm_pages_init(&mm_space->mm_pages, regi_info);
|
||||
}
|
||||
}
|
||||
region_info_t *mm_space_alloc_pt_region(mm_space_t *m_space)
|
||||
{
|
||||
|
||||
@@ -81,7 +81,7 @@ sched_t *scheduler_next(void)
|
||||
return next_sch;
|
||||
}
|
||||
|
||||
sp_info_t *schde_to(void *sp, umword_t sp_type)
|
||||
sp_info_t *schde_to(void *usp, void *ksp, umword_t sp_type)
|
||||
{
|
||||
scheduler_t *sche = scheduler_get_current();
|
||||
|
||||
@@ -89,14 +89,8 @@ sp_info_t *schde_to(void *sp, umword_t sp_type)
|
||||
sched_t *next = sche->cur_sche;
|
||||
thread_t *next_th = container_of(next, thread_t, sche);
|
||||
|
||||
if (!sp_type)
|
||||
{
|
||||
cur_th->sp.knl_sp = sp;
|
||||
}
|
||||
else
|
||||
{
|
||||
cur_th->sp.user_sp = sp;
|
||||
}
|
||||
cur_th->sp.knl_sp = ksp;
|
||||
cur_th->sp.user_sp = usp;
|
||||
cur_th->sp.sp_type = sp_type;
|
||||
return &next_th->sp;
|
||||
}
|
||||
@@ -6,6 +6,7 @@
|
||||
enum task_op_code
|
||||
{
|
||||
TASK_OBJ_MAP,
|
||||
TASK_OBJ_UNMAP,
|
||||
};
|
||||
|
||||
static msg_tag_t task_syscall_func(entry_frame_t *f)
|
||||
@@ -22,7 +23,8 @@ static msg_tag_t task_syscall_func(entry_frame_t *f)
|
||||
case TASK_OBJ_MAP:
|
||||
/* code */
|
||||
break;
|
||||
|
||||
case TASK_OBJ_UNMAP:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -30,18 +32,18 @@ static msg_tag_t task_syscall_func(entry_frame_t *f)
|
||||
return tag;
|
||||
}
|
||||
|
||||
void task_init(task_t *task, ram_limit_t *ram)
|
||||
void task_init(task_t *task, ram_limit_t *ram, int is_knl)
|
||||
{
|
||||
assert(task);
|
||||
assert(ram);
|
||||
|
||||
kobject_init(&task->kobj);
|
||||
obj_space_init(&task->obj_space, ram);
|
||||
mm_space_init(&task->mm_space);
|
||||
mm_space_init(&task->mm_space, is_knl);
|
||||
task->lim = ram;
|
||||
}
|
||||
|
||||
task_t *task_create(ram_limit_t *lim)
|
||||
task_t *task_create(ram_limit_t *lim, int is_knl)
|
||||
{
|
||||
task_t *tk = mm_limit_alloc(lim, sizeof(task_t));
|
||||
|
||||
@@ -49,7 +51,7 @@ task_t *task_create(ram_limit_t *lim)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
task_init(tk, lim);
|
||||
task_init(tk, lim, is_knl);
|
||||
|
||||
return tk;
|
||||
}
|
||||
@@ -67,7 +69,7 @@ task_t *task_create(ram_limit_t *lim)
|
||||
static kobject_t *task_create_func(ram_limit_t *lim, umword_t arg0, umword_t arg1,
|
||||
umword_t arg2, umword_t arg3)
|
||||
{
|
||||
task_t *tk = task_create(lim);
|
||||
task_t *tk = task_create(lim, FALSE);
|
||||
|
||||
return &tk->kobj;
|
||||
}
|
||||
|
||||
@@ -36,11 +36,15 @@ void thread_init(thread_t *th)
|
||||
* @param pc
|
||||
* @param ip
|
||||
*/
|
||||
void thread_set_exc_regs(thread_t *th, umword_t pc)
|
||||
void thread_set_exc_regs(thread_t *th, umword_t pc, umword_t sp)
|
||||
{
|
||||
thread_t *cur_th = thread_get_current();
|
||||
pf_t *th_pf = thread_get_pf(th);
|
||||
|
||||
th_pf->pf_s.pc = pc;
|
||||
cur_th->sp.knl_sp = ((char *)cur_th + THREAD_BLOCK_SIZE - 8);
|
||||
cur_th->sp.user_sp = (void *)((sp - 8) & ~7UL);
|
||||
cur_th->sp.sp_type = 1;
|
||||
}
|
||||
/**
|
||||
* @brief 线程绑定到task
|
||||
|
||||
@@ -27,14 +27,14 @@ void thread_exit(void)
|
||||
|
||||
void thread_user_pf_set(thread_t *cur_th, void *pc, void *user_sp, void *ram)
|
||||
{
|
||||
pf_t *cur_pf = (pf_t *)user_sp - 1; // thread_get_pf(cur_th);
|
||||
pf_t *cur_pf = (pf_t *)((addr_t)(user_sp - 8) & ~0x7UL) - 1; // thread_get_pf(cur_th);
|
||||
|
||||
cur_pf->pf_s.xpsr = 0x01000000L;
|
||||
cur_pf->pf_s.lr = (umword_t)thread_exit; //!< 线程退出时调用的函数
|
||||
cur_pf->pf_s.pc = (umword_t)pc | 0x1;
|
||||
cur_pf->rg1[5] = (umword_t)ram;
|
||||
|
||||
cur_th->sp.knl_sp = (char *)cur_th + THREAD_BLOCK_SIZE;
|
||||
cur_th->sp.knl_sp = ((char *)cur_th + THREAD_BLOCK_SIZE - 8);
|
||||
cur_th->sp.user_sp = cur_pf;
|
||||
cur_th->sp.sp_type = 1;
|
||||
// arch_set_user_sp((umword_t)cur_pf);
|
||||
|
||||
@@ -32,7 +32,7 @@ static void knl_init_1(void)
|
||||
thread_t *cur_th = thread_get_current();
|
||||
|
||||
thread_init(cur_th);
|
||||
task_init(&knl_task, &root_factory_get()->limit);
|
||||
task_init(&knl_task, &root_factory_get()->limit, TRUE);
|
||||
|
||||
thread_bind(cur_th, &knl_task.kobj);
|
||||
thread_ready(cur_th, FALSE);
|
||||
@@ -49,7 +49,7 @@ static void knl_init_2(void)
|
||||
{
|
||||
thread_t *init_thread = thread_create(&root_factory_get()->limit);
|
||||
assert(init_thread);
|
||||
task_t *init_task = task_create(&root_factory_get()->limit);
|
||||
task_t *init_task = task_create(&root_factory_get()->limit, FALSE);
|
||||
assert(init_task);
|
||||
|
||||
app_info_t *app = app_info_get((void *)(KNL_TEXT + INIT_OFFSET));
|
||||
@@ -112,6 +112,6 @@ void start_kernel(void)
|
||||
thread_sched();
|
||||
cli();
|
||||
|
||||
while (1)
|
||||
;
|
||||
while (1);
|
||||
// printk(".");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user