update code
This commit is contained in:
parent
54f9f09ded
commit
bd1c01cdf9
|
@ -102,7 +102,9 @@ bread(uint dev, uint blockno)
|
||||||
// virtio_disk_rw(b, 0);
|
// virtio_disk_rw(b, 0);
|
||||||
uint64 sector = b->blockno * (BSIZE / 512);
|
uint64 sector = b->blockno * (BSIZE / 512);
|
||||||
if(sd_read_sector(b->data, sector, sizeof(b->data))) {
|
if(sd_read_sector(b->data, sector, sizeof(b->data))) {
|
||||||
panic("[bio.c]bread err\n");
|
panic("[bread]bread err\n");
|
||||||
|
} else {
|
||||||
|
printf("[bread]read data: %s\n", b->data);
|
||||||
}
|
}
|
||||||
b->valid = 1;
|
b->valid = 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,11 +14,11 @@ void
|
||||||
main(unsigned long hartid, unsigned long dtb_pa)
|
main(unsigned long hartid, unsigned long dtb_pa)
|
||||||
{
|
{
|
||||||
|
|
||||||
// printf("hart %d enter main()...\n", hartid);
|
|
||||||
if (hartid == 0) {
|
if (hartid == 0) {
|
||||||
printf("\n");
|
printf("\n");
|
||||||
printf("xv6-k210 kernel is booting\n");
|
printf("xv6-k210 kernel is booting\n");
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
printf("hart %d enter main()...\n", hartid);
|
||||||
kinit(); // physical page allocator
|
kinit(); // physical page allocator
|
||||||
kvminit(); // create kernel page table
|
kvminit(); // create kernel page table
|
||||||
kvminithart(); // turn on paging
|
kvminithart(); // turn on paging
|
||||||
|
@ -52,19 +52,14 @@ main(unsigned long hartid, unsigned long dtb_pa)
|
||||||
__sync_synchronize();
|
__sync_synchronize();
|
||||||
started = 1;
|
started = 1;
|
||||||
|
|
||||||
scheduler();
|
// scheduler();
|
||||||
|
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
// hart 1
|
// hart 1
|
||||||
// sbi_console_putchar('A');
|
printf("hart %d enter main()...\n", hartid);
|
||||||
// sbi_console_putchar('B');
|
|
||||||
// sbi_console_putchar('C');
|
|
||||||
// sbi_console_putchar('D');
|
|
||||||
// sbi_console_putchar('\n');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
74
kernel/sbi.c
74
kernel/sbi.c
|
@ -1,74 +0,0 @@
|
||||||
// SBI Call Implementation
|
|
||||||
|
|
||||||
|
|
||||||
#define SBI_SET_TIMER 0
|
|
||||||
#define SBI_CONSOLE_PUTCHAR 1
|
|
||||||
#define SBI_CONSOLE_GETCHAR 2
|
|
||||||
#define SBI_CLEAR_IPI 3
|
|
||||||
#define SBI_SEND_IPI 4
|
|
||||||
#define SBI_REMOTE_FENCE_I 5
|
|
||||||
#define SBI_REMOTE_SFENCE_VMA 6
|
|
||||||
#define SBI_REMOTE_SFENCE_VMA_ASID 7
|
|
||||||
#define SBI_SHUTDOWN 8
|
|
||||||
|
|
||||||
static long sbi_call(unsigned long which, unsigned long arg0, unsigned long arg1, unsigned long arg2) {
|
|
||||||
long ret;
|
|
||||||
asm volatile (
|
|
||||||
"ld x10, %1 \n\t"
|
|
||||||
"ld x11, %2 \n\t"
|
|
||||||
"ld x12, %3 \n\t"
|
|
||||||
"ld x17, %4 \n\t"
|
|
||||||
"ecall \n\t"
|
|
||||||
"sd x10, %0 \n\t"
|
|
||||||
:"=m"(ret)
|
|
||||||
:"m"(arg0), "m"(arg1), "m"(arg2), "m"(which)
|
|
||||||
:"memory"
|
|
||||||
);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
// put a char in console
|
|
||||||
void sbi_console_putchar(int ch) {
|
|
||||||
sbi_call(SBI_CONSOLE_PUTCHAR, ch, 0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int sbi_console_getchar() {
|
|
||||||
return sbi_call(SBI_CONSOLE_GETCHAR, 0, 0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void sbi_set_timer(uint64 stime_value) {
|
|
||||||
sbi_call(SBI_SET_TIMER, (unsigned long)stime_value, 0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void sbi_send_ipi(const unsigned long *hart_mask) {
|
|
||||||
sbi_call(SBI_SEND_IPI, (unsigned long)hart_mask, 0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void sbi_clear_ipi(void) {
|
|
||||||
sbi_call(SBI_CLEAR_IPI, 0, 0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void sbi_remote_fence_i(const unsigned long *hart_mask) {
|
|
||||||
sbi_call(SBI_REMOTE_FENCE_I, (unsigned long)hart_mask, 0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void sbi_remote_sfence_vma(const unsigned long *hart_mask,
|
|
||||||
unsigned long start,
|
|
||||||
unsigned long size) {
|
|
||||||
sbi_call(SBI_REMOTE_SFENCE_VMA, (unsigned long)hart_mask, 0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void sbi_remote_sfence_vma_asid(const unsigned long *hart_mask,
|
|
||||||
unsigned long start,
|
|
||||||
unsigned long size,
|
|
||||||
unsigned long asid) {
|
|
||||||
sbi_call(SBI_REMOTE_SFENCE_VMA_ASID, (unsigned long)hart_mask, 0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void sbi_shutdown(void) {
|
|
||||||
sbi_call(SBI_SHUTDOWN, 0, 0, 0);
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
// unreachable!
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -18,6 +18,7 @@ void test_kalloc() {
|
||||||
memset(mem, 0, PGSIZE);
|
memset(mem, 0, PGSIZE);
|
||||||
strncpy(mem, "Hello, xv6-k210", 16);
|
strncpy(mem, "Hello, xv6-k210", 16);
|
||||||
printf("[test_kalloc]mem: %s\n", mem);
|
printf("[test_kalloc]mem: %s\n", mem);
|
||||||
|
kfree(mem);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ptesprint(pagetable_t pagetable, int level){
|
void ptesprint(pagetable_t pagetable, int level){
|
||||||
|
@ -46,15 +47,15 @@ int vmprint(pagetable_t pagetable){
|
||||||
}
|
}
|
||||||
|
|
||||||
void test_vm(unsigned long hart_id) {
|
void test_vm(unsigned long hart_id) {
|
||||||
printf("UART:\n");
|
printf("[test_vm]UART:\n");
|
||||||
printf("[test_vm](kvmpa) va: %p, pa: %p\n", UART0, kvmpa(UART0));
|
printf("[test_vm](kvmpa) va: %p, pa: %p\n", UART0, kvmpa(UART0));
|
||||||
printf("virto mmio:\n");
|
printf("virto mmio:\n");
|
||||||
printf("[test_vm](kvmpa) va: %p, pa: %p\n", VIRTIO0, kvmpa(VIRTIO0));
|
printf("[test_vm](kvmpa) va: %p, pa: %p\n", VIRTIO0, kvmpa(VIRTIO0));
|
||||||
printf("CLINT:\n");
|
printf("[test_vm]CLINT:\n");
|
||||||
printf("[test_vm](kvmpa) va: %p, pa: %p\n", CLINT, kvmpa(CLINT));
|
printf("[test_vm](kvmpa) va: %p, pa: %p\n", CLINT, kvmpa(CLINT));
|
||||||
printf("[test_vm](kvmpa) va: %p, pa: %p\n", CLINT_MTIMECMP(hart_id), kvmpa(CLINT_MTIMECMP(hart_id)));
|
printf("[test_vm](kvmpa) va: %p, pa: %p\n", CLINT_MTIMECMP(hart_id), kvmpa(CLINT_MTIMECMP(hart_id)));
|
||||||
printf("[test_vm](kvmpa) va: %p, pa: %p\n", CLINT_MTIME, kvmpa(CLINT_MTIME));
|
printf("[test_vm](kvmpa) va: %p, pa: %p\n", CLINT_MTIME, kvmpa(CLINT_MTIME));
|
||||||
printf("PLIC\n");
|
printf("[test_vm]PLIC\n");
|
||||||
printf("[test_vm](kvmpa) va: %p, pa: %p\n", PLIC, kvmpa(PLIC));
|
printf("[test_vm](kvmpa) va: %p, pa: %p\n", PLIC, kvmpa(PLIC));
|
||||||
printf("[test_vm](kvmpa) va: %p, pa: %p\n", PLIC_PRIORITY, kvmpa(PLIC_PRIORITY));
|
printf("[test_vm](kvmpa) va: %p, pa: %p\n", PLIC_PRIORITY, kvmpa(PLIC_PRIORITY));
|
||||||
printf("[test_vm](kvmpa) va: %p, pa: %p\n", PLIC_PENDING, kvmpa(PLIC_PENDING));
|
printf("[test_vm](kvmpa) va: %p, pa: %p\n", PLIC_PENDING, kvmpa(PLIC_PENDING));
|
||||||
|
@ -64,22 +65,22 @@ void test_vm(unsigned long hart_id) {
|
||||||
printf("[test_vm](kvmpa) va: %p, pa: %p\n", PLIC_SPRIORITY(hart_id), kvmpa(PLIC_SPRIORITY(hart_id)));
|
printf("[test_vm](kvmpa) va: %p, pa: %p\n", PLIC_SPRIORITY(hart_id), kvmpa(PLIC_SPRIORITY(hart_id)));
|
||||||
printf("[test_vm](kvmpa) va: %p, pa: %p\n", PLIC_MCLAIM(hart_id), kvmpa(PLIC_MCLAIM(hart_id)));
|
printf("[test_vm](kvmpa) va: %p, pa: %p\n", PLIC_MCLAIM(hart_id), kvmpa(PLIC_MCLAIM(hart_id)));
|
||||||
printf("[test_vm](kvmpa) va: %p, pa: %p\n", PLIC_SCLAIM(hart_id), kvmpa(PLIC_SCLAIM(hart_id)));
|
printf("[test_vm](kvmpa) va: %p, pa: %p\n", PLIC_SCLAIM(hart_id), kvmpa(PLIC_SCLAIM(hart_id)));
|
||||||
printf("kernel base:\n");
|
printf("[test_vm]kernel base:\n");
|
||||||
printf("[test_vm](kvmpa) va: %p, pa: %p\n", KERNBASE, kvmpa(KERNBASE));
|
printf("[test_vm](kvmpa) va: %p, pa: %p\n", KERNBASE, kvmpa(KERNBASE));
|
||||||
printf("[test_vm](kvmpa) va: %p, pa: %p\n", KERNBASE + 0x1000, kvmpa(KERNBASE + 0x1000));
|
printf("[test_vm](kvmpa) va: %p, pa: %p\n", KERNBASE + 0x1000, kvmpa(KERNBASE + 0x1000));
|
||||||
printf("[test_vm](kvmpa) va: %p, pa: %p\n", KERNBASE + 0x2000, kvmpa(KERNBASE + 0x2000));
|
printf("[test_vm](kvmpa) va: %p, pa: %p\n", KERNBASE + 0x2000, kvmpa(KERNBASE + 0x2000));
|
||||||
printf("[test_vm](kvmpa) va: %p, pa: %p\n", KERNBASE + 0x3000, kvmpa(KERNBASE + 0x3000));
|
printf("[test_vm](kvmpa) va: %p, pa: %p\n", KERNBASE + 0x3000, kvmpa(KERNBASE + 0x3000));
|
||||||
printf("etext_addr:\n");
|
printf("[test_vm]etext_addr:\n");
|
||||||
printf("[test_vm](kvmpa) va: %p, pa: %p\n", etext_addr, kvmpa(etext_addr));
|
printf("[test_vm](kvmpa) va: %p, pa: %p\n", etext_addr, kvmpa(etext_addr));
|
||||||
printf("[test_vm](kvmpa) va: %p, pa: %p\n", etext_addr + 0x1000, kvmpa(etext_addr + 0x1000));
|
printf("[test_vm](kvmpa) va: %p, pa: %p\n", etext_addr + 0x1000, kvmpa(etext_addr + 0x1000));
|
||||||
printf("[test_vm](kvmpa) va: %p, pa: %p\n", etext_addr + 0x2000, kvmpa(etext_addr + 0x2000));
|
printf("[test_vm](kvmpa) va: %p, pa: %p\n", etext_addr + 0x2000, kvmpa(etext_addr + 0x2000));
|
||||||
printf("[test_vm](kvmpa) va: %p, pa: %p\n", etext_addr + 0x3000, kvmpa(etext_addr + 0x3000));
|
printf("[test_vm](kvmpa) va: %p, pa: %p\n", etext_addr + 0x3000, kvmpa(etext_addr + 0x3000));
|
||||||
printf("trampoline:\n");
|
printf("[test_vm]trampoline:\n");
|
||||||
printf("[test_vm](kvmpa) va: %p, pa: %p\n", TRAMPOLINE, kvmpa(TRAMPOLINE));
|
printf("[test_vm](kvmpa) va: %p, pa: %p\n", TRAMPOLINE, kvmpa(TRAMPOLINE));
|
||||||
printf("[test_vm](kvmpa) va: %p, pa: %p\n", TRAMPOLINE + PGSIZE - 1, kvmpa(TRAMPOLINE + PGSIZE - 1));
|
printf("[test_vm](kvmpa) va: %p, pa: %p\n", TRAMPOLINE + PGSIZE - 1, kvmpa(TRAMPOLINE + PGSIZE - 1));
|
||||||
printf("[test_vm]create test pagetable\n");
|
printf("[test_vm]create test pagetable\n");
|
||||||
pagetable_t test_pagetable = uvmcreate();
|
pagetable_t test_pagetable = uvmcreate();
|
||||||
printf("test_pagetable: %p\n", test_pagetable);
|
printf("[test_vm]test_pagetable: %p\n", test_pagetable);
|
||||||
char *test_mem = kalloc();
|
char *test_mem = kalloc();
|
||||||
memset(test_mem, 0, PGSIZE);
|
memset(test_mem, 0, PGSIZE);
|
||||||
if(mappages(test_pagetable, 0, PGSIZE, (uint64)test_mem, PTE_R | PTE_W | PTE_U | PTE_X) != 0) {
|
if(mappages(test_pagetable, 0, PGSIZE, (uint64)test_mem, PTE_R | PTE_W | PTE_U | PTE_X) != 0) {
|
||||||
|
@ -90,8 +91,8 @@ void test_vm(unsigned long hart_id) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void test_sdcard() {
|
void test_sdcard() {
|
||||||
uint8 buffer[20];
|
uint8 *buffer = kalloc();
|
||||||
uint8 pre_buffer[20];
|
uint8 *pre_buffer = kalloc();
|
||||||
memset(buffer, 0, sizeof(buffer));
|
memset(buffer, 0, sizeof(buffer));
|
||||||
if(sd_read_sector(pre_buffer, 0, sizeof(pre_buffer))) {
|
if(sd_read_sector(pre_buffer, 0, sizeof(pre_buffer))) {
|
||||||
printf("[test_sdcard]SD card read sector err\n");
|
printf("[test_sdcard]SD card read sector err\n");
|
||||||
|
@ -118,4 +119,6 @@ void test_sdcard() {
|
||||||
} else {
|
} else {
|
||||||
printf("[test_sdcard]SD card recover succeed\n");
|
printf("[test_sdcard]SD card recover succeed\n");
|
||||||
}
|
}
|
||||||
|
kfree(buffer);
|
||||||
|
kfree(pre_buffer);
|
||||||
}
|
}
|
Loading…
Reference in New Issue