diff options
Diffstat (limited to 'c/src/lib/libcpu/i386/cpu.h')
-rw-r--r-- | c/src/lib/libcpu/i386/cpu.h | 91 |
1 files changed, 87 insertions, 4 deletions
diff --git a/c/src/lib/libcpu/i386/cpu.h b/c/src/lib/libcpu/i386/cpu.h index e14acc4ce7..23a82de2be 100644 --- a/c/src/lib/libcpu/i386/cpu.h +++ b/c/src/lib/libcpu/i386/cpu.h @@ -28,7 +28,7 @@ */ #include <rtems/score/interrupts.h> -#include <stdint.h> +#include <rtems/score/basedefs.h> /* * Segment Access Routines @@ -256,7 +256,7 @@ typedef struct { unsigned int operation_size : 1; unsigned int granularity : 1; unsigned int base_address_31_24 : 8; -}segment_descriptors; +} RTEMS_COMPILER_PACKED_ATTRIBUTE segment_descriptors; /* * C callable function enabling to get easilly usable info from @@ -271,11 +271,94 @@ extern void i386_get_info_from_GDTR (segment_descriptors** table, extern void i386_set_GDTR (segment_descriptors*, uint16_t limit); +/** + * C callable function: + * Puts global descriptor @sd to the global descriptor table on index + * @segment_selector_index + * + * @retval 0 FAILED out of GDT range or index is 0, which is not valid + * index in GDT + * 1 SUCCESS + */ +extern uint32_t i386_raw_gdt_entry (uint16_t segment_selector_index, + segment_descriptors* sd); + +/** + * C callable function + * fills @sd with provided @base in appropriate fields of @sd + * + * @param base 32-bit address to be set as descriptor's base + * @param sd descriptor being filled with @base + */ +extern void i386_fill_segment_desc_base (uint32_t base, + segment_descriptors* sd); + +/** + * C callable function + * fills @sd with provided @limit in appropriate fields of @sd + * also influences granularity bit + * + * @param limit 32-bit value representing number of limit bytes + * @param sd descriptor being filled with @limit + */ +extern void i386_fill_segment_desc_limit (uint32_t limit, + segment_descriptors* sd); + /* * C callable function enabling to set up one raw interrupt handler */ -extern int i386_set_gdt_entry (unsigned short segment_selector, unsigned base, - unsigned limit); +extern uint32_t i386_set_gdt_entry (uint16_t segment_selector, + uint32_t base, + uint32_t limit); + +/** + * C callable function returns next empty descriptor in GDT. + * + * @retval 0 FAILED GDT is full + * <1;65535> segment_selector number as index to GDT + */ +extern uint16_t i386_next_empty_gdt_entry (void); + +/** + * Copies GDT entry at index @segment_selector to structure + * pointed to by @struct_to_fill + * + * @param segment_selector index to GDT table for specifying descriptor to copy + * @retval 0 FAILED segment_selector out of GDT range + * <1;65535> retrieved segment_selector + */ +extern uint16_t i386_cpy_gdt_entry (uint16_t segment_selector, + segment_descriptors* struct_to_fill); + +/** + * Returns pointer to GDT table at index given by @segment_selector + * + * @param segment_selector index to GDT table for specifying descriptor to get + * @retval NULL FAILED segment_selector out of GDT range + * pointer to GDT table at @segment_selector + */ +extern segment_descriptors* i386_get_gdt_entry (uint16_t sgmnt_selector); + +/** + * Extracts base address from GDT entry pointed to by @gdt_entry + * + * @param gdt_entry pointer to entry from which base should be retrieved + * @retval base address from GDT entry +*/ +RTEMS_INLINE_ROUTINE void* i386_base_gdt_entry (segment_descriptors* gdt_entry) +{ + return (void*)(gdt_entry->base_address_15_0 | + (gdt_entry->base_address_23_16<<16) | + (gdt_entry->base_address_31_24<<24)); +} + +/** + * Extracts limit in bytes from GDT entry pointed to by @gdt_entry + * + * @param gdt_entry pointer to entry from which limit should be retrieved + * @retval limit value in bytes from GDT entry + */ +extern uint32_t i386_limit_gdt_entry (segment_descriptors* gdt_entry); /* * See page 11.18 Figure 11-12. |