static inline
unsigned int
sel_to_selector(
sel_t sel
)
{
union {
sel_t sel;
unsigned short selector;
} tconv;
tconv.sel = sel;
return (tconv.selector);
}
static inline
sel_t
selector_to_sel(
unsigned int selector
)
{
union {
unsigned short selector;
sel_t sel;
} tconv;
tconv.selector = selector;
return (tconv.sel);
}
#if 0
static inline
boolean_t
valid_user_data_selector(
unsigned int selector
)
{
sel_t sel = selector_to_sel(selector);
if (selector == 0)
return (TRUE);
if (sel.ti == SEL_LDT)
return (TRUE);
else if (sel.index < GDTSZ) {
data_desc_t *desc = (data_desc_t *)sel_to_gdt_entry(sel);
if (desc->dpl == USER_PRIV)
return (TRUE);
}
return (FALSE);
}
static inline
boolean_t
valid_user_code_selector(
unsigned int selector
)
{
sel_t sel = selector_to_sel(selector);
if (selector == 0)
return (FALSE);
if (sel.ti == SEL_LDT) {
if (sel.rpl == USER_PRIV)
return (TRUE);
}
else if (sel.index < GDTSZ && sel.rpl == USER_PRIV) {
code_desc_t *desc = (code_desc_t *)sel_to_gdt_entry(sel);
if (desc->dpl == USER_PRIV)
return (TRUE);
}
return (FALSE);
}
static inline
boolean_t
valid_user_stack_selector(
unsigned int selector
)
{
sel_t sel = selector_to_sel(selector);
if (selector == 0)
return (FALSE);
if (sel.ti == SEL_LDT) {
if (sel.rpl == USER_PRIV)
return (TRUE);
}
else if (sel.index < GDTSZ && sel.rpl == USER_PRIV) {
data_desc_t *desc = (data_desc_t *)sel_to_gdt_entry(sel);
if (desc->dpl == USER_PRIV)
return (TRUE);
}
return (FALSE);
}
#endif