From: H. Peter Anvin Date: Fri, 15 May 2009 03:17:43 +0000 (-0700) Subject: core: make the COMBOOT API available to in-kernel PM code X-Git-Tag: syslinux-4.00-pre1~127 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=4519c2a7adde441ef01bdd66864269419d703af8;p=profile%2Fivi%2Fsyslinux.git core: make the COMBOOT API available to in-kernel PM code 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 --- diff --git a/core/cleanup.inc b/core/cleanup.inc index 9166f01..7db5593 100644 --- a/core/cleanup.inc +++ b/core/cleanup.inc @@ -50,5 +50,7 @@ cleanup_hardware: .no_vmware: %endif + call comboot_cleanup_api + popad ret diff --git a/core/comboot.inc b/core/comboot.inc index 7d9efba..b1048bb 100644 --- a/core/comboot.inc +++ b/core/comboot.inc @@ -148,8 +148,8 @@ comboot_return: cli ; Don't trust anyone 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 @@ -178,6 +178,18 @@ comboot_setup_api: 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 @@ -296,12 +308,6 @@ comboot_exit_msg: 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 diff --git a/core/hello.c b/core/hello.c index c4b2803..6c12c73 100644 --- a/core/hello.c +++ b/core/hello.c @@ -3,18 +3,14 @@ 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) diff --git a/core/init.inc b/core/init.inc index 90c607e..7f65ffa 100644 --- a/core/init.inc +++ b/core/init.inc @@ -43,9 +43,6 @@ common_init: mov cx,__uibss_dwords rep stosd - ; Now set up screen parameters - call adjust_screen - ; ; Initialize configuration information ; @@ -63,4 +60,13 @@ common_init: 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