Remove kernel implementation of sprintf
This commit is contained in:
parent
2ec2af15b5
commit
d707d222f1
@ -1,124 +0,0 @@
|
|||||||
#include <stdarg.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <terminal.h>
|
|
||||||
|
|
||||||
void num2str(char *buf, uint64_t num, uint64_t base)
|
|
||||||
{
|
|
||||||
if(num == 0)
|
|
||||||
{
|
|
||||||
buf[0] = '0';
|
|
||||||
buf[1] = '\0';
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
uint64_t i=0, j=0;
|
|
||||||
char chars[] = "0123456789ABCDEF";
|
|
||||||
while(num > 0)
|
|
||||||
{
|
|
||||||
buf[i++] = chars[num%base];
|
|
||||||
num /= base;
|
|
||||||
}
|
|
||||||
i--;
|
|
||||||
while(j<i)
|
|
||||||
{
|
|
||||||
char t = buf[i];
|
|
||||||
buf[i--] = buf[j];
|
|
||||||
buf[j++] = t;
|
|
||||||
}
|
|
||||||
buf[i+j+1] = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
void debug_putch(char c)
|
|
||||||
{
|
|
||||||
terminal_write(c);
|
|
||||||
}
|
|
||||||
|
|
||||||
void debug_putsn(char *s, size_t n)
|
|
||||||
{
|
|
||||||
while(n--)
|
|
||||||
debug_putch(*s++);
|
|
||||||
}
|
|
||||||
|
|
||||||
void debug_puts(char *s)
|
|
||||||
{
|
|
||||||
size_t len = 0;
|
|
||||||
while(s[len]) len++;
|
|
||||||
debug_putsn(s, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
void debug_vprintf(char *fmt, va_list args)
|
|
||||||
{
|
|
||||||
if(!(*fmt))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if(*fmt != '%')
|
|
||||||
{
|
|
||||||
size_t len = 0;
|
|
||||||
while(fmt[len] && fmt[len] != '%')
|
|
||||||
len++;
|
|
||||||
debug_putsn(fmt, len);
|
|
||||||
debug_vprintf(&fmt[len], args);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt++;
|
|
||||||
size_t padwidth = 0;
|
|
||||||
char padchar = ' ';
|
|
||||||
if(*fmt == '0')
|
|
||||||
{
|
|
||||||
padchar = '0';
|
|
||||||
fmt++;
|
|
||||||
}
|
|
||||||
while(*fmt >= '0' && *fmt <='9')
|
|
||||||
{
|
|
||||||
padwidth *= 10;
|
|
||||||
padwidth += (int)(*fmt++ - '0');
|
|
||||||
}
|
|
||||||
uint64_t base = 0;
|
|
||||||
switch(*fmt)
|
|
||||||
{
|
|
||||||
case 'b':
|
|
||||||
base = 2;
|
|
||||||
break;
|
|
||||||
case 'o':
|
|
||||||
base = 8;
|
|
||||||
break;
|
|
||||||
case 'd':
|
|
||||||
base = 10;
|
|
||||||
break;
|
|
||||||
case 'x':
|
|
||||||
base = 16;
|
|
||||||
break;
|
|
||||||
case 'c':
|
|
||||||
debug_putch((char)va_arg(args, uint64_t));
|
|
||||||
break;
|
|
||||||
case 's':
|
|
||||||
debug_puts(va_arg(args, char*));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
debug_putch('%');
|
|
||||||
fmt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(base)
|
|
||||||
{
|
|
||||||
uintmax_t number = va_arg(args, uintmax_t);
|
|
||||||
char buf[128];
|
|
||||||
num2str(buf, number, base);
|
|
||||||
if(padwidth > strlen(buf))
|
|
||||||
for(size_t i = 0; i < (padwidth - strlen(buf)); i++)
|
|
||||||
debug_putch(padchar);
|
|
||||||
debug_puts(buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt++;
|
|
||||||
debug_vprintf(fmt, args);
|
|
||||||
}
|
|
||||||
|
|
||||||
void debug_printf(char *fmt, ...)
|
|
||||||
{
|
|
||||||
va_list args;
|
|
||||||
va_start(args, fmt);
|
|
||||||
debug_vprintf(fmt, args);
|
|
||||||
va_end(args);
|
|
||||||
}
|
|
@ -6,6 +6,8 @@
|
|||||||
#include <multiboot.h>
|
#include <multiboot.h>
|
||||||
#include <interrupts.h>
|
#include <interrupts.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
|
||||||
struct kernel_boot_data_st kernel_boot_data;
|
struct kernel_boot_data_st kernel_boot_data;
|
||||||
|
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <sys/uio.h>
|
||||||
#include <terminal.h>
|
#include <terminal.h>
|
||||||
|
#include <musl-glue.h>
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
#define FRAMEBUFFER 0x1
|
#define FRAMEBUFFER 0x1
|
||||||
#define EGA_TEXT 0x2
|
#define EGA_TEXT 0x2
|
||||||
@ -15,23 +18,6 @@ uint8_t format = 0x7;
|
|||||||
|
|
||||||
static int terminal_type;
|
static int terminal_type;
|
||||||
|
|
||||||
void terminal_init(){
|
|
||||||
struct fbinfo *fbinfo = kernel_boot_data.fbinfo;
|
|
||||||
terminal_type = fbinfo->framebuffer_type;
|
|
||||||
|
|
||||||
switch(terminal_type)
|
|
||||||
{
|
|
||||||
case FRAMEBUFFER:
|
|
||||||
framebuffer_init(fbinfo);
|
|
||||||
fbterm_init(&kernel_fb);
|
|
||||||
break;
|
|
||||||
case EGA_TEXT:
|
|
||||||
vga_init(fbinfo);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void scroll()
|
static void scroll()
|
||||||
{
|
{
|
||||||
while(cursor >= VGA_SIZE)
|
while(cursor >= VGA_SIZE)
|
||||||
@ -42,7 +28,7 @@ static void scroll()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void terminal_write(char c)
|
static void terminal_write(char c)
|
||||||
{
|
{
|
||||||
int doflush = 0;
|
int doflush = 0;
|
||||||
switch(c)
|
switch(c)
|
||||||
@ -68,4 +54,62 @@ void terminal_write(char c)
|
|||||||
vga_movecursor(cursor);
|
vga_movecursor(cursor);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void terminal_putsn(char *s, size_t n)
|
||||||
|
{
|
||||||
|
while(n--)
|
||||||
|
terminal_write(*s++);
|
||||||
|
}
|
||||||
|
|
||||||
|
long k_ioctl(long fd, long cmd, long arg3, long, long, long)
|
||||||
|
{
|
||||||
|
if(fd == 1 && cmd == 0x5413) {
|
||||||
|
struct {
|
||||||
|
unsigned short ws_row;
|
||||||
|
unsigned short ws_col;
|
||||||
|
unsigned short ws_xp;
|
||||||
|
unsigned short ws_yp;
|
||||||
|
} *wsz = (void *)arg3;
|
||||||
|
wsz->ws_row = 24;
|
||||||
|
wsz->ws_col = 80;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
long retval = -1;
|
||||||
|
PANIC("Unknown IOCTL request: fd: %d, command: %x\n", fd, cmd);
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
long k_writev(long fd, long iov, long iovcnt, long, long, long)
|
||||||
|
{
|
||||||
|
if(fd == 1)
|
||||||
|
{
|
||||||
|
size_t len = 0;
|
||||||
|
struct iovec *v = (void *) iov;
|
||||||
|
for(int i = 0; i < iovcnt; i++)
|
||||||
|
{
|
||||||
|
terminal_putsn(v[i].iov_base, v[i].iov_len);
|
||||||
|
len += v[i].iov_len;
|
||||||
|
}
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
long retval = 0;
|
||||||
|
PANIC("Unknown writev request: fd: %d\n", fd);
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
void terminal_init(){
|
||||||
|
struct fbinfo *fbinfo = kernel_boot_data.fbinfo;
|
||||||
|
terminal_type = fbinfo->framebuffer_type;
|
||||||
|
|
||||||
|
switch(terminal_type)
|
||||||
|
{
|
||||||
|
case FRAMEBUFFER:
|
||||||
|
framebuffer_init(fbinfo);
|
||||||
|
fbterm_init(&kernel_fb);
|
||||||
|
break;
|
||||||
|
case EGA_TEXT:
|
||||||
|
vga_init(fbinfo);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
@ -1,8 +1,9 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
#define debug(...) debug_printf(__VA_ARGS__)
|
#define debug(...) printf(__VA_ARGS__)
|
||||||
#define debug_info(...) \
|
#define debug_info(...) \
|
||||||
do{debug("[INFO] "); debug(__VA_ARGS__);}while(0)
|
do{debug("[INFO] "); debug(__VA_ARGS__);}while(0)
|
||||||
#define debug_ok(...) \
|
#define debug_ok(...) \
|
||||||
@ -25,18 +26,13 @@
|
|||||||
|
|
||||||
#define PANIC(...) \
|
#define PANIC(...) \
|
||||||
do { \
|
do { \
|
||||||
debug_printf("\n\nKERNEL PANIC!\n%s:%d\n", __FILE__, __LINE__); \
|
debug("\n\nKERNEL PANIC!\n%s:%d\n", __FILE__, __LINE__); \
|
||||||
debug_printf(__VA_ARGS__); \
|
debug(__VA_ARGS__); \
|
||||||
debug_printf("\n"); \
|
debug("\n"); \
|
||||||
volatile int _override = 0; \
|
volatile int _override = 0; \
|
||||||
while(1) { \
|
while(1) { \
|
||||||
__asm__("panic_breakpoint_" S__LINE__ ":"); \
|
__asm__("panic_breakpoint_" S__LINE__ ":"); \
|
||||||
if(_override) break; \
|
if(_override) break; \
|
||||||
} \
|
} \
|
||||||
}while(0)
|
}while(0)
|
||||||
|
|
||||||
// boot/debug.c
|
|
||||||
void debug_printf(char *fmt, ...);
|
|
||||||
void debug_puts(char *s);
|
|
||||||
void debug_putsn(char *s, size_t n);
|
|
||||||
void debug_putsh(char c);
|
|
@ -40,9 +40,6 @@
|
|||||||
uint64_t pmm_alloc();
|
uint64_t pmm_alloc();
|
||||||
uint64_t pmm_calloc();
|
uint64_t pmm_calloc();
|
||||||
|
|
||||||
// memory/kbrk.c
|
|
||||||
long kbrk(long brk, long, long, long, long, long);
|
|
||||||
|
|
||||||
// Link.ld
|
// Link.ld
|
||||||
extern int kernel_start, kernel_end;
|
extern int kernel_start, kernel_end;
|
||||||
|
|
||||||
|
@ -1,8 +1,17 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#define SYSCALL_BRK 12
|
#define SYSCALL_BRK 12
|
||||||
|
#define SYSCALL_IOCTL 16
|
||||||
|
#define SYSCALL_WRITEV 20
|
||||||
|
|
||||||
typedef long (*syscall_handler)(long, long, long, long, long, long);
|
typedef long (*syscall_handler)(long, long, long, long, long, long);
|
||||||
|
|
||||||
// lib/musl-glue.c
|
// lib/musl-glue.c
|
||||||
syscall_handler set_syscall_handler(long num, syscall_handler handler);
|
syscall_handler set_syscall_handler(long num, syscall_handler handler);
|
||||||
|
|
||||||
|
// drivers/terminal/terminal.c
|
||||||
|
long k_ioctl(long fd, long cmd, long arg3, long, long, long);
|
||||||
|
long k_writev(long fd, long iov, long iovcnt, long, long, long);
|
||||||
|
|
||||||
|
// memory/kbrk.c
|
||||||
|
long k_brk(long brk, long, long, long, long, long);
|
@ -14,7 +14,6 @@ struct vga_cell {
|
|||||||
|
|
||||||
// drivers/terminal/terminal.c
|
// drivers/terminal/terminal.c
|
||||||
void terminal_init();
|
void terminal_init();
|
||||||
void terminal_write(char c);
|
|
||||||
|
|
||||||
// drivers/terminal/vga.c
|
// drivers/terminal/vga.c
|
||||||
void vga_init();
|
void vga_init();
|
||||||
|
@ -1,7 +1,11 @@
|
|||||||
#include <musl-glue.h>
|
#include <musl-glue.h>
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
|
|
||||||
syscall_handler syscall_handlers[440];
|
syscall_handler syscall_handlers[440] = {
|
||||||
|
[SYSCALL_BRK] = &k_brk,
|
||||||
|
[SYSCALL_IOCTL] = &k_ioctl,
|
||||||
|
[SYSCALL_WRITEV] = &k_writev,
|
||||||
|
};
|
||||||
|
|
||||||
syscall_handler set_syscall_handler(long num, syscall_handler handler)
|
syscall_handler set_syscall_handler(long num, syscall_handler handler)
|
||||||
{
|
{
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
static long _brk = KERNEL_BRK0;
|
static long _brk = KERNEL_BRK0;
|
||||||
|
|
||||||
long kbrk(long brk, long, long, long, long, long)
|
long k_brk(long brk, long, long, long, long, long)
|
||||||
{
|
{
|
||||||
if(brk)
|
if(brk)
|
||||||
{
|
{
|
||||||
|
@ -38,6 +38,4 @@ void memory_init()
|
|||||||
pmm_free(p);
|
pmm_free(p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
set_syscall_handler(SYSCALL_BRK, &kbrk);
|
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user