mirror of
https://github.com/RGBCube/serenity
synced 2025-07-24 19:47:42 +00:00
Kernel+LibC: Add a dbgputch() syscall and use it for userspace dbgprintf().
The "stddbg" stream was a cute idea but we never ended up using it in practice, so let's simplify this and implement userspace dbgprintf() on top of a simple dbgputch() syscall instead. This makes debugging LibC startup a little bit easier. :^)
This commit is contained in:
parent
be7dcca1a6
commit
3fce2fb205
6 changed files with 18 additions and 15 deletions
|
@ -2716,3 +2716,9 @@ int Process::sys$dump_backtrace()
|
||||||
dump_backtrace();
|
dump_backtrace();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int Process::sys$dbgputch(u8 ch)
|
||||||
|
{
|
||||||
|
IO::out8(0xe9, ch);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
|
@ -104,6 +104,7 @@ public:
|
||||||
void die();
|
void die();
|
||||||
void finalize();
|
void finalize();
|
||||||
|
|
||||||
|
int sys$dbgputch(u8);
|
||||||
int sys$dump_backtrace();
|
int sys$dump_backtrace();
|
||||||
int sys$gettid();
|
int sys$gettid();
|
||||||
int sys$donate(int tid);
|
int sys$donate(int tid);
|
||||||
|
|
|
@ -70,6 +70,8 @@ static u32 handle(RegisterDump& regs, u32 function, u32 arg1, u32 arg2, u32 arg3
|
||||||
case Syscall::SC_putch:
|
case Syscall::SC_putch:
|
||||||
Console::the().put_char(arg1 & 0xff);
|
Console::the().put_char(arg1 & 0xff);
|
||||||
break;
|
break;
|
||||||
|
case Syscall::SC_dbgputch:
|
||||||
|
return current->process().sys$dbgputch((u8)arg1);
|
||||||
case Syscall::SC_sleep:
|
case Syscall::SC_sleep:
|
||||||
return current->process().sys$sleep((unsigned)arg1);
|
return current->process().sys$sleep((unsigned)arg1);
|
||||||
case Syscall::SC_usleep:
|
case Syscall::SC_usleep:
|
||||||
|
|
|
@ -116,7 +116,8 @@ struct timeval;
|
||||||
__ENUMERATE_SYSCALL(fchown) \
|
__ENUMERATE_SYSCALL(fchown) \
|
||||||
__ENUMERATE_SYSCALL(halt) \
|
__ENUMERATE_SYSCALL(halt) \
|
||||||
__ENUMERATE_SYSCALL(reboot) \
|
__ENUMERATE_SYSCALL(reboot) \
|
||||||
__ENUMERATE_SYSCALL(dump_backtrace)
|
__ENUMERATE_SYSCALL(dump_backtrace) \
|
||||||
|
__ENUMERATE_SYSCALL(dbgputch)
|
||||||
|
|
||||||
namespace Syscall {
|
namespace Syscall {
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,6 @@ static FILE __default_streams[4];
|
||||||
FILE* stdin;
|
FILE* stdin;
|
||||||
FILE* stdout;
|
FILE* stdout;
|
||||||
FILE* stderr;
|
FILE* stderr;
|
||||||
FILE* stddbg;
|
|
||||||
|
|
||||||
void init_FILE(FILE& fp, int fd, int mode)
|
void init_FILE(FILE& fp, int fd, int mode)
|
||||||
{
|
{
|
||||||
|
@ -41,16 +40,9 @@ void __stdio_init()
|
||||||
stdin = &__default_streams[0];
|
stdin = &__default_streams[0];
|
||||||
stdout = &__default_streams[1];
|
stdout = &__default_streams[1];
|
||||||
stderr = &__default_streams[2];
|
stderr = &__default_streams[2];
|
||||||
stddbg = &__default_streams[3];
|
|
||||||
init_FILE(*stdin, 0, isatty(0) ? _IOLBF : _IOFBF);
|
init_FILE(*stdin, 0, isatty(0) ? _IOLBF : _IOFBF);
|
||||||
init_FILE(*stdout, 1, isatty(1) ? _IOLBF : _IOFBF);
|
init_FILE(*stdout, 1, isatty(1) ? _IOLBF : _IOFBF);
|
||||||
init_FILE(*stderr, 2, _IONBF);
|
init_FILE(*stderr, 2, _IONBF);
|
||||||
int fd = open("/dev/debuglog", O_WRONLY | O_CLOEXEC);
|
|
||||||
if (fd < 0) {
|
|
||||||
perror("open /dev/debuglog");
|
|
||||||
ASSERT_NOT_REACHED();
|
|
||||||
}
|
|
||||||
init_FILE(*stddbg, fd, _IOLBF);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int setvbuf(FILE* stream, char* buf, int mode, size_t size)
|
int setvbuf(FILE* stream, char* buf, int mode, size_t size)
|
||||||
|
@ -337,14 +329,10 @@ void rewind(FILE* stream)
|
||||||
|
|
||||||
int dbgprintf(const char* fmt, ...)
|
int dbgprintf(const char* fmt, ...)
|
||||||
{
|
{
|
||||||
// if this fails, you're printing too early.
|
|
||||||
ASSERT(stddbg);
|
|
||||||
int errno_backup = errno;
|
|
||||||
va_list ap;
|
va_list ap;
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
int ret = vfprintf(stddbg, fmt, ap);
|
int ret = printf_internal([](char*&, char ch) { dbgputch(ch); }, nullptr, fmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
errno = errno_backup;
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -495,6 +483,11 @@ int rename(const char* oldpath, const char* newpath)
|
||||||
__RETURN_WITH_ERRNO(rc, rc, -1);
|
__RETURN_WITH_ERRNO(rc, rc, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void dbgputch(char ch)
|
||||||
|
{
|
||||||
|
syscall(SC_dbgputch, ch);
|
||||||
|
}
|
||||||
|
|
||||||
char* tmpnam(char*)
|
char* tmpnam(char*)
|
||||||
{
|
{
|
||||||
ASSERT_NOT_REACHED();
|
ASSERT_NOT_REACHED();
|
||||||
|
|
|
@ -43,7 +43,6 @@ typedef struct __STDIO_FILE FILE;
|
||||||
extern FILE* stdin;
|
extern FILE* stdin;
|
||||||
extern FILE* stdout;
|
extern FILE* stdout;
|
||||||
extern FILE* stderr;
|
extern FILE* stderr;
|
||||||
extern FILE* stddbg;
|
|
||||||
|
|
||||||
typedef size_t fpos_t;
|
typedef size_t fpos_t;
|
||||||
|
|
||||||
|
@ -79,6 +78,7 @@ int vsnprintf(char* buffer, size_t, const char* fmt, va_list);
|
||||||
int fprintf(FILE*, const char* fmt, ...);
|
int fprintf(FILE*, const char* fmt, ...);
|
||||||
int printf(const char* fmt, ...);
|
int printf(const char* fmt, ...);
|
||||||
int dbgprintf(const char* fmt, ...);
|
int dbgprintf(const char* fmt, ...);
|
||||||
|
void dbgputch(char);
|
||||||
int sprintf(char* buffer, const char* fmt, ...);
|
int sprintf(char* buffer, const char* fmt, ...);
|
||||||
int snprintf(char* buffer, size_t, const char* fmt, ...);
|
int snprintf(char* buffer, size_t, const char* fmt, ...);
|
||||||
int putchar(int ch);
|
int putchar(int ch);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue