Make it possible to call the COMBOOT API from in-kernel PM code,
simply by setting up the COMBOOT API earlier and only tearing it down
during final shutdown.
WARNING: the COMBOOT API is quite possibly probably not reentrant; I
haven't checked it...
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
.no_vmware:
%endif
+ call comboot_cleanup_api
+
popad
ret
jmp comboot_exit
;
-; Set up the COMBOOT API interrupt vectors. This is also used
-; by the COM32 code.
+; Set up the COMBOOT API interrupt vectors. This is now done at
+; initialization time.
;
comboot_setup_api:
mov di,DOSErrTramp ; Error trampolines
loop .loop2
ret
+;
+; Restore the original state of the COMBOOT API vectors
+;
+comboot_cleanup_api:
+ pusha
+ mov si,DOSSaveVectors
+ mov di,4*20h
+ mov cx,20h
+ rep movsd ; Restore DOS-range vectors
+ popa
+ ret
+
section .bss16
alignb 4
DOSSaveVectors resd 32
pop bx ; Return address
RESET_STACK_AND_SEGS SI ; Contains cld
call adjust_screen ; The COMBOOT program might have changed the screen
- pusha
- mov si,DOSSaveVectors
- mov di,4*20h
- mov cx,20h
- rep movsd ; Restore DOS-range vectors
- popa
jcxz .nomsg
mov si,KernelCName
call writestr
void myputchar(int c)
{
-#if 1
static com32sys_t ireg;
+ static uint16_t *vram = 0xb8000;
- ireg.eax.b[1] = 0x0e;
- ireg.eax.b[0] = c;
- ireg.ebx.w[0] = 0x0007;
- core_intcall(0x10, &ireg, NULL);
-#else
- static uint16_t *vram = (void *)0xb8000;
+ ireg.eax.b[1] = 0x02;
+ ireg.edx.b[0] = c;
+ core_intcall(0x21, &ireg, NULL);
- *vram++ = (uint8_t)c + 0x1f00;
-#endif
+ *vram++ = c + 0x1f00;
}
void myputs(const char *str)
mov cx,__uibss_dwords
rep stosd
- ; Now set up screen parameters
- call adjust_screen
-
;
; Initialize configuration information
;
add ax,PKTBUF_SIZE
loop .setbufptr
%endif
- section .text16 ; This is an inline file...
+
+;
+; Set up the COMBOOT APIs
+;
+ call comboot_setup_api
+
+;
+; Now set up screen parameters
+;
+ call adjust_screen