From 60bf48343f7bc2bd5aef0fba78ec492ad18e5c59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Hord=C3=A9?= Date: Fri, 28 Sep 2018 00:03:45 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20ajout=20de=20fonctionnalit=C3=A9=20sur?= =?UTF-8?q?=20printf=20(64bits)=20et=20corrections?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/video.h | 2 +- lib/multiboot.c | 12 ++++----- lib/video.c | 68 +++++++++++++++++++++++++++++++++++++++++-------- makefile | 2 +- 4 files changed, 66 insertions(+), 18 deletions(-) diff --git a/include/video.h b/include/video.h index c5af8d5..fa1d968 100755 --- a/include/video.h +++ b/include/video.h @@ -17,5 +17,5 @@ u32 print(u8* string); u32 printf (const u8 *string, ...); void changevc(u8 vc); u8* itoa(u64 num, u8* str, u8 base, u64 dim, u8 achar); -u8* sitoa(int num, u8* str, u32 dim); +u8* sitoa(u64 num, u8 * str, u64 dim); diff --git a/lib/multiboot.c b/lib/multiboot.c index 0fa3914..454d503 100644 --- a/lib/multiboot.c +++ b/lib/multiboot.c @@ -13,12 +13,12 @@ u32 addr=infobloc; struct multiboot_tag *tag; unsigned size = *(unsigned *) addr; if (addr & 7) print("Non aligne..."); -printf(" Taille :%X\r\n", (u32)size); +printf(" Taille :% 4u\r\n", (u32)size); for (tag = (struct multiboot_tag *) (addr + 8); tag->type != MULTIBOOT_TAG_TYPE_END; tag = (struct multiboot_tag *) ((u8 *) tag + ((tag->size + 7) & ~7))) { - printf ("Tag 0x%x, Taille 0x%x\r\n", tag->type, tag->size); + printf ("--- Tag % 4u, Taille % 4u\r\n", tag->type, tag->size); switch (tag->type) { case MULTIBOOT_TAG_TYPE_CMDLINE: @@ -30,15 +30,15 @@ for (tag = (struct multiboot_tag *) (addr + 8); ((struct multiboot_tag_string *) tag)->string); break; case MULTIBOOT_TAG_TYPE_MODULE: - printf ("Module %x-%x. Command line %s\r\n", + printf ("Module %X-%X. Command line %s\r\n", ((struct multiboot_tag_module *) tag)->mod_start, ((struct multiboot_tag_module *) tag)->mod_end, ((struct multiboot_tag_module *) tag)->cmdline); break; case MULTIBOOT_TAG_TYPE_BASIC_MEMINFO: - printf ("Memoire basse : %uKB, memoire haute = %uKB\r\n", - ((struct multiboot_tag_basic_meminfo *) tag)->mem_lower, - ((struct multiboot_tag_basic_meminfo *) tag)->mem_upper); + printf ("Memoire basse : %H, memoire haute = %lH\r\n", + ((struct multiboot_tag_basic_meminfo *) tag)->mem_lower<<10, + ((u64)((struct multiboot_tag_basic_meminfo *) tag)->mem_upper)<<10); break; case MULTIBOOT_TAG_TYPE_BOOTDEV: printf ("Peripherique de demarrage : %x,%u,%u\r\n\r\n", diff --git a/lib/video.c b/lib/video.c index 134f452..16335af 100755 --- a/lib/video.c +++ b/lib/video.c @@ -308,14 +308,15 @@ u32 print(u8 * string) u32 printf(const u8 * string, ...) { - va_list args; + va_list args,argstemp; u64 sizes[] = { 0xFF, 0xFFFF, 0xFFFFFFFF, 0xFFFFFFFFFFFFFFFF }; + u8 units[][4] = { "o\000\000", "kio", "mio", "gio", "tio", "pio" }; u8 strbase2[] = "0xb\000"; u8 strbase8[] = "0xo\000"; u8 strbase16[] = "0x\000"; u8 hexadecimal[] = "*0x\000"; u8 achar, temp; - u8 asize, charadd; + u8 asize, charadd, unit; u8 buffer[buffersize]; u8 *str = string; u8 *strtemp; @@ -353,6 +354,27 @@ u32 printf(const u8 * string, ...) if (asize>3) asize=3; flag = true; break; + case '1': + case '2': + case '3': + asize=0; + flag = true; + break; + case '4': + case '5': + case '6': + case '7': + asize=1; + flag = true; + break; + case '8': + asize=2; + flag = true; + break; + case '9': + asize=3; + flag = true; + break; case 'u': if (asize==0) num = (u64) va_arg(args, u8); @@ -390,6 +412,28 @@ u32 printf(const u8 * string, ...) counter++; flag = false; break; + case 'H': + if (asize==0) + num = (u64) va_arg(args, u8); + else if (asize==1) + num = (u64) va_arg(args, u16); + else if (asize==2) + num = (u64) va_arg(args, u32); + else + num = (u64) va_arg(args, u64); + if (charadd == 0xFF) + charadd = ' '; + unit=0; + while(num>1024*10) + { + num=num>>10; + unit++; + } + sitoa(num, &buffer, sizes[asize]); + counter += print(&buffer); + print(units[unit]); + flag = false; + break; case 'd': case 'i': if (asize==0) @@ -493,12 +537,16 @@ u8 *itoa(u64 orignum, u8 * str, u8 base, u64 dim, u8 achar) break; } for (i = 0; i < size; i++) { + if (num == 0) { + if (achar == 0) break; + *(pointer++) = achar; + } + else + { u64 result = num % (u32) base; - *(pointer++) = - (result > 9) ? (result - 10) + 'a' : result + '0'; + *(pointer++) = (result > 9) ? (result - 10) + 'a' : result + '0'; num = num / (u32) base; - if ((num == 0) && (achar == 0)) - break; + } } *pointer = '\000'; strinvert(str); @@ -509,7 +557,7 @@ u8 *itoa(u64 orignum, u8 * str, u8 base, u64 dim, u8 achar) /* converti un entier en chaine de caractère */ -u8 *sitoa(int num, u8 * str, u32 dim) +u8 *sitoa(u64 num, u8 * str, u64 dim) { u8 *pointer = str; bool isNegative = false; @@ -519,12 +567,12 @@ u8 *sitoa(int num, u8 * str, u32 dim) *pointer = '\000'; return str; } - if (num < 0) { + if ((((dim+1)>>1)&num)>0) { isNegative = true; - num = -num; + num = (~num&dim)+1; } while (num != 0) { - u32 result = num % 10; + u64 result = num % 10; *(pointer++) = (result > 9) ? (result - 10) + 'a' : result + '0'; num = num / 10; diff --git a/makefile b/makefile index 51eb030..4d8bf45 100755 --- a/makefile +++ b/makefile @@ -78,7 +78,7 @@ qemu-debug64: (killall qemu-system-x86_64;qemu-system-x86_64 -m 1G -drive format=raw,file=./final/harddiskuefi.img.final --bios /usr/share/qemu/OVMF.fd -s -S &) qemu: - (killall qemu-system-i386;qemu-system-i386 -m 5G -drive format=raw,file=./final/harddisk.img.final --enable-kvm -cpu host -s &) + (killall qemu-system-i386;qemu-system-i386 -m 1G -drive format=raw,file=./final/harddisk.img.final --enable-kvm -cpu host -s &) qemu64: (killall qemu-system-x86_64;qemu-system-x86_64 -m 1G -drive format=raw,file=./final/harddiskuefi.img.final --bios /usr/share/qemu/OVMF.fd --enable-kvm -cpu host -s &)