Add 64bit printf
This commit is contained in:
parent
774a20b8c8
commit
c3d345bb87
2
Makefile
2
Makefile
@ -20,7 +20,7 @@ cobj=$(csrc:%.c=%.o) arch/$(ARCH)/cpu_context_switch.o arch/$(ARCH)/irq_pit.o
|
|||||||
deps = $(csrc:%.c=%.d)
|
deps = $(csrc:%.c=%.d)
|
||||||
|
|
||||||
kernel:$(asmobj) $(cobj) linker.ld
|
kernel:$(asmobj) $(cobj) linker.ld
|
||||||
$(CC) -m32 -ffreestanding -nostdlib $(cobj) $(asmobj) -o $@ -T linker.ld
|
$(CC) -m32 -ffreestanding -nostdlib $(cobj) $(asmobj) -o $@ -T linker.ld -lgcc
|
||||||
objcopy --only-keep-debug $@ $@.sym
|
objcopy --only-keep-debug $@ $@.sym
|
||||||
objcopy --strip-debug $@
|
objcopy --strip-debug $@
|
||||||
|
|
||||||
|
72
core/klibc.c
72
core/klibc.c
@ -33,7 +33,7 @@ void *memset(void *src, int c, size_t n)
|
|||||||
return src;
|
return src;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *itoa(int value, char *str, int base)
|
char *itoa(long long int value, char *str, int base)
|
||||||
{
|
{
|
||||||
char *rc;
|
char *rc;
|
||||||
char *ptr;
|
char *ptr;
|
||||||
@ -148,24 +148,47 @@ void putc(const char str)
|
|||||||
serialPutc(str);
|
serialPutc(str);
|
||||||
}
|
}
|
||||||
|
|
||||||
void printInt(int integer)
|
void printInt64(long long int integer)
|
||||||
{
|
{
|
||||||
char num[sizeof(int) * 3]; // int max is 2^(sizeof(int)*8) which is (2^3)^(sizeof(int)*8/3)
|
char num[sizeof(integer) *
|
||||||
|
3]; // int max is 2^(sizeof(int)*8) which is (2^3)^(sizeof(int)*8/3)
|
||||||
// = 8^(sizeof(int)*8/3) ~ 10^(sizeof(int)*8/3)
|
// = 8^(sizeof(int)*8/3) ~ 10^(sizeof(int)*8/3)
|
||||||
int i = 0, k = 0;
|
int i = 0;
|
||||||
|
|
||||||
if (integer < 0) {
|
if (integer < 0) {
|
||||||
putc('-');
|
putc('-');
|
||||||
}
|
}
|
||||||
if (integer == 0) {
|
|
||||||
num[i++] = 0;
|
do {
|
||||||
}
|
|
||||||
while (integer != 0) {
|
|
||||||
int digit = integer % 10;
|
int digit = integer % 10;
|
||||||
num[i++] = (digit > 0) ? digit : -digit;
|
num[i++] = (digit > 0) ? digit : -digit;
|
||||||
integer = integer / 10;
|
integer = integer / 10;
|
||||||
|
} while (integer != 0);
|
||||||
|
|
||||||
|
for (i = i - 1; i >= 0; i--) {
|
||||||
|
putc(num[i] + '0');
|
||||||
}
|
}
|
||||||
for (k = i - 1; k >= 0; k--) {
|
}
|
||||||
putc(num[k] + '0');
|
|
||||||
|
void printInt(int integer)
|
||||||
|
{
|
||||||
|
char num[sizeof(integer) *
|
||||||
|
3]; // int max is 2^(sizeof(int)*8) which is (2^3)^(sizeof(int)*8/3)
|
||||||
|
// = 8^(sizeof(int)*8/3) ~ 10^(sizeof(int)*8/3)
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
if (integer < 0) {
|
||||||
|
putc('-');
|
||||||
|
}
|
||||||
|
|
||||||
|
do {
|
||||||
|
int digit = integer % 10;
|
||||||
|
num[i++] = (digit > 0) ? digit : -digit;
|
||||||
|
integer = integer / 10;
|
||||||
|
} while (integer != 0);
|
||||||
|
|
||||||
|
for (i = i - 1; i >= 0; i--) {
|
||||||
|
putc(num[i] + '0');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -205,6 +228,35 @@ void vprintf(const char *format, va_list ap)
|
|||||||
case '%':
|
case '%':
|
||||||
putc('%');
|
putc('%');
|
||||||
break;
|
break;
|
||||||
|
case 'l':
|
||||||
|
switch (format[i + 2]) {
|
||||||
|
case 'l':
|
||||||
|
switch (format[i + 3]) {
|
||||||
|
case 'd': {
|
||||||
|
long long int d = va_arg(ap, long long int);
|
||||||
|
printInt64(d);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'p':
|
||||||
|
case 'x': {
|
||||||
|
char val[sizeof(long long int) * 2];
|
||||||
|
long long int d = va_arg(ap, long long int);
|
||||||
|
itoa(d, val, 16);
|
||||||
|
puts(val);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
break;
|
||||||
|
case 'i':
|
||||||
|
case 'd': {
|
||||||
|
long int d = va_arg(ap, long int);
|
||||||
|
printInt64(d);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
i++;
|
i++;
|
||||||
break;
|
break;
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
int memcmp(const void *s1, const void *s2, size_t n);
|
int memcmp(const void *s1, const void *s2, size_t n);
|
||||||
void *memcpy(void *dest, const void *src, size_t n);
|
void *memcpy(void *dest, const void *src, size_t n);
|
||||||
void *memset(void *s, int c, size_t n);
|
void *memset(void *s, int c, size_t n);
|
||||||
char *itoa(int value, char *str, int base);
|
char *itoa(long long int value, char *str, int base);
|
||||||
void reverse(char s[]);
|
void reverse(char s[]);
|
||||||
int strlen(const char s[]);
|
int strlen(const char s[]);
|
||||||
unsigned int strnlen(const char *s, size_t count);
|
unsigned int strnlen(const char *s, size_t count);
|
||||||
@ -21,7 +21,6 @@ int strcmp(const char s1[], const char s2[]);
|
|||||||
char *strzcpy(char *dst, const char *src, int len);
|
char *strzcpy(char *dst, const char *src, int len);
|
||||||
void puts(const char *str);
|
void puts(const char *str);
|
||||||
void putc(const char str);
|
void putc(const char str);
|
||||||
void printInt(int integer);
|
|
||||||
void vprintf(const char *format, va_list ap);
|
void vprintf(const char *format, va_list ap);
|
||||||
void printf(const char *format, ...);
|
void printf(const char *format, ...);
|
||||||
|
|
||||||
|
@ -99,10 +99,8 @@ void kmain(unsigned long magic, unsigned long addr)
|
|||||||
uint size = mbi->mmap_length / sizeof(struct multiboot_mmap_entry);
|
uint size = mbi->mmap_length / sizeof(struct multiboot_mmap_entry);
|
||||||
pr_devel("mmap buffer at 0x%x with %d entries\n", mbi->mmap_addr, size);
|
pr_devel("mmap buffer at 0x%x with %d entries\n", mbi->mmap_addr, size);
|
||||||
for (uint i = 0; i < size; i++) {
|
for (uint i = 0; i < size; i++) {
|
||||||
printf(" base_addr 0x%x 0x%x, length = 0x%x 0x%x, type = 0x%x\n",
|
printf(" base_addr 0x%llx, length = 0x%llx, type = 0x%x\n", mmap[i].addr,
|
||||||
(unsigned)(mmap[i].addr >> 32), (unsigned)(mmap[i].addr & 0xffffffff),
|
mmap[i].len, (uint32_t)mmap[i].type);
|
||||||
(unsigned)(mmap[i].len >> 32), (unsigned)(mmap[i].len & 0xffffffff),
|
|
||||||
(uint32_t)mmap[i].type);
|
|
||||||
memAddBank(
|
memAddBank(
|
||||||
max(mmap[i].addr, (multiboot_uint64_t)lastUsedByMem),
|
max(mmap[i].addr, (multiboot_uint64_t)lastUsedByMem),
|
||||||
min((multiboot_uint64_t)(upperMemKB * 1024), mmap[i].addr + mmap[i].len),
|
min((multiboot_uint64_t)(upperMemKB * 1024), mmap[i].addr + mmap[i].len),
|
||||||
|
@ -19,7 +19,7 @@ int memSetup(paddr_t upperMemKB, paddr_t *lastMemUsedOut)
|
|||||||
upperMemKB = ALIGN_DOWN(upperMemKB, PAGE_SIZE / 1024);
|
upperMemKB = ALIGN_DOWN(upperMemKB, PAGE_SIZE / 1024);
|
||||||
unsigned long nbPage = ((upperMemKB) / (PAGE_SIZE / 1024));
|
unsigned long nbPage = ((upperMemKB) / (PAGE_SIZE / 1024));
|
||||||
|
|
||||||
printf("Available Mem from 0x%x to 0x%x: %dMB and %dPages(%d)\n", &__ld_kernel_end,
|
printf("Available Mem from 0x%x to 0x%x: %dMB in %d Pages of %dB\n", &__ld_kernel_end,
|
||||||
upperMemKB * 1024, (upperMemKB * 1024 - (uint32_t)&__ld_kernel_end) / (1024 * 1024),
|
upperMemKB * 1024, (upperMemKB * 1024 - (uint32_t)&__ld_kernel_end) / (1024 * 1024),
|
||||||
nbPage, PAGE_SIZE);
|
nbPage, PAGE_SIZE);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user