Skip to content

Commit e2086b7

Browse files
committed
新增 x86 架构的 memset memcmp memmove 高速实现.
内核模块增加 bcmp 接口,
1 parent 8ab2e52 commit e2086b7

File tree

29 files changed

+1878
-230
lines changed

29 files changed

+1878
-230
lines changed

build.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
set -e
2+
23
cmake -S . -B build/ -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=Debug -DTARGET_ARCH=x86_64
4+
35
cmake --build build/ --target run -j 12
6+
47
cp build/compile_commands.json compile_commands.json

src/arch/riscv64/boot/open_sbi.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ extern uintptr_t smp_entry;
44

55
boot_memory_map_t opensbi_memory_map;
66
boot_framebuffer_t opensbi_fb;
7-
char *kernel_cmdline = NULL;
8-
extern uintptr_t opensbi_dtb_vaddr;
7+
char *kernel_cmdline = NULL;
8+
extern uintptr_t opensbi_dtb_vaddr;
99

1010
uint64_t boot_get_hhdm_offset() {
1111
return 0xffff800000000000;
@@ -38,7 +38,10 @@ char *get_kernel_cmdline() {
3838
boot_module_t opensbi_modules[MAX_LOAD_MODULE];
3939

4040
void boot_get_modules(boot_module_t **modules, size_t *count) {
41-
*count = 0;
41+
for (uint64_t i = 0; i < 1; i++) {
42+
modules[i] = &opensbi_modules[i];
43+
(*count)++;
44+
}
4245
}
4346

4447
uint64_t boot_get_dtb() {

src/arch/riscv64/boot/start.c

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,63 @@ static const char *fdt_kernel_cmdline(void *fdt) {
374374
return bootargs;
375375
}
376376

377+
uint64_t fdt_get_initrd(const void *fdt, size_t *out_size) {
378+
int chosen;
379+
const void *prop;
380+
int len;
381+
uint64_t start = 0, end = 0;
382+
383+
if (!fdt) return 0;
384+
385+
chosen = fdt_path_offset((void *)fdt, "/chosen");
386+
if (chosen < 0) {
387+
// 没有 /chosen
388+
return 0;
389+
}
390+
391+
/* 常见属性名优先级: linux,initrd-start/end -> initrd-start/end */
392+
prop = fdt_getprop((void *)fdt, chosen, "linux,initrd-start", &len);
393+
if (prop) {
394+
if (len == 8) {
395+
start = fdt64_to_cpu(*(const fdt64_t *)prop);
396+
} else if (len == 4) {
397+
start = fdt32_to_cpu(*(const fdt32_t *)prop);
398+
} else {
399+
return 0;
400+
}
401+
} else {
402+
prop = fdt_getprop((void *)fdt, chosen, "initrd-start", &len);
403+
if (prop) {
404+
if (len == 8) start = fdt64_to_cpu(*(const fdt64_t *)prop);
405+
else if (len == 4) start = fdt32_to_cpu(*(const fdt32_t *)prop);
406+
else return 0;
407+
}
408+
}
409+
410+
prop = fdt_getprop((void *)fdt, chosen, "linux,initrd-end", &len);
411+
if (prop) {
412+
if (len == 8) {
413+
end = fdt64_to_cpu(*(const fdt64_t *)prop);
414+
} else if (len == 4) {
415+
end = fdt32_to_cpu(*(const fdt32_t *)prop);
416+
} else {
417+
return false;
418+
}
419+
} else {
420+
prop = fdt_getprop((void *)fdt, chosen, "initrd-end", &len);
421+
if (prop) {
422+
if (len == 8) end = fdt64_to_cpu(*(const fdt64_t *)prop);
423+
else if (len == 4) end = fdt32_to_cpu(*(const fdt32_t *)prop);
424+
else return false;
425+
}
426+
}
427+
428+
if (start == 0 || end == 0 || end <= start) return false;
429+
430+
if (out_size) *out_size = (size_t)(end - start);
431+
return start;
432+
}
433+
377434
extern void init_early_paging();
378435

379436
uint64_t bsp_hart_id;
@@ -399,5 +456,6 @@ USED void opensbi_c_start(uint64_t boot_hart_id, uintptr_t dtb_ptr) {
399456
setup_memmap(&opensbi_memory_map, 0x80000000, 0x81000000, &opensbi_fb);
400457
kernel_cmdline = (char*)fdt_kernel_cmdline(opensbi_dtb_vaddr);
401458
init_early_paging();
459+
402460
__asm__ volatile("j kmain");
403461
}

src/arch/riscv64/initrd.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#include "boot.h"
2+
#include "krlibc.h"
3+
#include "mem/frame.h"
4+
#include "mem/page.h"
5+
#include "term/klog.h"
6+
7+
extern uint64_t fdt_get_initrd(const void *fdt, size_t *out_size);
8+
extern void *opensbi_dtb_vaddr;
9+
extern boot_module_t opensbi_modules[MAX_LOAD_MODULE];
10+
11+
void initrd_setup() {
12+
size_t size;
13+
uint64_t buffer = fdt_get_initrd(opensbi_dtb_vaddr,&size);
14+
if(buffer == 0) {
15+
kerror("cannot find initrd file.");
16+
arch_close_interrupt();
17+
arch_wait_for_interrupt();
18+
}
19+
opensbi_modules[0].size = size;
20+
opensbi_modules[0].data = phys_to_virt(buffer);
21+
page_map_range(get_kernel_pagedir(),(uint64_t)opensbi_modules[0].data,buffer,size,KERNEL_PTE_FLAGS);
22+
23+
strcpy(opensbi_modules[0].name,"initramfs");
24+
strcpy(opensbi_modules[0].path,"/initramfs.img");
25+
}

src/arch/riscv64/librv64.c

Lines changed: 0 additions & 143 deletions
Original file line numberDiff line numberDiff line change
@@ -24,149 +24,6 @@ bool arch_check_interrupt(void) {
2424
return (sstatus & SSTATUS_SIE) != 0;
2525
}
2626

27-
void *memcpy(void *restrict dest, const void *restrict src, size_t n) {
28-
unsigned char *d = dest;
29-
const unsigned char *s = src;
30-
31-
#ifdef __GNUC__
32-
33-
# if __BYTE_ORDER == __LITTLE_ENDIAN
34-
# define LS >>
35-
# define RS <<
36-
# else
37-
# define LS <<
38-
# define RS >>
39-
# endif
40-
41-
typedef uint32_t __attribute__((__may_alias__)) u32;
42-
uint32_t w, x;
43-
44-
for (; (uintptr_t)s % 4 && n; n--)
45-
*d++ = *s++;
46-
47-
if ((uintptr_t)d % 4 == 0) {
48-
for (; n >= 16; s += 16, d += 16, n -= 16) {
49-
*(u32 *)(d + 0) = *(u32 *)(s + 0);
50-
*(u32 *)(d + 4) = *(u32 *)(s + 4);
51-
*(u32 *)(d + 8) = *(u32 *)(s + 8);
52-
*(u32 *)(d + 12) = *(u32 *)(s + 12);
53-
}
54-
if (n & 8) {
55-
*(u32 *)(d + 0) = *(u32 *)(s + 0);
56-
*(u32 *)(d + 4) = *(u32 *)(s + 4);
57-
d += 8;
58-
s += 8;
59-
}
60-
if (n & 4) {
61-
*(u32 *)(d + 0) = *(u32 *)(s + 0);
62-
d += 4;
63-
s += 4;
64-
}
65-
if (n & 2) {
66-
*d++ = *s++;
67-
*d++ = *s++;
68-
}
69-
if (n & 1) { *d = *s; }
70-
return dest;
71-
}
72-
73-
if (n >= 32) switch ((uintptr_t)d % 4) {
74-
case 1:
75-
w = *(u32 *)s;
76-
*d++ = *s++;
77-
*d++ = *s++;
78-
*d++ = *s++;
79-
n -= 3;
80-
for (; n >= 17; s += 16, d += 16, n -= 16) {
81-
x = *(u32 *)(s + 1);
82-
*(u32 *)(d + 0) = (w LS 24) | (x RS 8);
83-
w = *(u32 *)(s + 5);
84-
*(u32 *)(d + 4) = (x LS 24) | (w RS 8);
85-
x = *(u32 *)(s + 9);
86-
*(u32 *)(d + 8) = (w LS 24) | (x RS 8);
87-
w = *(u32 *)(s + 13);
88-
*(u32 *)(d + 12) = (x LS 24) | (w RS 8);
89-
}
90-
break;
91-
case 2:
92-
w = *(u32 *)s;
93-
*d++ = *s++;
94-
*d++ = *s++;
95-
n -= 2;
96-
for (; n >= 18; s += 16, d += 16, n -= 16) {
97-
x = *(u32 *)(s + 2);
98-
*(u32 *)(d + 0) = (w LS 16) | (x RS 16);
99-
w = *(u32 *)(s + 6);
100-
*(u32 *)(d + 4) = (x LS 16) | (w RS 16);
101-
x = *(u32 *)(s + 10);
102-
*(u32 *)(d + 8) = (w LS 16) | (x RS 16);
103-
w = *(u32 *)(s + 14);
104-
*(u32 *)(d + 12) = (x LS 16) | (w RS 16);
105-
}
106-
break;
107-
case 3:
108-
w = *(u32 *)s;
109-
*d++ = *s++;
110-
n -= 1;
111-
for (; n >= 19; s += 16, d += 16, n -= 16) {
112-
x = *(u32 *)(s + 3);
113-
*(u32 *)(d + 0) = (w LS 8) | (x RS 24);
114-
w = *(u32 *)(s + 7);
115-
*(u32 *)(d + 4) = (x LS 8) | (w RS 24);
116-
x = *(u32 *)(s + 11);
117-
*(u32 *)(d + 8) = (w LS 8) | (x RS 24);
118-
w = *(u32 *)(s + 15);
119-
*(u32 *)(d + 12) = (x LS 8) | (w RS 24);
120-
}
121-
break;
122-
}
123-
if (n & 16) {
124-
*d++ = *s++;
125-
*d++ = *s++;
126-
*d++ = *s++;
127-
*d++ = *s++;
128-
*d++ = *s++;
129-
*d++ = *s++;
130-
*d++ = *s++;
131-
*d++ = *s++;
132-
*d++ = *s++;
133-
*d++ = *s++;
134-
*d++ = *s++;
135-
*d++ = *s++;
136-
*d++ = *s++;
137-
*d++ = *s++;
138-
*d++ = *s++;
139-
*d++ = *s++;
140-
}
141-
if (n & 8) {
142-
*d++ = *s++;
143-
*d++ = *s++;
144-
*d++ = *s++;
145-
*d++ = *s++;
146-
*d++ = *s++;
147-
*d++ = *s++;
148-
*d++ = *s++;
149-
*d++ = *s++;
150-
}
151-
if (n & 4) {
152-
*d++ = *s++;
153-
*d++ = *s++;
154-
*d++ = *s++;
155-
*d++ = *s++;
156-
}
157-
if (n & 2) {
158-
*d++ = *s++;
159-
*d++ = *s++;
160-
}
161-
if (n & 1) { *d = *s; }
162-
return dest;
163-
#endif
164-
165-
for (; n; n--)
166-
*d++ = *s++;
167-
return dest;
168-
}
169-
17027
bool arch_elf_test_head(Elf64_Ehdr *ehdr) {
17128
if (ehdr->e_ident[EI_MAG0] != ELFMAG0 || ehdr->e_ident[EI_MAG1] != ELFMAG1 ||
17229
ehdr->e_ident[EI_MAG2] != ELFMAG2 || ehdr->e_ident[EI_MAG3] != ELFMAG3 ||

src/arch/riscv64/main.c

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
#include "driver/input_device.h"
55
#include "driver/serial.h"
66
#include "driver/tty.h"
7+
#include "exec/elf_load.h"
8+
#include "fs/cpio.h"
79
#include "fs/devtmpfs.h"
810
#include "fs/pipefs.h"
911
#include "fs/tmpfs.h"
@@ -14,15 +16,16 @@
1416
#include "mem/frame.h"
1517
#include "mem/heap.h"
1618
#include "mem/page.h"
19+
#include "mod/module.h"
1720
#include "rv64_irq.h"
1821
#include "sbi.h"
1922
#include "task/futex.h"
2023
#include "task/scheduler.h"
2124
#include "task/smp.h"
2225
#include "term/klog.h"
23-
#include "exec/elf_load.h"
2426

25-
extern void arch_cpu_init();
27+
extern void arch_cpu_init();
28+
extern void initrd_setup();
2629

2730
USED _Noreturn void kmain() {
2831
size_t boot_argc = boot_parse_cmdline(get_kernel_cmdline());
@@ -42,7 +45,8 @@ USED _Noreturn void kmain() {
4245
intctl_init();
4346
trap_init();
4447
arch_cpu_init();
45-
48+
initrd_setup();
49+
load_module();
4650
__asm__ volatile("mv tp, %0\n\t" ::"r"(NULL));
4751
csr_write(sscratch, 0);
4852

@@ -54,11 +58,12 @@ USED _Noreturn void kmain() {
5458
futex_init();
5559
setup_task();
5660
smp_init();
61+
// cpio_init();
5762
ksuccess("Kernel load done!");
5863
enable_scheduler();
5964
arch_open_interrupt();
6065

61-
launch_init_process();
66+
// launch_init_process();
6267

6368
while (true)
6469
arch_wait_for_interrupt();

src/arch/x86_64/backtrace.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
#include "description_table.h"
21
#include "exec/elf.h"
32
#include "krlibc.h"
43
#include "limine.h"
@@ -51,11 +50,11 @@ void kallsyms_init_from_elf() {
5150
for (int i = 0; i < ehdr->e_shnum; i++) {
5251
switch (shdrs[i].sh_type) {
5352
case SHT_SYMTAB:
54-
if(has_sym) break;
53+
if (has_sym) break;
5554
symtab = (Elf64_Sym *)((char *)ehdr + shdrs[i].sh_offset);
5655
symtabsz = shdrs[i].sh_size;
5756
strtab = (char *)ehdr + shdrs[shdrs[i].sh_link].sh_offset;
58-
has_sym = true;
57+
has_sym = true;
5958
break;
6059
case SHT_PROGBITS:
6160
if (shdrs[i].sh_name >= shdrs[ehdr->e_shstrndx].sh_size) { break; }

0 commit comments

Comments
 (0)