VirtualBox

source: vbox/trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-cmn-PrintStrN.asm@ 60291

Last change on this file since 60291 was 60291, checked in by vboxsync, 9 years ago

bs3kit: A bunch of changes to be able to test the effects of a GDT page being read-only or not-present.

  • Extended the GDT so we get a whole page to play paging tricks with.
  • Added syscall for restoring a context from ring-0 so we can safely get out of bogus test context that aren't in ring-0 (non-standard CS value causing trouble here). Implemented the string print syscall since the restore syscall forced me to sort out pointers.
  • Changed most string printers to do more than one char at a time (usually a line) to save context switches (screen priting is done via INT 10h in real mode).
  • Test the CS access bit handling during INT XXh.
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 5.2 KB
Line 
1; $Id: bs3-cmn-PrintStrN.asm 60291 2016-04-01 20:51:29Z vboxsync $
2;; @file
3; BS3Kit - Bs3PrintStrN.
4;
5
6;
7; Copyright (C) 2007-2016 Oracle Corporation
8;
9; This file is part of VirtualBox Open Source Edition (OSE), as
10; available from http://www.virtualbox.org. This file is free software;
11; you can redistribute it and/or modify it under the terms of the GNU
12; General Public License (GPL) as published by the Free Software
13; Foundation, in version 2 as it comes in the "COPYING" file of the
14; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16;
17; The contents of this file may alternatively be used under the terms
18; of the Common Development and Distribution License Version 1.0
19; (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20; VirtualBox OSE distribution, in which case the provisions of the
21; CDDL are applicable instead of those of the GPL.
22;
23; You may elect to license modified versions of this file under the
24; terms and conditions of either the GPL or the CDDL or both.
25;
26
27
28;*********************************************************************************************************************************
29;* Header Files *
30;*********************************************************************************************************************************
31%include "bs3kit-template-header.mac"
32
33
34;*********************************************************************************************************************************
35;* External Symbols *
36;*********************************************************************************************************************************
37%if TMPL_BITS == 16
38BS3_EXTERN_DATA16 g_bBs3CurrentMode
39%endif
40BS3_EXTERN_CMN Bs3Syscall
41
42
43TMPL_BEGIN_TEXT
44
45;;
46; @cproto BS3_DECL(void) Bs3PrintStrN_c16(const char BS3_FAR *pszString, size_t cchString);
47;
48; ASSUMES cchString < 64KB!
49;
50BS3_PROC_BEGIN_CMN Bs3PrintStrN
51 BS3_CALL_CONV_PROLOG 2
52 push xBP
53 mov xBP, xSP
54 push xAX
55 push xCX
56 push xBX
57 push xSI
58
59%if TMPL_BITS == 16
60 ; If we're in real mode or v8086 mode, call the VGA BIOS directly.
61 mov bl, [g_bBs3CurrentMode]
62 cmp bl, BS3_MODE_RM
63 je .do_bios_call
64 %if 0
65 test bl, BS3_MODE_CODE_V86
66 jz .do_system_call
67 %else
68 jmp .do_system_call
69 %endif
70
71 ;
72 ; We can do the work right here.
73 ;
74.do_bios_call:
75 push ds
76 lds si, [xBP + xCB*2] ; DS:SI -> string.
77 cld
78 mov cx, [xBP + xCB*2 + sCB] ; Use CX for counting down.
79 call Bs3PrintStrN_c16_CX_Bytes_At_DS_SI
80 pop ds
81 jmp .return
82%endif
83
84
85 ;
86 ; Need to do system call(s).
87 ; String goes into CX:xSI, count into DX.
88 ;
89 ; We must ensure the string is real-mode addressable first, if not we
90 ; must do it char-by-char.
91 ;
92.do_system_call:
93%if TMPL_BITS == 16
94 mov cx, [xBP + xCB*2 + 2]
95%else
96 mov cx, ds
97%endif
98 mov xSI, [xBP + xCB*2]
99 mov dx, [xBP + xCB*2 + sCB]
100%if TMPL_BITS == 16
101
102%else
103 cmp xSI, _1M
104 jae .char_by_char
105%endif
106 mov ax, BS3_SYSCALL_PRINT_STR
107 call Bs3Syscall ; (no BS3_CALL!)
108
109.return:
110 pop xSI
111 pop xBX
112 pop xCX
113 pop xAX
114 leave
115 BS3_CALL_CONV_EPILOG 2
116 ret
117
118 ;
119 ; Doesn't look like it's real-mode addressable. So, char-by-char.
120 ;
121.char_by_char:
122%if TMPL_BITS == 16
123 push es
124 mov es, cx
125%endif
126 cld
127 test dx, dx
128 jz .char_by_char_return
129.char_by_char_loop:
130 mov ax, BS3_SYSCALL_PRINT_CHR
131 mov cl, [BS3_ONLY_16BIT(es:) xSI]
132 call Bs3Syscall ; (no BS3_CALL!)
133 inc xSI
134 dec xDX
135 jnz .char_by_char_loop
136.char_by_char_return:
137%if TMPL_BITS == 16
138 pop es
139%endif
140 jmp .return
141
142BS3_PROC_END_CMN Bs3PrintStrN
143
144
145%if TMPL_BITS == 16
146;
147; This code is shared with the system handler.
148;
149; @param CX Number of byte sto print.
150; @param DS:SI The string to print
151; @uses AX, BX, CX, SI
152;
153BS3_PROC_BEGIN Bs3PrintStrN_c16_CX_Bytes_At_DS_SI
154 ; Check if CX is zero first.
155 test cx, cx
156 jz .bios_loop_done
157
158 ; The loop, processing the string char-by-char.
159.bios_loop:
160 mov bx, 0ff00h
161 lodsb ; al = next char
162 cmp al, 0ah ; \n
163 je .bios_loop_newline
164%ifdef BS3_STRICT
165 test al, al
166 jnz .not_zero
167 hlt
168.not_zero:
169%endif
170 mov ah, 0eh
171.bios_loop_int10h:
172 int 10h
173 loop .bios_loop
174.bios_loop_done:
175 ret
176
177.bios_loop_newline:
178 mov ax, 0e0dh ; cmd + '\r'.
179 int 10h
180 mov ax, 0e0ah ; cmd + '\n'.
181 mov bx, 0ff00h
182 jmp .bios_loop_int10h
183BS3_PROC_END Bs3PrintStrN_c16_CX_Bytes_At_DS_SI
184%endif
185
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette