[PATCH 1/4] bsps: Use _Objects_Information_table
Sebastian Huber
sebastian.huber at embedded-brains.de
Wed May 29 15:31:06 UTC 2013
Eliminate copy and paste. Use the _Objects_Information_table since this
will take into account that more than one internal thread may exist,
e.g. MPCI thread or idle threads of secondary processors.
---
c/src/lib/libbsp/shared/gdbstub/rtems-stub-glue.c | 315 ++++++++-------------
1 files changed, 123 insertions(+), 192 deletions(-)
diff --git a/c/src/lib/libbsp/shared/gdbstub/rtems-stub-glue.c b/c/src/lib/libbsp/shared/gdbstub/rtems-stub-glue.c
index 538a9e6..a92698b 100644
--- a/c/src/lib/libbsp/shared/gdbstub/rtems-stub-glue.c
+++ b/c/src/lib/libbsp/shared/gdbstub/rtems-stub-glue.c
@@ -64,102 +64,80 @@ int rtems_gdb_stub_thread_support_ok(void)
* Return the gdb thread id for the specified RTEMS thread id
*/
-int rtems_gdb_stub_id_to_index(
+static int rtems_gdb_stub_id_to_index(
Objects_Id thread_obj_id
)
{
- Objects_Id min_id, max_id;
- int first_posix_id, first_rtems_id;
- Objects_Information *obj_info;
+ int gdb_index = 0;
+ int first = 1;
+ size_t api_index;
if (_System_state_Get() != SYSTEM_STATE_UP) {
/* We have one thread let us use value reserved for idle thread */
- return 1;
+ gdb_index = 1;
}
- if (_Thread_Executing == _Thread_Idle) {
- return 1;
- }
-
- /* Let us figure out thread_id for gdb */
- first_rtems_id = 2;
-
- obj_info = _Objects_Information_table[OBJECTS_CLASSIC_API][1];
+ for (
+ api_index = 1;
+ gdb_index == 0 && api_index <= OBJECTS_APIS_LAST;
+ ++api_index
+ ) {
+ if (_Objects_Information_table[api_index] != NULL) {
+ const Objects_Information *info =
+ _Objects_Information_table[api_index][1];
+ Objects_Id min_id = info->minimum_id;
+ Objects_Id max_id = info->maximum_id;
+ int last = first + (int) (max_id - min_id);
- min_id = obj_info->minimum_id;
- max_id = obj_info->maximum_id;
+ if (thread_obj_id >= min_id && thread_obj_id < max_id) {
+ gdb_index = first + (int) (thread_obj_id - min_id);
+ }
- if (thread_obj_id >= min_id && thread_obj_id < max_id) {
- return first_rtems_id + (thread_obj_id - min_id);
+ first = last + 1;
+ }
}
- first_posix_id = first_rtems_id + (max_id - min_id) + 1;
-
- min_id = _Objects_Information_table[OBJECTS_POSIX_API][1]->minimum_id;
-
- return first_posix_id + (thread_obj_id - min_id);
+ return gdb_index;
}
/* Return the RTEMS thread id from a gdb thread id */
Thread_Control *rtems_gdb_index_to_stub_id(
- int thread
+ int gdb_index
)
{
- Objects_Id thread_obj_id;
- Objects_Id min_id, max_id;
- int first_posix_id, first_rtems_id;
- Objects_Information *obj_info;
- Thread_Control *th;
-
- ASSERT(registers != NULL);
-
- if (_System_state_Get() != SYSTEM_STATE_UP || thread <= 0) {
- /* Should not happen */
- return NULL;
- }
-
- if (thread == 1) {
- th = _Thread_Idle;
- goto found;
- }
-
- /* Let us get object associtated with current thread */
- first_rtems_id = 2;
+ Thread_Control *th = NULL;
+ int first = 1;
+ size_t api_index;
- thread_obj_id = _Thread_Executing->Object.id;
+ ASSERT(registers != NULL);
- /* Let us figure out thread_id for gdb */
- obj_info = _Objects_Information_table[OBJECTS_CLASSIC_API][1];
-
- min_id = obj_info->minimum_id;
- max_id = obj_info->maximum_id;
+ if (_System_state_Get() != SYSTEM_STATE_UP || gdb_index <= 0) {
+ /* Should not happen */
+ return NULL;
+ }
- if (thread <= (first_rtems_id + (max_id - min_id))) {
- th = (Thread_Control *)(obj_info->local_table[thread - first_rtems_id + 1]);
+ for (
+ api_index = 1;
+ th == NULL && api_index <= OBJECTS_APIS_LAST;
+ ++api_index
+ ) {
+ if (_Objects_Information_table[api_index] != NULL) {
+ const Objects_Information *info =
+ _Objects_Information_table[api_index][1];
+ Objects_Id min_id = info->minimum_id;
+ Objects_Id max_id = info->maximum_id;
+ int last = first + (int) (max_id - min_id);
- if (th != NULL) {
- goto found;
+ if (gdb_index <= first + (int) (max_id - min_id)) {
+ th = (Thread_Control *)
+ info->local_table[gdb_index - first + 1];
}
- /* Thread does not exist */
- return NULL;
- }
-
- first_posix_id = first_rtems_id + (max_id - min_id) + 1;
-
- obj_info = _Objects_Information_table[OBJECTS_POSIX_API][1];
-
- min_id = obj_info->minimum_id;
- max_id = obj_info->maximum_id;
-
- th = (Thread_Control *)(obj_info->local_table[thread - first_posix_id + 1]);
- if (th == NULL) {
- /* Thread does not exist */
- return NULL;
- }
+ first = last + 1;
+ }
+ }
- found:
- return th;
+ return th;
}
/* Get id of the thread stopped by exception */
@@ -170,70 +148,49 @@ int rtems_gdb_stub_get_current_thread(void)
/* Get id of the next thread after athread, if argument <= 0 find the
first available thread, return thread if found or 0 if not */
-int rtems_gdb_stub_get_next_thread(int athread)
+int rtems_gdb_stub_get_next_thread(int gdb_index)
{
- Objects_Id id, min_id, max_id;
- int lim, first_posix_id, first_rtems_id;
- Objects_Information *obj_info;
- int start;
+ int next_gdb_index = 0;
+ int first = 1;
+ size_t api_index;
if (_System_state_Get() != SYSTEM_STATE_UP) {
/* We have one thread let us use value of idle thread */
- return (athread < 1) ? 1 : 0;
+ return (gdb_index < 1) ? 1 : 0;
}
- if (athread < 1) {
- return 1;
- }
-
- first_rtems_id = 2;
-
- obj_info = _Objects_Information_table[OBJECTS_CLASSIC_API][1];
+ for (
+ api_index = 1;
+ next_gdb_index == 0 && api_index <= OBJECTS_APIS_LAST;
+ ++api_index
+ ) {
+ if (_Objects_Information_table[api_index] != NULL) {
+ const Objects_Information *info =
+ _Objects_Information_table[api_index][1];
+ Objects_Id min_id = info->minimum_id;
+ Objects_Id max_id = info->maximum_id;
+ int last = first + (int) (max_id - min_id);
- min_id = obj_info->minimum_id;
- max_id = obj_info->maximum_id;
+ if (gdb_index <= last) {
+ int start = gdb_index < first ? first : gdb_index + 1;
+ int potential_next;
- lim = first_rtems_id + max_id - min_id;
-
- if (athread < lim) {
- if (athread < first_rtems_id) {
- start = first_rtems_id;
- } else {
- start = 1 + athread;
- }
-
- for (id=start; id<=lim; id++) {
- if (obj_info->local_table[id - first_rtems_id + 1] != NULL) {
- return id;
+ for (
+ potential_next = start;
+ next_gdb_index == 0 && potential_next <= last;
+ ++potential_next
+ ) {
+ if (info->local_table[potential_next - first + 1] != NULL) {
+ next_gdb_index = potential_next;
+ }
+ }
}
- }
- }
-
- first_posix_id = first_rtems_id + (max_id - min_id) + 1;
- obj_info = _Objects_Information_table[OBJECTS_POSIX_API][1];
-
- min_id = obj_info->minimum_id;
- max_id = obj_info->maximum_id;
-
- lim = first_posix_id + (max_id - min_id);
-
- if (athread < lim) {
- if (athread < first_posix_id) {
- start = first_posix_id;
- } else {
- start = 1 + athread;
- }
-
- for (id=start; id<=lim; id++) {
- if (obj_info->local_table[id - first_posix_id + 1] != NULL) {
- return id;
- }
+ first = last + 1;
}
}
- /* Not found */
- return 0;
+ return next_gdb_index;
}
/* Get thread registers, return 0 if thread does not
@@ -273,25 +230,21 @@ int rtems_gdb_stub_set_thread_regs(
/* Get thread information, return 0 if thread does not
exist and 1 otherwise */
-int rtems_gdb_stub_get_thread_info(
- int thread,
+static int rtems_gdb_stub_get_thread_info(
+ int gdb_index,
struct rtems_gdb_stub_thread_info *info
)
{
- Objects_Id thread_obj_id;
- Objects_Id min_id, max_id;
- int first_posix_id, first_rtems_id;
- Objects_Information *obj_info;
- Thread_Control *th;
- char tmp_buf[20];
+ int first = 1;
+ size_t api_index;
ASSERT(info != NULL);
- if (thread <= 0) {
+ if (gdb_index <= 0) {
return 0;
}
- if (_System_state_Get() != SYSTEM_STATE_UP || thread == 1) {
+ if (_System_state_Get() != SYSTEM_STATE_UP || gdb_index == 1) {
/* We have one thread let us use value
which will never happen for real thread */
strcpy(info->display, "idle thread");
@@ -301,75 +254,53 @@ int rtems_gdb_stub_get_thread_info(
return 1;
}
- /* Let us get object associtated with current thread */
- thread_obj_id = _Thread_Executing->Object.id;
-
- /* Let us figure out thread_id for gdb */
- first_rtems_id = 2;
-
- obj_info = _Objects_Information_table[OBJECTS_CLASSIC_API][1];
-
- min_id = obj_info->minimum_id;
- max_id = obj_info->maximum_id;
-
- if (thread <= (first_rtems_id + (max_id - min_id))) {
- th = (Thread_Control *)(obj_info->local_table[thread -
- first_rtems_id + 1]);
-
- if (th == NULL) {
- /* Thread does not exist */
- return 0;
- }
-
- strcpy(info->display, "rtems task: control at 0x");
+ for (
+ api_index = 1;
+ api_index <= OBJECTS_APIS_LAST;
+ ++api_index
+ ) {
+ if (_Objects_Information_table[api_index] != NULL) {
+ const Objects_Information *obj_info =
+ _Objects_Information_table[api_index][1];
+ Objects_Id min_id = obj_info->minimum_id;
+ Objects_Id max_id = obj_info->maximum_id;
+ int last = first + (int) (max_id - min_id);
- tmp_buf[0] = gdb_hexchars[(((int)th) >> 28) & 0xf];
- tmp_buf[1] = gdb_hexchars[(((int)th) >> 24) & 0xf];
- tmp_buf[2] = gdb_hexchars[(((int)th) >> 20) & 0xf];
- tmp_buf[3] = gdb_hexchars[(((int)th) >> 16) & 0xf];
- tmp_buf[4] = gdb_hexchars[(((int)th) >> 12) & 0xf];
- tmp_buf[5] = gdb_hexchars[(((int)th) >> 8) & 0xf];
- tmp_buf[6] = gdb_hexchars[(((int)th) >> 4) & 0xf];
- tmp_buf[7] = gdb_hexchars[((int)th) & 0xf];
- tmp_buf[8] = 0;
+ if (gdb_index <= last) {
+ Thread_Control *th = (Thread_Control *)
+ obj_info->local_table[gdb_index - first + 1];
- strcat(info->display, tmp_buf);
- rtems_object_get_name( ((Objects_Control*)th)->id, 5, info->name );
- info->more_display[0] = 0; /* Nothing */
+ if (th != NULL) {
+ char tmp_buf[9];
- return 1;
- }
+ strcpy(info->display, "task: control at 0x");
- first_posix_id = first_rtems_id + (max_id - min_id) + 1;
+ tmp_buf[0] = gdb_hexchars[(((int)th) >> 28) & 0xf];
+ tmp_buf[1] = gdb_hexchars[(((int)th) >> 24) & 0xf];
+ tmp_buf[2] = gdb_hexchars[(((int)th) >> 20) & 0xf];
+ tmp_buf[3] = gdb_hexchars[(((int)th) >> 16) & 0xf];
+ tmp_buf[4] = gdb_hexchars[(((int)th) >> 12) & 0xf];
+ tmp_buf[5] = gdb_hexchars[(((int)th) >> 8) & 0xf];
+ tmp_buf[6] = gdb_hexchars[(((int)th) >> 4) & 0xf];
+ tmp_buf[7] = gdb_hexchars[((int)th) & 0xf];
+ tmp_buf[8] = 0;
- obj_info = _Objects_Information_table[OBJECTS_POSIX_API][1];
+ strcat(info->display, tmp_buf);
+ rtems_object_get_name( th->Object.id, 5, info->name );
+ info->more_display[0] = 0; /* Nothing */
- min_id = obj_info->minimum_id;
- max_id = obj_info->maximum_id;
+ return 1;
+ } else {
+ /* Thread does not exist */
+ return 0;
+ }
+ }
- th = (Thread_Control *)(obj_info->local_table[thread - first_posix_id + 1]);
- if (th == NULL) {
- /* Thread does not exist */
- return 0;
+ first = last + 1;
+ }
}
- strcpy(info->display, "posix thread: control at 0x");
-
- tmp_buf[0] = gdb_hexchars[(((int)th) >> 28) & 0xf];
- tmp_buf[1] = gdb_hexchars[(((int)th) >> 24) & 0xf];
- tmp_buf[2] = gdb_hexchars[(((int)th) >> 20) & 0xf];
- tmp_buf[3] = gdb_hexchars[(((int)th) >> 16) & 0xf];
- tmp_buf[4] = gdb_hexchars[(((int)th) >> 12) & 0xf];
- tmp_buf[5] = gdb_hexchars[(((int)th) >> 8) & 0xf];
- tmp_buf[6] = gdb_hexchars[(((int)th) >> 4) & 0xf];
- tmp_buf[7] = gdb_hexchars[((int)th) & 0xf];
- tmp_buf[8] = 0;
-
- strcat(info->display, tmp_buf);
- rtems_object_get_name( ((Objects_Control*)th)->id, 5, info->name );
- info->more_display[0] = 0; /* Nothing */
-
- return 1;
+ return 0;
}
/*******************************************************/
--
1.7.7
More information about the devel
mailing list