6 static struct spinlock lock
;
8 void print(const char *s
);
10 typedef struct pstream
{
16 static void addchar(pstream_t
*p
, char c
)
25 void print_str(pstream_t
*p
, const char *s
)
31 static char digits
[16] = "0123456789abcdef";
33 void print_int(pstream_t
*ps
, long long n
, int base
)
35 char buf
[sizeof(long) * 3 + 2], *p
= buf
;
44 *p
++ = digits
[n
% base
];
54 for (i
= 0; i
< (p
- buf
) / 2; ++i
) {
67 void print_unsigned(pstream_t
*ps
, unsigned long long n
, int base
)
69 char buf
[sizeof(long) * 3 + 1], *p
= buf
;
73 *p
++ = digits
[n
% base
];
80 for (i
= 0; i
< (p
- buf
) / 2; ++i
) {
93 int vsnprintf(char *buf
, int size
, const char *fmt
, va_list va
)
123 print_int(&s
, va_arg(va
, int), 10);
126 print_int(&s
, va_arg(va
, long), 10);
129 print_int(&s
, va_arg(va
, long long), 10);
136 print_unsigned(&s
, va_arg(va
, unsigned), 16);
139 print_unsigned(&s
, va_arg(va
, unsigned long), 16);
142 print_unsigned(&s
, va_arg(va
, unsigned long long), 16);
148 print_unsigned(&s
, (unsigned long)va_arg(va
, void *), 16);
151 print_str(&s
, va_arg(va
, const char *));
164 int snprintf(char *buf
, int size
, const char *fmt
, ...)
170 r
= vsnprintf(buf
, size
, fmt
, va
);
175 void print_serial(const char *buf
)
177 unsigned long len
= strlen(buf
);
179 asm volatile ("rep/outsb" : "+S"(buf
), "+c"(len
) : "d"(0xf1));
182 int printf(const char *fmt
, ...)
189 r
= vsnprintf(buf
, sizeof buf
, fmt
, va
);