summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@zytor.com>2009-05-14 20:17:43 -0700
committerH. Peter Anvin <hpa@zytor.com>2009-05-14 20:17:43 -0700
commit4519c2a7adde441ef01bdd66864269419d703af8 (patch)
treedc780c8e0fb610704b5417edf13e0c9a88f8a250
parent1fef0a581bf584223ad87bdaf729ccb986abb49f (diff)
downloadsyslinux-4519c2a7adde441ef01bdd66864269419d703af8.tar.gz
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 <hpa@zytor.com>
-rw-r--r--core/cleanup.inc2
-rw-r--r--core/comboot.inc22
-rw-r--r--core/hello.c14
-rw-r--r--core/init.inc14
4 files changed, 31 insertions, 21 deletions
diff --git a/core/cleanup.inc b/core/cleanup.inc
index 9166f011..7db5593d 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 7d9efba2..b1048bb5 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 c4b28032..6c12c738 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 90c607ee..7f65ffa6 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