i386: doxygen and comments related to VESA real mode framebuffer

This commit is contained in:
Jan Dolezal
2014-12-04 13:37:50 -05:00
committed by Gedare Bloom
parent d78eac64a8
commit 038e1dba31
10 changed files with 686 additions and 417 deletions
@@ -1,35 +1,39 @@
/*
* FB driver for graphic hardware compatible with VESA Bios Extension
* Real mode interface utilized
* Tested on real HW.
/**
* @file fb_vesa_rm.c
*
* Copyright (c) 2014 - CTU in Prague
* Jan Doležal ( dolezj21@fel.cvut.cz )
* @ingroup i386_pc386
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rtems.org/license/LICENSE.
* @brief FB driver for graphic hardware compatible with VESA Bios Extension
* Real mode interface utilized
* Tested on real HW.
*
* The code for rtems_buffer_* functions were greatly
* inspired or coppied from:
* - RTEMS fb_cirrus.c - Alexandru-Sever Horin (alex.sever.h@gmail.com)
* Public sources related:
* - VESA BIOS EXTENSION (VBE) Core Function Standard, Ver: 3.0, Sep 16, 1998
* - VESA Enhanced Extended Display Identification Data (E-EDID) Standard
* Release A, Revision 2, September 25, 2006
*
* Public sources related:
* - VESA BIOS EXTENSION (VBE) Core Function Standard, Ver: 3.0, Sep 16, 1998
* - VESA Enhanced Extended Display Identification Data (E-EDID) Standard
* Release A, Revision 2, September 25, 2006
* Hardware is completely initialized upon boot of the system.
* Therefore there is no way to change graphics mode later.
*
* Interrupt 0x10 is used for entering graphics BIOS.
*
* Driver reads parameter from multiboot command line to setup video:
* "--video=<resX>x<resY>[-<bpp>]"
* If cmdline parameter is not specified an attempt for obtaining
* resolution from display attached is made.
*/
/*
* Hardware is completely initialized upon boot of the system.
* Therefore there is no way to change graphics mode later.
* Copyright (c) 2014 - CTU in Prague
* Jan Doležal ( dolezj21@fel.cvut.cz )
*
* Interrupt 0x10 is used for entering graphics BIOS.
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rtems.org/license/LICENSE.
*
* Driver reads parameter from multiboot command line to setup video:
* "--video=<resX>x<resY>[-<bpp>]"
* If cmdline parameter is not specified an attempt for obtaining
* resolution from display attached is made.
* The code for rtems_buffer_* functions were greatly
* inspired or coppied from:
* - RTEMS fb_cirrus.c - Alexandru-Sever Horin (alex.sever.h@gmail.com)
*/
#include <bsp.h>
@@ -48,6 +52,13 @@
#define FB_VESA_NAME "FB_VESA_RM"
/**
* @brief Initializes VBE framebuffer during bootup.
*
* utilizes switches to real mode interrupts and therefore must be
* called during bootup before tick is set up and real-time
* interrupt vectors utilized
*/
void vesa_realmode_bootup_init(void);
/* mutex for protection against multiple opens, when called frame_buffer_open */
@@ -187,19 +198,37 @@ uint32_t VBE_read_EDID(uint16_t controller_unit_number,
return (parret.reg_eax & 0xFFFF);
}
/**
* @brief Basic graphic's mode parameters
*/
typedef struct {
/** number of the graphic's mode */
uint16_t mode_number;
/** number of pixels in one line */
uint16_t resX;
/** number of lines */
uint16_t resY;
/** bits per pixel */
uint8_t bpp;
} Mode_params;
/* finds mode in 'modeList' of 'listLength' length according to resolution
given in 'searchedResolution'. If bpp is given in that struct as well
mode with such color depth and resolution is searched for. Otherwise bpp
has to be zero. Mode number found is returned and also filled into
'searchedResolution'. bpp is also filled into 'searchedResolution' if it
was 0 before call. */
/**
* @brief Find mode by resolution in the given list of modes
*
* finds mode in \p mode_list of \p list_length length according to resolution
* given in \p searched_resolution . If bpp is given in that struct as well
* mode with such color depth and resolution is searched for. Otherwise bpp
* has to be zero. Mode number found is returned and also filled into
* \p searched_resolution . bpp is also filled into \p searchedResolution if it
* was 0 before call.
*
* @param[in] mode_list list of modes to be searched
* @param[in] list_length number of modes in the list
* @param[in,out] searched_resolution element filled with searched resolution
* or/and bpp; mode_number is filled in if appropriate mode found
* @retval mode number satisfying given parameters
* @retval -1 no suitable mode found
*/
static uint16_t find_mode_by_resolution(Mode_params *mode_list,
uint8_t list_length,
Mode_params *searched_resolution)
@@ -223,14 +252,18 @@ static uint16_t find_mode_by_resolution(Mode_params *mode_list,
return -1;
}
/*
* Parse comandline option "--video=" if available.
/**
* @brief Find mode given within command line.
*
* Parse command line option "--video=" if available.
* expected format
* --video=<resX>x<resY>[-<bpp>]
* numbers <resX>, <resY> and <bpp> are decadic
*
* @param[in] mode_list list of modes to be searched
* @param[in] list_length number of modes in the list
* @retval video mode number to be set
* -1 on parsing error or when no suitable mode found
* @retval -1 on parsing error or when no suitable mode found
*/
static uint16_t find_mode_using_cmdline(Mode_params *mode_list,
uint8_t list_length)
@@ -278,11 +311,13 @@ static uint16_t find_mode_using_cmdline(Mode_params *mode_list,
return -1;
}
/*
* returns mode number best fitting to monitor attached
/**
* @brief Find mode number best fitting to monitor attached
*
* @param[in] mode_list list of modes to be searched
* @param[in] list_length number of modes in the list
* @retval video mode number to be set
* -1 on parsing error or when no suitable mode found
* @retval -1 on parsing error or when no suitable mode found
*/
static uint16_t find_mode_using_EDID( Mode_params *mode_list,
uint8_t list_length)
+7 -7
View File
@@ -4,16 +4,16 @@
* @ingroup i386_pc386
*
* @brief VESA EDID definitions.
*
* This file contains definitions for constants related to
* VESA Extended Display Identification Data.
* More information can be found at
* <http://www.vesa.org/vesa-standards/free-standards/>
* VESA public standards may be found at
* <http://www.vesa.org/wp-content/uploads/2010/12/thankspublic.htm>
*/
/*
* edid.h - This file contains definitions for constants related to
* VESA Extended Display Identification Data.
* More information can be found at
* <http://www.vesa.org/vesa-standards/free-standards/>
* VESA public standards may be found at
* <http://www.vesa.org/wp-content/uploads/2010/12/thankspublic.htm>
*
* Copyright (C) 2014 Jan Doležal (dolezj21@fel.cvut.cz)
* CTU in Prague.
*
+39 -38
View File
@@ -3,12 +3,10 @@
*
* @ingroup i386_pc386
*
* @brief Definitioins for vesa based framebuffer drivers.
* @brief Headers specific for framebuffer drivers utilizing VESA VBE.
*/
/*
* Headers specific for framebuffer drivers utilizing VESA VBE.
*
* Copyright (C) 2014 Jan Doležal (dolezj21@fel.cvut.cz)
* CTU in Prague.
*
@@ -35,15 +33,16 @@ extern "C" {
/* ----- Prototypes ----- */
/**
* Returns information about graphic's controller in the infoBlock structure.
* @brief Returns information about graphic's controller in the \p info_block
* structure.
*
* @param infoBlock pointer to the struct to be filled with
controller information
* @param queriedVBEVersion if >0x200 then video bios is asked to fill in
* @param[out] info_block pointer to the struct to be filled with
* controller information
* @param[in] queried_VBE_Version if >0x200 then video bios is asked to fill in
* parameters which appeared with second version
* of VBE.
* @retval register ax content as defined in VBE RETURN STATUS paragraph
* -1 error calling graphical bios
* @retval ax register content as defined in VBE RETURN STATUS paragraph
* @retval -1 error calling graphical bios
*/
uint32_t VBE_controller_information (
VBE_vbe_info_block *info_block,
@@ -51,13 +50,14 @@ uint32_t VBE_controller_information (
);
/**
* Fills structure infoBlock with informations about selected mode in
* modeNumber variable.
* @brief Fills structure \p info_block with informations about selected mode in
* \p mode_number variable.
*
* @param infoBlock pointer to the struct to be filled with mode information
* @param modeNumber detailes of this mode to be filled
* @retval register ax content as defined in VBE RETURN STATUS paragraph
* -1 error calling graphical bios
* @param[out] info_block pointer to the struct to be filled with
* mode information
* @param[in] mode_number detailes of this mode to be filled
* @retval ax register content as defined in VBE RETURN STATUS paragraph
* @retval -1 error calling graphical bios
*/
uint32_t VBE_mode_information (
VBE_mode_info_block *info_block,
@@ -65,13 +65,13 @@ uint32_t VBE_mode_information (
);
/**
* Sets graphics mode selected. If mode has refreshRateCtrl bit set, than the
* infoBlock must be filled accordingly.
* @brief Sets graphics mode selected. If mode has refreshRateCtrl bit set, than
* the \p info_block must be filled accordingly.
*
* @param modeNumber number of mode to be set
* @param infoBlock pointer to struct containing refresh rate control info
* @retval register ax content as defined in VBE RETURN STATUS paragraph
* -1 error calling graphical bios
* @param[in] mode_number number of mode to be set
* @param[in] info_block pointer to struct containing refresh rate control info
* @retval ax register content as defined in VBE RETURN STATUS paragraph
* @retval -1 error calling graphical bios
*/
uint32_t VBE_set_mode (
uint16_t mode_number,
@@ -79,27 +79,27 @@ uint32_t VBE_set_mode (
);
/**
* Get currently set mode number.
* @brief Get currently set mode number.
*
* @param modeNumber variable to be filled with current mode number
* @retval register ax content as defined in VBE RETURN STATUS paragraph
* -1 error calling graphical bios
* @param[out] mode_number variable to be filled with current mode number
* @retval ax register content as defined in VBE RETURN STATUS paragraph
* @retval -1 error calling graphical bios
*/
uint32_t VBE_current_mode (
uint16_t *mode_number
);
/**
* Gets information about display data channel implemented in the
* @brief Gets information about display data channel implemented in the
* graphic's controller.
*
* @param controllerUnitNumber
* @param secondsToTransferEDIDBlock approximate time to transfer one EDID block
* rounded up to seconds
* @param DDCLevelSupported after call contains DDC version supported and
* @param[in] controller_unit_number
* @param[out] seconds_to_transfer_EDID_block approximate time to transfer one
* EDID block rounded up to seconds
* @param[out] DDC_level_supported contains DDC version supported and
* screen blanking state during transfer
* @retval register ax content as defined in VBE RETURN STATUS paragraph
* -1 error calling graphical bios
* @retval ax register content as defined in VBE RETURN STATUS paragraph
* @retval -1 error calling graphical bios
*/
uint32_t VBE_report_DDC_capabilities (
uint16_t controller_unit_number,
@@ -108,13 +108,14 @@ uint32_t VBE_report_DDC_capabilities (
);
/**
* Reads selected EDID block from display attached to controller's interface.
* @brief Reads selected EDID block from display attached to controller's
* interface.
*
* @param controllerUnitNumber
* @param EDIDBlockNumber block no. to be read from the display
* @param buffer place to store block fetched from the display
* @retval register ax content as defined in VBE RETURN STATUS paragraph
* -1 error calling graphical bios
* @param[in] controller_unit_number
* @param[in] EDID_block_number block no. to be read from the display
* @param[out] buffer place to store block fetched from the display
* @retval ax register content as defined in VBE RETURN STATUS paragraph
* @retval -1 error calling graphical bios
*/
uint32_t VBE_read_EDID (
uint16_t controller_unit_number,
@@ -7,7 +7,6 @@
*/
/*
* Definitions related to the PC386 BSP.
* This header file is also used in assembler modules.
*
* Copyright (C) 2014 Jan Doležal (dolezj21@fel.cvut.cz)
File diff suppressed because it is too large Load Diff
@@ -1,20 +1,28 @@
/**
* @file realmode_int.c
*
* @ingroup i386_shared
*
* @brief Real mode interrupt call implementation
*/
/*
* Realmode interrupt call implementation.
*
*
* Copyright (c) 2014 - CTU in Prague
* Jan Doležal ( dolezj21@fel.cvut.cz )
* Copyright (c) 2014 - CTU in Prague
* Jan Doležal ( dolezj21@fel.cvut.cz )
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rtems.org/license/LICENSE.
*
*/
#include <bsp/realmode_int.h>
#include <string.h>
#include <rtems/score/cpu.h>
/*
* offsets to \a i386_realmode_interrupt_registers declared in realmode_int.h
* used in inline assmbler for better readability
*/
#define IR_EAX_OFF "0x00"
#define IR_EBX_OFF "0x04"
#define IR_ECX_OFF "0x08"
@@ -26,25 +34,45 @@
#define IR_FS_OFF "0x1C"
#define IR_GS_OFF "0x1E"
/*
* offsets to \a rm_int_regs_bkp_param
*/
#define BKP_ESP_OFF "0x20"
#define BKP_SS_OFF "0x24"
#define BKP_DS_OFF "0x26"
#define RM_ENTRY "0x28"
#define PM_ENTRY "0x2C"
/* parameters, results, backup values accessible in real mode */
/**
* @brief parameters, results, backup values accessible in real mode
*
* @note Struct members not necessarily used in C. This serves also as
* layout of memory and it is used within inline assembler.
*/
typedef struct {
i386_realmode_interrupt_registers inoutregs;
/** spot for back up of protected mode stack pointer */
uint32_t pm_esp_bkp;
/** spot for back up of protected mode stack selector */
uint16_t pm_ss_bkp;
/** spot for back up of protected mode data selector */
uint16_t ds_bkp;
/** spot for setting up long indirect jump offset
to real mode from 16bit protected mode */
uint16_t rm_entry;
/** spot for setting up long indirect jump segment
to real mode from 16bit protected mode */
uint16_t rm_code_segment;
/** returning offset for long indirect jump back
to 32bit protected mode */
uint32_t pm_entry;
/** returning selector for long indirect jump back
to 32bit protected mode */
uint16_t pm_code_selector;
/* if modifying update offset definitions as well */
/* if this struct is to be modified update offset definitions as well */
} RTEMS_COMPILER_PACKED_ATTRIBUTE rm_int_regs_bkp_param;
/* offsets to \a pm_bkp_and_param */
#define BKP_IDTR_LIM "0x00"
#define BKP_IDTR_BASE "0x02"
#define BKP_ES_OFF "0x06"
@@ -55,18 +83,35 @@ typedef struct {
#define RM_SS "0x14"
#define RM_SP "0x16"
#define RM_DS "0x18"
/* backup values, pointers/parameters accessible in protected mode */
/**
* @brief backup values, pointers/parameters accessible in protected mode
*
* @note Struct members not necessarily used in C. This serves also as
* layout of memory and it is used within inline assembler.
*/
typedef struct {
/** spot for backup protected mode interrupt descriptor table register */
uint16_t idtr_lim_bkp;
/** @see idtr_lim_bkp */
uint32_t idtr_base_bkp;
/** spot to backup of ES register value in 32bit protected mode */
uint16_t es_bkp;
/** spot to backup of FS register value in 32bit protected mode */
uint16_t fs_bkp;
/** spot to backup of GS register value in 32bit protected mode */
uint16_t gs_bkp;
/** values for indirect jump to 16bit protected mode */
uint32_t rml_entry;
/** @see rml_entry */
uint16_t rml_code_selector;
/** data selector for 16bit protected mode */
uint16_t rml_data_selector;
/** values determinig location of real mode stack */
uint16_t rm_stack_segment;
/** @see rm_stack_segment */
uint16_t rm_stack_pointer;
/** data segment for real mode */
uint16_t rm_data_segment;
} RTEMS_COMPILER_PACKED_ATTRIBUTE pm_bkp_and_param;
@@ -112,10 +157,14 @@ static __DP_TYPE descsPrepared = __DP_NO;
static uint16_t rml_code_dsc_index = 0;
static uint16_t rml_data_dsc_index = 0;
/*
* Prepares real-mode like descriptors to be used for switching
/**
* @brief Prepares real-mode like descriptors to be used for switching
* to real mode.
*
* Descriptors will be placed to the GDT.
*
* @param[in] base32 32-bit physical address to be used as base for 16-bit
* protected mode descriptors
* @retval __DP_YES descriptors are prepared
* @retval __DP_FAIL descriptors allocation failed (GDT too small)
*/
@@ -4,14 +4,14 @@
* @ingroup i386_shared
*
* @brief Definitioins supporting real mode interrupt calls.
*
* Interface allows calling given interrupt number with content of the
* registers defined. For passing or receiving higher amounts of the data
* there is a buffer accessible from real mode available. Real mode pointer
* to this buffer is passed to the interrupt in the registers.
*/
/*
* Interface allows calling given interrupt number with content of the
* registers defined. For passing or receiving higher amounts of the data
* there is a buffer accessible from real mode available. Real mode pointer
* to this buffer is passed to the interrupt in the registers.
*
* Copyright (C) 2014 Jan Doležal (dolezj21@fel.cvut.cz)
* CTU in Prague.
*
@@ -36,7 +36,11 @@ extern "C" {
/* number of interrupt servicing video functions */
#define INTERRUPT_NO_VIDEO_SERVICES 0x10
typedef struct { /* used for passing parameters, fetching results and preserving values */
/**
* @brief Used for passing and retrieving registers content to/from real mode
* interrupt call.
*/
typedef struct {
uint32_t reg_eax;
uint32_t reg_ebx;
uint32_t reg_ecx;
@@ -50,6 +54,8 @@ typedef struct { /* used for passing parameters, fetching results and preserving
} RTEMS_COMPILER_PACKED_ATTRIBUTE i386_realmode_interrupt_registers;
/**
* @brief Returns buffer and its size usable with real mode interrupt call.
*
* Provides position to real mode buffer. It is buffer
* accessible from real mode context - it is located below
* address ~0x100000 in order for it to be accessible
@@ -57,22 +63,25 @@ typedef struct { /* used for passing parameters, fetching results and preserving
* and through this get bigger portion of an information to/from
* interrupt service routine than just by using register.
*
* @param size pointer to variable, where the size of buffer
* will be filled
* @param[out] size pointer to variable, where the size of buffer
* will be filled
* @retval pointer to buffer
*/
extern void *i386_get_default_rm_buffer(uint16_t *size);
/**
* @brief Call to real mode interrupt with specified int NO and processor
* registers.
*
* This function allows calling interrupts in real mode and to set processor
* registers as desired before interrupt call is made and to retrieve the
* registers content after call was made.
*
* @param interruptNumber interrupt number to be called
* @param ir pointer to structure containing registers to be passed to interrupt
* and to retrieve register content after call was made.
* @param[in] interrupt_number interrupt number to be called
* @param[in] ir pointer to structure containing registers to be passed to
* interrupt and to retrieve register content after call was made.
* @retval 0 call failed (GDT too small or pagin is on)
* 1 call successful
* @retval 1 call successful
*/
extern int i386_real_interrupt_call(
uint8_t interrupt_number,
+37 -28
View File
@@ -1,5 +1,7 @@
/*
* cpu.h - This file contains definitions for data structure related
* @file cpu.h
*
* This file contains definitions for data structure related
* to Intel system programming. More information can be found
* on Intel site and more precisely in the following book :
*
@@ -241,7 +243,9 @@ extern int i386_get_idt_config (rtems_raw_irq_global_settings** config);
* See page 11.12 Figure 11-8.
*
*/
/**
* @brief describes one entry of Global/Local Descriptor Table
*/
typedef struct {
unsigned int limit_15_0 : 16;
unsigned int base_address_15_0 : 16;
@@ -272,34 +276,36 @@ 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
* @brief Allows to set a GDT entry.
*
* Puts global descriptor \p sd to the global descriptor table on index
* \p segment_selector_index
*
* @param[in] segment_selector_index index to GDT entry
* @param[in] sd structure to be coppied to given \p segment_selector in GDT
* @retval 0 FAILED out of GDT range or index is 0, which is not valid
* index in GDT
* 1 SUCCESS
* @retval 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
* @brief fills \p sd with provided \p base in appropriate fields of \p sd
*
* @param base 32-bit address to be set as descriptor's base
* @param sd descriptor being filled with @base
* @param[in] base 32-bit address to be set as descriptor's base
* @param[out] sd descriptor being filled with \p 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
* @brief fills \p sd with provided \p limit in appropriate fields of \p sd
*
* @param limit 32-bit value representing number of limit bytes
* @param sd descriptor being filled with @limit
* sets granularity bit if necessary
*
* @param[in] limit 32-bit value representing number of limit bytes
* @param[out] sd descriptor being filled with \p limit
*/
extern void i386_fill_segment_desc_limit (uint32_t limit,
segment_descriptors* sd);
@@ -312,37 +318,40 @@ extern uint32_t i386_set_gdt_entry (uint16_t segment_selector,
uint32_t limit);
/**
* C callable function returns next empty descriptor in GDT.
* @brief Returns next empty descriptor in GDT.
*
* Number of descriptors that can be returned depends on \a GDT_SIZE
*
* @retval 0 FAILED GDT is full
* <1;65535> segment_selector number as index to GDT
* @retval <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
* @brief Copies GDT entry at index \p segment_selector to structure
* pointed to by \p struct_to_fill
*
* @param segment_selector index to GDT table for specifying descriptor to copy
* @param[in] segment_selector index to GDT table specifying descriptor to copy
* @param[out] struct_to_fill pointer to memory where will be descriptor coppied
* @retval 0 FAILED segment_selector out of GDT range
* <1;65535> retrieved segment_selector
* @retval <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
* @brief Returns pointer to GDT table at index given by \p segment_selector
*
* @param segment_selector index to GDT table for specifying descriptor to get
* @param[in] sgmnt_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
* @retval pointer to GDT table at \p segment_selector
*/
extern segment_descriptors* i386_get_gdt_entry (uint16_t sgmnt_selector);
/**
* Extracts base address from GDT entry pointed to by @gdt_entry
* @brief Extracts base address from GDT entry pointed to by \p gdt_entry
*
* @param gdt_entry pointer to entry from which base should be retrieved
* @param[in] 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)
@@ -353,9 +362,9 @@ RTEMS_INLINE_ROUTINE void* i386_base_gdt_entry (segment_descriptors* gdt_entry)
}
/**
* Extracts limit in bytes from GDT entry pointed to by @gdt_entry
* @brief Extracts limit in bytes from GDT entry pointed to by \p gdt_entry
*
* @param gdt_entry pointer to entry from which limit should be retrieved
* @param[in] 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);
+2 -2
View File
@@ -334,9 +334,9 @@ SYM (i386_Physical_to_logical):
* uint16_t *offset
* );
*
* Fills segment:offest realmode pointer counted from thirty-two bit physical
* Fills segment:offest real mode pointer counted from thirty-two bit physical
* address.
* Returns 0 if unconvertible, 1 if successfuly converted.
* Returns 0 if inconvertible, 1 if successfuly converted.
*/
.set PHYS_PTR_ARG, 4
+24 -15
View File
@@ -185,10 +185,14 @@ void *i386_Physical_to_logical(
void *address
);
/*
* i386_Real_to_physical
/**
* @brief Converts real mode pointer {segment, offset} to physical address.
*
* Converts real mode pointer {segment, offset} to physical address.
* i386_Real_to_physical
*
* @param[in] segment used with \p offset to compute physical address
* @param[in] offset used with \p segment to compute physical address
* @retval physical address
*/
RTEMS_INLINE_ROUTINE void *i386_Real_to_physical(
uint16_t segment,
@@ -197,19 +201,24 @@ RTEMS_INLINE_ROUTINE void *i386_Real_to_physical(
return (void *)(((uint32_t)segment<<4)+offset);
}
/*
* i386_Physical_to_real
* Retreives real mode pointer elements {segmnet, offset} from physical address
* Function returns the highest segment (base) address possible.
* Example: input address - 0x4B3A2
* output segment - 0x4B3A
* offset - 0x2
* input address - 0x10F12E
* output segment - 0xFFFF
* offset - 0xF13E
/**
* @brief Retreives real mode pointer elements {segmnet, offset} from
* physical address.
*
* return 0 address not convertible, must be less than 0x10FFEF
* 1 segment and offset extracted
* i386_Physical_to_real
* Function returns the highest segment (base) address possible.
* Example: input address - 0x4B3A2
* output segment - 0x4B3A
* offset - 0x2
* input address - 0x10F12E
* output segment - 0xFFFF
* offset - 0xF13E
*
* @param[in] address address to be converted, must be less than 0x10FFEF
* @param[out] segment segment computed from \p address
* @param[out] offset offset computed from \p address
* @retval 0 address not convertible
* @retval 1 segment and offset extracted
*/
int i386_Physical_to_real(
void *address,