int do_get_thread_area(struct thread_struct *t, struct user_desc *u_info) { struct user_desc info; struct n_desc_struct *desc; int idx; if (get_user(idx, &u_info->entry_number)) return -EFAULT; if (idx < GDT_ENTRY_TLS_MIN || idx > GDT_ENTRY_TLS_MAX) return -EINVAL; desc = ((struct n_desc_struct *)t->tls_array) + idx - GDT_ENTRY_TLS_MIN; memset(&info, 0, sizeof(struct user_desc)); info.entry_number = idx; info.base_addr = GET_BASE(desc); info.limit = GET_LIMIT(desc); info.seg_32bit = GET_32BIT(desc); info.contents = GET_CONTENTS(desc); info.read_exec_only = !GET_WRITABLE(desc); info.limit_in_pages = GET_LIMIT_PAGES(desc); info.seg_not_present = !GET_PRESENT(desc); info.useable = GET_USEABLE(desc); info.lm = GET_LONGMODE(desc); if (copy_to_user(u_info, &info, sizeof(info))) return -EFAULT; return 0; }
BASE_UI base_ui(uint32_t ui_element) { switch (((uint32_t*)ui_element)[0] & 0xFF) { case T_TEXT_UI: return GET_BASE(ui_element, TEXT_UI); break; case T_CONTAINER_UI: return GET_BASE(ui_element, CONTAINER_UI); break; case T_LIST_UI: return GET_BASE(ui_element, LIST_UI); break; case T_CHECKBOX_UI: return GET_BASE(ui_element, CHECKBOX_UI); break; case T_PROGRESS_UI: return GET_BASE(ui_element, PROGRESS_UI); break; } }