34 #define com32_regs __use_data16 ( com32_regs ) 37 #define com32_int_vector __use_data16 ( com32_int_vector ) 40 #define com32_farcall_proc __use_data16 ( com32_farcall_proc ) 66 "movl (com32_regs + 40), %%eax\n\t" 67 "andl $0x200cd7, %%eax\n\t" 68 "movl %%eax, (com32_regs + 40)\n\t" 70 "movw %%sp, %%ss:(com32_saved_sp)\n\t" 71 "movw $com32_regs, %%sp\n\t" 78 "movw %%ss:(com32_saved_sp), %%sp\n\t" 81 "movb %%ss:(com32_int_vector), %%al\n\t" 82 "movb %%al, %%cs:(com32_intcall_instr + 1)\n\t" 89 "com32_intcall_instr:\n\t" 93 "movw %%sp, %%ss:(com32_saved_sp)\n\t" 94 "movw $(com32_regs + 44), %%sp\n\t" 101 "movw %%ss:(com32_saved_sp), %%sp\n\t" 110 if ( outregs_phys ) {
122 DBGC ( &
com32_regs,
"COM32 farcall %04x:%04x in %#08lx out %#08lx\n",
123 ( proc >> 16 ), ( proc & 0xffff ), inregs_phys, outregs_phys );
139 "movl (com32_regs + 40), %%eax\n\t" 140 "andl $0x200cd7, %%eax\n\t" 141 "movl %%eax, (com32_regs + 40)\n\t" 143 "movw %%sp, %%ss:(com32_saved_sp)\n\t" 144 "movw $com32_regs, %%sp\n\t" 151 "movw %%ss:(com32_saved_sp), %%sp\n\t" 153 "lcall *%%ss:(com32_farcall_proc)\n\t" 155 "movw %%sp, %%ss:(com32_saved_sp)\n\t" 156 "movw $(com32_regs + 44), %%sp\n\t" 163 "movw %%ss:(com32_saved_sp), %%sp\n\t" 172 if ( outregs_phys ) {
185 DBGC ( &
com32_regs,
"COM32 cfarcall %04x:%04x params %#08lx+%#zx\n",
186 ( proc >> 16 ), ( proc & 0xffff ), stack, stacksz );
192 REAL_CODE (
"lcall *%%ss:(com32_farcall_proc)\n\t" )
void __asmcall com32_farcall(uint32_t proc, physaddr_t inregs_phys, physaddr_t outregs_phys)
Farcall helper.
static com32sys_t __bss16(com32_regs)
userptr_t phys_to_user(unsigned long phys_addr)
Convert physical address to user pointer.
int __asmcall com32_cfarcall(uint32_t proc, physaddr_t stack, size_t stacksz)
CDECL farcall helper.
Access to external ("user") memory.
uint16_t copy_user_to_rm_stack(userptr_t data, size_t size)
Allocate space on the real-mode stack and copy data there from a user buffer.
#define __asmcall
Declare a function with standard calling conventions.
#define com32_farcall_proc
__asm__ __volatile__("call *%9" :"=a"(result), "=c"(discard_ecx), "=d"(discard_edx) :"d"(0), "a"(code), "b"(0), "c"(in_phys), "D"(0), "S"(out_phys), "m"(hypercall))
FILE_LICENCE(GPL2_OR_LATER)
__asm__(".section \".rodata\", \"a\", " PROGBITS "\n\t" "\nprivate_key_data:\n\t" ".size private_key_data, ( . - private_key_data )\n\t" ".equ private_key_len, ( . - private_key_data )\n\t" ".previous\n\t")
userptr_t virt_to_user(volatile const void *addr)
Convert virtual address to user pointer.
void remove_user_from_rm_stack(userptr_t data, size_t size)
Deallocate space on the real-mode stack, optionally copying back data to a user buffer.
#define REAL_CODE(asm_code_str)
void interrupt(int intr, struct interrupt_frame32 *frame32, struct interrupt_frame64 *frame64)
Interrupt handler.
void memcpy_user(userptr_t dest, off_t dest_off, userptr_t src, off_t src_off, size_t len)
Copy data between user buffers.
void __asmcall com32_intcall(uint8_t interrupt, physaddr_t inregs_phys, physaddr_t outregs_phys)
Interrupt call helper.