summaryrefslogtreecommitdiffstats
path: root/src/arch/x86/transitions
diff options
context:
space:
mode:
authorSimon Rettberg2026-01-28 12:53:53 +0100
committerSimon Rettberg2026-01-28 12:53:53 +0100
commit8e82785c584dc13e20f9229decb95bd17bbe9cd1 (patch)
treea8b359e59196be5b2e3862bed189107f4bc9975f /src/arch/x86/transitions
parentMerge branch 'master' into openslx (diff)
parent[prefix] Make unlzma.S compatible with 386 class CPUs (diff)
downloadipxe-openslx.tar.gz
ipxe-openslx.tar.xz
ipxe-openslx.zip
Merge branch 'master' into openslxopenslx
Diffstat (limited to 'src/arch/x86/transitions')
-rw-r--r--src/arch/x86/transitions/librm_mgmt.c56
1 files changed, 24 insertions, 32 deletions
diff --git a/src/arch/x86/transitions/librm_mgmt.c b/src/arch/x86/transitions/librm_mgmt.c
index b3820589c..89feec96a 100644
--- a/src/arch/x86/transitions/librm_mgmt.c
+++ b/src/arch/x86/transitions/librm_mgmt.c
@@ -58,35 +58,36 @@ static struct profiler timer_irq_profiler __profiler = { .name = "irq.timer" };
static struct profiler other_irq_profiler __profiler = { .name = "irq.other" };
/**
- * Allocate space on the real-mode stack and copy data there from a
- * user buffer
+ * Allocate space on the real-mode stack and copy data there
*
- * @v data User buffer
+ * @v data Stack data
* @v size Size of stack data
* @ret sp New value of real-mode stack pointer
*/
-uint16_t copy_user_to_rm_stack ( userptr_t data, size_t size ) {
- userptr_t rm_stack;
+uint16_t copy_to_rm_stack ( const void *data, size_t size ) {
+ void *rm_stack;
+
rm_sp -= size;
- rm_stack = real_to_user ( rm_ss, rm_sp );
- memcpy_user ( rm_stack, 0, data, 0, size );
+ rm_stack = real_to_virt ( rm_ss, rm_sp );
+ memcpy ( rm_stack, data, size );
return rm_sp;
-};
+}
/**
- * Deallocate space on the real-mode stack, optionally copying back
- * data to a user buffer.
+ * Deallocate space on the real-mode stack, optionally copying back data
*
- * @v data User buffer
+ * @v data Stack data buffer, or NULL
* @v size Size of stack data
*/
-void remove_user_from_rm_stack ( userptr_t data, size_t size ) {
+void remove_from_rm_stack ( void *data, size_t size ) {
+ const void *rm_stack;
+
if ( data ) {
- userptr_t rm_stack = real_to_user ( rm_ss, rm_sp );
- memcpy_user ( rm_stack, 0, data, 0, size );
+ rm_stack = real_to_virt ( rm_ss, rm_sp );
+ memcpy ( data, rm_stack, size );
}
rm_sp += size;
-};
+}
/**
* Set interrupt vector
@@ -302,17 +303,14 @@ static void * ioremap_pages ( unsigned long bus_addr, size_t len ) {
/* Calculate number of pages required */
count = ( ( offset + len + IO_PAGE_SIZE - 1 ) / IO_PAGE_SIZE );
assert ( count != 0 );
- assert ( count < ( sizeof ( io_pages.page ) /
- sizeof ( io_pages.page[0] ) ) );
+ assert ( count <= IO_PAGE_COUNT );
/* Round up number of pages to a power of two */
- stride = ( 1 << ( fls ( count ) - 1 ) );
+ stride = ( 1 << fls ( count - 1 ) );
assert ( count <= stride );
/* Allocate pages */
- for ( first = 0 ; first < ( sizeof ( io_pages.page ) /
- sizeof ( io_pages.page[0] ) ) ;
- first += stride ) {
+ for ( first = 0 ; first < IO_PAGE_COUNT ; first += stride ) {
/* Calculate I/O address */
io_addr = ( IO_BASE + ( first * IO_PAGE_SIZE ) + offset );
@@ -365,6 +363,10 @@ static void iounmap_pages ( volatile const void *io_addr ) {
/* Calculate first page table entry */
first = ( ( io_addr - IO_BASE ) / IO_PAGE_SIZE );
+ /* Ignore unmappings outside of the I/O range */
+ if ( first >= IO_PAGE_COUNT )
+ return;
+
/* Clear page table entries */
for ( i = first ; ; i++ ) {
@@ -425,19 +427,9 @@ void setup_sipi ( unsigned int vector, uint32_t handler,
memcpy ( &sipi_regs, regs, sizeof ( sipi_regs ) );
/* Copy real-mode handler */
- copy_to_real ( ( vector << 8 ), 0, sipi, ( ( size_t ) sipi_len ) );
+ copy_to_real ( ( vector << 8 ), 0, sipi, sipi_len );
}
-PROVIDE_UACCESS_INLINE ( librm, phys_to_user );
-PROVIDE_UACCESS_INLINE ( librm, user_to_phys );
-PROVIDE_UACCESS_INLINE ( librm, virt_to_user );
-PROVIDE_UACCESS_INLINE ( librm, user_to_virt );
-PROVIDE_UACCESS_INLINE ( librm, userptr_add );
-PROVIDE_UACCESS_INLINE ( librm, memcpy_user );
-PROVIDE_UACCESS_INLINE ( librm, memmove_user );
-PROVIDE_UACCESS_INLINE ( librm, memset_user );
-PROVIDE_UACCESS_INLINE ( librm, strlen_user );
-PROVIDE_UACCESS_INLINE ( librm, memchr_user );
PROVIDE_IOMAP_INLINE ( pages, io_to_bus );
PROVIDE_IOMAP ( pages, ioremap, ioremap_pages );
PROVIDE_IOMAP ( pages, iounmap, iounmap_pages );