原PR:#98
在sse_entry.S的103-104行,使用REG_L读取hart_id和cpu_id。REG_L加载的数据与架构位宽一致,即在RV64架构下它会被展开为ld,加载64位。在SSE结构体定义中,hart_id和cpu_id均为uint32类型。
因为使用REG_L而非lw,导致t4的值出现问题,高32位为非0的cpu_id,检查不通过,进入慢速分支Lfind_hart_id_slowpath;在慢速分支中由于在循环中错误的使用了原本非0的t3作为计数器,导致最终结束循环时t3的值为正确cpu_id的两倍。对于总核数的前一半,两倍的cpu_id值还落在合法范围内,导致sse事件被派发到错误的核处理;对于总核数的后一半,两倍的cpu_id值已经非法,因此sse_事件无响应。
原PR:#98
在sse_entry.S的103-104行,使用REG_L读取hart_id和cpu_id。REG_L加载的数据与架构位宽一致,即在RV64架构下它会被展开为ld,加载64位。在SSE结构体定义中,hart_id和cpu_id均为uint32类型。
因为使用REG_L而非lw,导致t4的值出现问题,高32位为非0的cpu_id,检查不通过,进入慢速分支Lfind_hart_id_slowpath;在慢速分支中由于在循环中错误的使用了原本非0的t3作为计数器,导致最终结束循环时t3的值为正确cpu_id的两倍。对于总核数的前一半,两倍的cpu_id值还落在合法范围内,导致sse事件被派发到错误的核处理;对于总核数的后一半,两倍的cpu_id值已经非法,因此sse_事件无响应。