|  | // Copyright Microsoft and CHERIoT Contributors. | 
|  | // SPDX-License-Identifier: MIT | 
|  |  | 
|  | #ifndef __STDIO_H__ | 
|  | #define __STDIO_H__ | 
|  |  | 
|  | #include <cdefs.h> | 
|  | #include <compartment-macros.h> | 
|  | #include <stdarg.h> | 
|  | #include <stddef.h> | 
|  |  | 
|  | #define PRT_MAX_SIZE (0x80) | 
|  | #define EOF (-1) | 
|  |  | 
|  | __BEGIN_DECLS | 
|  |  | 
|  | /** | 
|  | * This is a very simple implementation of a subset of stdio and supports only | 
|  | * UARTs.  The Uart type is often a C++ template type and so we can't forward | 
|  | * declare it in a C header and so we use a volatile void* instead, which can | 
|  | * be cast to the correct type inside the library. | 
|  | */ | 
|  | typedef volatile void FILE; | 
|  |  | 
|  | #if DEVICE_EXISTS(uart0) | 
|  | #	define stdout MMIO_CAPABILITY(void, uart0) | 
|  | #	define stdin MMIO_CAPABILITY(void, uart0) | 
|  | #elif DEVICE_EXISTS(uart) | 
|  | #	define stdout MMIO_CAPABILITY(void, uart) | 
|  | #	define stdin MMIO_CAPABILITY(void uart) | 
|  | #endif | 
|  |  | 
|  | #if DEVICE_EXISTS(uart1) | 
|  | #	define stderr MMIO_CAPABILITY(void, uart1) | 
|  | #elif defined(stdout) | 
|  | #	define stderr stdout | 
|  | #endif | 
|  |  | 
|  | int __cheri_libcall vfprintf(FILE *stream, const char *fmt, va_list ap); | 
|  |  | 
|  | static inline int fprintf(FILE *stream, const char *format, ...) | 
|  | { | 
|  | va_list ap; | 
|  |  | 
|  | va_start(ap, format); | 
|  | int ret = vfprintf(stream, format, ap); | 
|  | va_end(ap); | 
|  | return ret; | 
|  | } | 
|  |  | 
|  | #ifdef stdout | 
|  | static inline int printf(const char *format, ...) | 
|  | { | 
|  | va_list ap; | 
|  |  | 
|  | va_start(ap, format); | 
|  | int ret = vfprintf(stdout, format, ap); | 
|  | va_end(ap); | 
|  | return ret; | 
|  | } | 
|  | #endif | 
|  |  | 
|  | int __cheri_libcall snprintf(char *str, size_t size, const char *format, ...); | 
|  | int __cheri_libcall vsnprintf(const char *str, | 
|  | size_t      size, | 
|  | const char *format, | 
|  | va_list     ap); | 
|  | __END_DECLS | 
|  |  | 
|  | #endif /* !__STDIO_H__ */ |