f95dde48adb7cbce7f122cf4eee67816eafcf305
8 volatile uint64_t magic_mem
[8] = {0};
12 mtpcr(PCR_TOHOST
, (long)magic_mem
);
16 void printstr(const char* s
)
18 volatile uint64_t magic_mem
[8] = {0};
21 magic_mem
[2] = (unsigned long)s
;
22 magic_mem
[3] = strlen(s
);
24 mtpcr(PCR_TOHOST
, (long)magic_mem
);
25 while(mtpcr(PCR_FROMHOST
, 0) == 0);
30 #define buffered_putch_bufsize 64
31 static char buf
[buffered_putch_bufsize
];
32 static int buflen
= 0;
37 if(ch
== -1 || buflen
== buffered_putch_bufsize
)
39 volatile uint64_t magic_mem
[8] = {0};
42 magic_mem
[2] = (long)buf
;
43 magic_mem
[3] = buflen
;
45 mtpcr(PCR_TOHOST
, (long)magic_mem
);
46 while(mtpcr(PCR_FROMHOST
, 0) == 0);
54 void printhex(uint64_t x
)
58 for (i
= 0; i
< 16; i
++)
60 str
[15-i
] = (x
& 0xF) + ((x
& 0xF) < 10 ? '0' : 'a'-10);
68 static void printnum(void (*putch
)(int, void**), void **putdat
,
69 unsigned long long num
, unsigned base
, int width
, int padc
)
72 printnum(putch
, putdat
, num
/ base
, base
, width
- 1, padc
);
73 else while (--width
> 0)
76 putch("0123456789abcdef"[num
% base
], putdat
);
79 static unsigned long long getuint(va_list *ap
, int lflag
)
82 return va_arg(*ap
, unsigned long long);
84 return va_arg(*ap
, unsigned long);
86 return va_arg(*ap
, unsigned int);
89 static long long getint(va_list *ap
, int lflag
)
92 return va_arg(*ap
, long long);
94 return va_arg(*ap
, long);
96 return va_arg(*ap
, int);
99 void vprintfmt(void (*putch
)(int, void**), void **putdat
, const char *fmt
, va_list ap
)
101 register const char* p
;
102 const char* last_fmt
;
103 register int ch
, err
;
104 unsigned long long num
;
105 int base
, lflag
, width
, precision
, altflag
;
109 while ((ch
= *(unsigned char *) fmt
) != '%') {
117 // Process a %-escape sequence
125 switch (ch
= *(unsigned char *) fmt
++) {
127 // flag to pad on the right
132 // flag to pad with 0's instead of spaces
147 for (precision
= 0; ; ++fmt
) {
148 precision
= precision
* 10 + ch
- '0';
150 if (ch
< '0' || ch
> '9')
153 goto process_precision
;
156 precision
= va_arg(ap
, int);
157 goto process_precision
;
170 width
= precision
, precision
= -1;
173 // long flag (doubled for long long)
180 putch(va_arg(ap
, int), putdat
);
185 if ((p
= va_arg(ap
, char *)) == NULL
)
187 if (width
> 0 && padc
!= '-')
188 for (width
-= strnlen(p
, precision
); width
> 0; width
--)
190 for (; (ch
= *p
) != '\0' && (precision
< 0 || --precision
>= 0); width
--) {
191 if (altflag
&& (ch
< ' ' || ch
> '~'))
197 for (; width
> 0; width
--)
203 num
= getint(&ap
, lflag
);
204 if ((long long) num
< 0) {
206 num
= -(long long) num
;
213 num
= getuint(&ap
, lflag
);
219 // should do something with padding so it's always 3 octits
220 num
= getuint(&ap
, lflag
);
228 num
= (unsigned long long)
229 (uintptr_t) va_arg(ap
, void *);
233 // (unsigned) hexadecimal
235 num
= getuint(&ap
, lflag
);
238 printnum(putch
, putdat
, num
, base
, width
, padc
);
241 // escaped '%' character
246 // unrecognized escape sequence - just print it literally
255 int printf(const char* fmt
, ...)
260 vprintfmt((void*)putchar
, 0, fmt
, ap
);
264 return 0; // incorrect return value, but who cares, anyway?