[arch][arm-m] move the debugger structure out of kernel/thread
The arm-m specific debugger structure really should live in arm-m code, so move it there to clean things up a bit.
This commit is contained in:
@@ -6,6 +6,7 @@
|
|||||||
* https://opensource.org/licenses/MIT
|
* https://opensource.org/licenses/MIT
|
||||||
*/
|
*/
|
||||||
#include <arch/arm/cm.h>
|
#include <arch/arm/cm.h>
|
||||||
|
#include <kernel/thread.h>
|
||||||
#include <lk/compiler.h>
|
#include <lk/compiler.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
@@ -28,7 +29,30 @@ extern void _pendsv(void);
|
|||||||
extern void _systick(void);
|
extern void _systick(void);
|
||||||
|
|
||||||
#if defined(WITH_DEBUGGER_INFO)
|
#if defined(WITH_DEBUGGER_INFO)
|
||||||
extern struct __debugger_info__ _debugger_info;
|
// Contains sufficient information for a remote debugger to walk
|
||||||
|
// the thread list without needing the symbols and debug sections in
|
||||||
|
// the elf binary for lk or the ability to parse them.
|
||||||
|
static const struct __debugger_info__ {
|
||||||
|
u32 version; // flags:16 major:8 minor:8
|
||||||
|
void *thread_list_ptr;
|
||||||
|
void *current_thread_ptr;
|
||||||
|
u8 off_list_node;
|
||||||
|
u8 off_state;
|
||||||
|
u8 off_saved_sp;
|
||||||
|
u8 off_was_preempted;
|
||||||
|
u8 off_name;
|
||||||
|
u8 off_waitq;
|
||||||
|
} _debugger_info = {
|
||||||
|
.version = 0x0100,
|
||||||
|
.thread_list_ptr = &thread_list,
|
||||||
|
.current_thread_ptr = &_current_thread,
|
||||||
|
.off_list_node = __builtin_offsetof(thread_t, thread_list_node),
|
||||||
|
.off_state = __builtin_offsetof(thread_t, state),
|
||||||
|
.off_saved_sp = __builtin_offsetof(thread_t, arch.sp),
|
||||||
|
.off_was_preempted = __builtin_offsetof(thread_t, arch.was_preempted),
|
||||||
|
.off_name = __builtin_offsetof(thread_t, name),
|
||||||
|
.off_waitq = __builtin_offsetof(thread_t, blocking_wait_queue),
|
||||||
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// ARMv7m+ have more vectors than armv6m
|
// ARMv7m+ have more vectors than armv6m
|
||||||
@@ -49,6 +73,7 @@ const void *const __SECTION(".text.boot.vectab1") vectab[] = {
|
|||||||
ARMV7M_VECTOR(_usagefault), // usage fault
|
ARMV7M_VECTOR(_usagefault), // usage fault
|
||||||
0, // reserved
|
0, // reserved
|
||||||
#if defined(WITH_DEBUGGER_INFO)
|
#if defined(WITH_DEBUGGER_INFO)
|
||||||
|
// stick a pointer to the debugger info structure in unused vectors
|
||||||
(void *) 0x52474244,
|
(void *) 0x52474244,
|
||||||
&_debugger_info,
|
&_debugger_info,
|
||||||
#else
|
#else
|
||||||
@@ -63,5 +88,3 @@ const void *const __SECTION(".text.boot.vectab1") vectab[] = {
|
|||||||
_systick, // systick
|
_systick, // systick
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -200,6 +200,9 @@ static inline void set_current_thread(thread_t *t) {
|
|||||||
arch_set_current_thread(t);
|
arch_set_current_thread(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* list of all threads, unsafe to traverse without holding thread_lock */
|
||||||
|
extern struct list_node thread_list;
|
||||||
|
|
||||||
/* scheduler lock */
|
/* scheduler lock */
|
||||||
extern spin_lock_t thread_lock;
|
extern spin_lock_t thread_lock;
|
||||||
|
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ struct thread_stats thread_stats[SMP_MAX_CPUS];
|
|||||||
#define DEBUG_THREAD_CONTEXT_SWITCH 0
|
#define DEBUG_THREAD_CONTEXT_SWITCH 0
|
||||||
|
|
||||||
/* global thread list */
|
/* global thread list */
|
||||||
static struct list_node thread_list;
|
struct list_node thread_list;
|
||||||
|
|
||||||
/* master thread spinlock */
|
/* master thread spinlock */
|
||||||
spin_lock_t thread_lock = SPIN_LOCK_INITIAL_VALUE;
|
spin_lock_t thread_lock = SPIN_LOCK_INITIAL_VALUE;
|
||||||
@@ -1287,33 +1287,3 @@ status_t thread_unblock_from_wait_queue(thread_t *t, status_t wait_queue_error)
|
|||||||
|
|
||||||
return NO_ERROR;
|
return NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(WITH_DEBUGGER_INFO)
|
|
||||||
// This is, by necessity, arch-specific, and arm-m specific right now,
|
|
||||||
// but lives here due to thread_list being static.
|
|
||||||
//
|
|
||||||
// It contains sufficient information for a remote debugger to walk
|
|
||||||
// the thread list without needing the symbols and debug sections in
|
|
||||||
// the elf binary for lk or the ability to parse them.
|
|
||||||
const struct __debugger_info__ {
|
|
||||||
u32 version; // flags:16 major:8 minor:8
|
|
||||||
void *thread_list_ptr;
|
|
||||||
void *current_thread_ptr;
|
|
||||||
u8 off_list_node;
|
|
||||||
u8 off_state;
|
|
||||||
u8 off_saved_sp;
|
|
||||||
u8 off_was_preempted;
|
|
||||||
u8 off_name;
|
|
||||||
u8 off_waitq;
|
|
||||||
} _debugger_info = {
|
|
||||||
.version = 0x0100,
|
|
||||||
.thread_list_ptr = &thread_list,
|
|
||||||
.current_thread_ptr = &_current_thread,
|
|
||||||
.off_list_node = __builtin_offsetof(thread_t, thread_list_node),
|
|
||||||
.off_state = __builtin_offsetof(thread_t, state),
|
|
||||||
.off_saved_sp = __builtin_offsetof(thread_t, arch.sp),
|
|
||||||
.off_was_preempted = __builtin_offsetof(thread_t, arch.was_preempted),
|
|
||||||
.off_name = __builtin_offsetof(thread_t, name),
|
|
||||||
.off_waitq = __builtin_offsetof(thread_t, blocking_wait_queue),
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|||||||
Reference in New Issue
Block a user