修复tty显示字符串时遍历字符串无法停止的问题

This commit is contained in:
pointer-to-bios 2024-01-14 15:21:01 +08:00
parent 325e0a01bd
commit bdccf4add6
6 changed files with 35 additions and 15 deletions

View File

@ -5,5 +5,6 @@
extern void memset(void *__dest, u8 __src, usize len);
extern void memcpy(void *__dest, void *__src, usize len);
extern usize strlen(void *__dest);
#endif

View File

@ -40,7 +40,6 @@ void kmain(void *mb2_bootinfo)
framebuffer fb;
get_frame_buffer_with_bootinfo(&fb, &bootinfo);
KERNEL_TODO();
tty *tty0 = tty_new(tty_type_raw_framebuffer, tty_mode_text);
tty_set_framebuffer(tty0, &fb);
@ -66,9 +65,9 @@ void get_frame_buffer_with_bootinfo(framebuffer *fb, bootinfo_t *bootinfo)
fb->width = fbinfo->framebuffer_width;
fb->height = fbinfo->framebuffer_height;
fb->pixsize = fbinfo->framebuffer_bpp / 8;
memm_map_pageframes_to( // TODO 总共需要映射8MB空间但是它只映射了2MB
fb->pixtype = rgb;
memm_map_pageframes_to(
(u64)fb->pointer, (u64)fb->pointer,
fb->width * fb->height * fb->pixsize,
false, true);
KERNEL_TODO();
}

View File

@ -933,14 +933,14 @@ u64 font[256][64] = {
// M
0b00000000,
0b00000000,
0b10000001, ///
0b11000011,
0b11000011,
0b10100101,
0b10101001,
0b10011001,
0b10011001,
0b10000001,
0b00100010, ///
0b00100010,
0b00100110,
0b01010101,
0b01001001,
0b01001001,
0b01001001,
0b01000001,
0b10000001,
0b10000001, //
0b00000000,

View File

@ -2,6 +2,7 @@
#include <kernel/kernel.h>
#include <libk/string.h>
#include <libk/string.h>
tty_controller_t tty_ctrler;
@ -125,7 +126,7 @@ inline static void newline(tty *ttyx)
}
}
void tty_text_print(tty *ttyx, char *restrict string, u32 color, u32 bgcolor)
void tty_text_print(tty *ttyx, char *string, u32 color, u32 bgcolor)
{
if (ttyx->mode != tty_mode_text)
return;
@ -142,7 +143,8 @@ void tty_text_print(tty *ttyx, char *restrict string, u32 color, u32 bgcolor)
}
}
simple_lock_lock(ttyx->text.lock);
while (*string != '\0')
usize len = strlen(string);
for (char *str = string; string - str < len; string++)
{
char c = *string;
if (c == '\n')
@ -200,7 +202,6 @@ void tty_text_print(tty *ttyx, char *restrict string, u32 color, u32 bgcolor)
}
putchar(ttyx, c, color, bgcolor);
ttyx->text.column++;
++string;
}
if (ttyx->text.column == ttyx->text.width)
newline(ttyx);

View File

@ -38,7 +38,7 @@ endif
ASMFLAGS := ${ASMFLAGS}
S_SRCS = memset.s memcpy.s
S_SRCS = memset.s memcpy.s strlen.s
S_OBJS = ${S_SRCS:.s=.s.o}
################################

View File

@ -0,0 +1,19 @@
section .text
global strlen
; usize strlen(char *)
strlen:
push rcx
cld
mov al, 0
xor rcx, rcx
dec rcx
repne scasb
not rcx
dec rcx
mov rax, rcx
pop rcx
ret