From a46d6637fa6056ad5c90959da27fb641cafc6c85 Mon Sep 17 00:00:00 2001 From: Bart Oldeman Date: Sat, 18 Jul 2009 20:48:44 +0000 Subject: [PATCH] Use near pointers for printf()s where possible. Problematic is only the case where SS!=DS (which happens sometimes in resident code), in which case va_list/va_arg need to use FAR pointers. DS!=DGROUP never works, so I corrected that for NLS_DEBUG, by setting DS in int2f.asm. git-svn-id: https://svn.code.sf.net/p/freedos/svn/kernel/trunk@1491 6ac86273-5f31-0410-b378-82cca8765d1b --- hdr/debug.h | 4 ++-- kernel/init-mod.h | 4 ++-- kernel/int2f.asm | 1 + kernel/nls.c | 2 +- kernel/prf.c | 46 ++++++++++++++++++++++++++++++++++------------ kernel/proto.h | 4 ++-- sys/fdkrncfg.c | 4 ++-- sys/sys.c | 4 ++-- 8 files changed, 46 insertions(+), 23 deletions(-) diff --git a/hdr/debug.h b/hdr/debug.h index 4d063fa..4869592 100644 --- a/hdr/debug.h +++ b/hdr/debug.h @@ -136,9 +136,9 @@ #endif #ifdef DEBUG_NEED_PRINTF -int VA_CDECL printf(CONST char FAR * fmt, ...); +int VA_CDECL printf(CONST char * fmt, ...); #ifdef DEBUG_PRINT_COMPORT -int VA_CDECL dbgc_printf(CONST char FAR * fmt, ...); +int VA_CDECL dbgc_printf(CONST char * fmt, ...); #endif #endif diff --git a/kernel/init-mod.h b/kernel/init-mod.h index a7a865d..3007569 100644 --- a/kernel/init-mod.h +++ b/kernel/init-mod.h @@ -228,8 +228,8 @@ BOOL init_device(struct dhdr FAR * dhp, char * cmdLine, VOID init_fatal(BYTE * err_msg); /* prf.c */ -int VA_CDECL init_printf(CONST char FAR * fmt, ...); -int VA_CDECL init_sprintf(char * buff, CONST char FAR * fmt, ...); +int VA_CDECL init_printf(CONST char * fmt, ...); +int VA_CDECL init_sprintf(char * buff, CONST char * fmt, ...); /* procsupt.asm */ VOID ASMCFUNC FAR got_cbreak(void); diff --git a/kernel/int2f.asm b/kernel/int2f.asm index b84c972..69f8111 100644 --- a/kernel/int2f.asm +++ b/kernel/int2f.asm @@ -101,6 +101,7 @@ Int2f?14: ;; MUX-14 -- NLSFUNC API ;; all functions are passed to syscall_MUX14 push bp ; Preserve BP later on PUSH$ALL + mov ds, [cs:_DGROUP_] call _syscall_MUX14 pop bp ; Discard incoming AX push ax ; Correct stack for POP$ALL diff --git a/kernel/nls.c b/kernel/nls.c index e7964df..b9a5309 100644 --- a/kernel/nls.c +++ b/kernel/nls.c @@ -103,7 +103,7 @@ STATIC long muxGo(int subfct, UWORD bp, UWORD cp, UWORD cntry, UWORD bufsize, log(("NLS: muxGo(): subfct=%x, cntry=%u, cp=%u, ES:DI=%p\n", subfct, cntry, cp, buf)); ret = call_nls(bp, buf, subfct, cp, cntry, bufsize); - log(("NLS: muxGo(): return value = %d\n", ret)); + log(("NLS: muxGo(): return value = %lx\n", ret)); return ret; } diff --git a/kernel/prf.c b/kernel/prf.c index 6adf072..fe585be 100644 --- a/kernel/prf.c +++ b/kernel/prf.c @@ -118,19 +118,26 @@ void put_console(int c) #if defined(DEBUG_NEED_PRINTF) || defined(FORSYS) || defined(_INIT) || defined(TEST) +#if defined(DEBUG_NEED_PRINTF) && !defined(_INIT) && !defined(FORSYS) +/* need to use FAR pointers for resident DEBUG printf()s where SS != DS */ +#define SSFAR FAR +#else +#define SSFAR +#endif + #ifndef FORSYS /* copied from bcc (Bruce's C compiler) stdarg.h */ -typedef char FAR *va_list; +typedef char SSFAR *va_list; #define va_start(arg, last) ((arg) = (va_list) (&(last)+1)) -#define va_arg(arg, type) (((type FAR *)(arg+=sizeof(type)))[-1]) +#define va_arg(arg, type) (((type SSFAR *)(arg+=sizeof(type)))[-1]) #define va_end(arg) #endif -static BYTE FAR *charp = 0; +static BYTE SSFAR *charp = 0; STATIC VOID handle_char(COUNT); -STATIC void ltob(LONG, BYTE *, COUNT); -STATIC void do_printf(const char FAR *, REG va_list); +STATIC void ltob(LONG, BYTE SSFAR *, COUNT); +STATIC void do_printf(const char *, REG va_list); /* special handler to switch between sprintf and printf */ STATIC VOID handle_char(COUNT c) @@ -142,10 +149,10 @@ STATIC VOID handle_char(COUNT c) } /* ltob -- convert an long integer to a string in any base (2-16) */ -STATIC void ltob(LONG n, BYTE * s, COUNT base) +STATIC void ltob(LONG n, BYTE SSFAR * s, COUNT base) { ULONG u; - BYTE *p, *q; + BYTE SSFAR *p, SSFAR *q; int c; u = n; @@ -182,7 +189,7 @@ STATIC void ltob(LONG n, BYTE * s, COUNT base) #define LONGARG 4 /* printf -- short version of printf to conserve space */ -int VA_CDECL printf(CONST char FAR *fmt, ...) +int VA_CDECL printf(CONST char *fmt, ...) { va_list arg; va_start(arg, fmt); @@ -191,7 +198,22 @@ int VA_CDECL printf(CONST char FAR *fmt, ...) return 0; } -int VA_CDECL sprintf(char FAR * buff, CONST char FAR * fmt, ...) +#if defined(DEBUG_NEED_PRINTF) && !defined(_INIT) && !defined(FORSYS) +STATIC int VA_CDECL fsprintf(char FAR * buff, CONST char * fmt, ...) +{ + va_list arg; + + va_start(arg, fmt); + charp = buff; + do_printf(fmt, arg); + handle_char('\0'); + return 0; +} +#else +#define fsprintf sprintf +#endif + +int VA_CDECL sprintf(char * buff, CONST char * fmt, ...) { va_list arg; @@ -202,7 +224,7 @@ int VA_CDECL sprintf(char FAR * buff, CONST char FAR * fmt, ...) return 0; } -STATIC void do_printf(CONST BYTE FAR * fmt, va_list arg) +STATIC void do_printf(CONST BYTE * fmt, va_list arg) { int base; BYTE s[11], FAR * p; @@ -261,8 +283,8 @@ STATIC void do_printf(CONST BYTE FAR * fmt, va_list arg) case 'p': { UWORD w0 = va_arg(arg, unsigned); - char FAR*tmp = charp; - sprintf(s, "%04x:%04x", va_arg(arg, unsigned), w0); + char SSFAR *tmp = charp; + fsprintf(s, "%04x:%04x", va_arg(arg, unsigned), w0); p = s; charp = tmp; break; diff --git a/kernel/proto.h b/kernel/proto.h index a3f1be8..bdeb16a 100644 --- a/kernel/proto.h +++ b/kernel/proto.h @@ -280,8 +280,8 @@ UWORD ASMCFUNC syscall_MUX14(DIRECT_IREGS); /* prf.c */ #ifdef DEBUG -int VA_CDECL printf(CONST char FAR * fmt, ...); -int VA_CDECL sprintf(char FAR * buff, CONST char FAR * fmt, ...); +int VA_CDECL printf(CONST char * fmt, ...); +int VA_CDECL sprintf(char * buff, CONST char * fmt, ...); #endif VOID hexd(char *title, VOID FAR * p, COUNT numBytes); void put_unsigned(unsigned n, int base, int width); diff --git a/sys/fdkrncfg.c b/sys/fdkrncfg.c index 50ccd94..4fd9051 100644 --- a/sys/fdkrncfg.c +++ b/sys/fdkrncfg.c @@ -28,8 +28,8 @@ char KERNEL[] = "KERNEL.SYS"; * #including to make executable MUCH smaller * using [s]printf from prf.c! */ -extern int VA_CDECL printf(CONST char FAR * fmt, ...); -extern int VA_CDECL sprintf(char FAR * buff, CONST char FAR * fmt, ...); +extern int VA_CDECL printf(CONST char * fmt, ...); +extern int VA_CDECL sprintf(char * buff, CONST char * fmt, ...); #ifdef __WATCOMC__ unsigned _dos_close(int handle); diff --git a/sys/sys.c b/sys/sys.c index e1653b8..bce9f26 100644 --- a/sys/sys.c +++ b/sys/sys.c @@ -75,8 +75,8 @@ * #including to make executable MUCH smaller * using [s]printf from prf.c! */ -extern int VA_CDECL printf(CONST char FAR * fmt, ...); -extern int VA_CDECL sprintf(char FAR * buff, CONST char FAR * fmt, ...); +extern int VA_CDECL printf(CONST char * fmt, ...); +extern int VA_CDECL sprintf(char * buff, CONST char * fmt, ...); #include "fat12com.h" #include "fat16com.h"