Changeset a35b458 in mainline for kernel/arch/riscv64
- Timestamp:
- 2018-03-02T20:10:49Z (8 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f1380b7
- Parents:
- 3061bc1
- git-author:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-02-28 17:38:31)
- git-committer:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-03-02 20:10:49)
- Location:
- kernel/arch/riscv64
- Files:
-
- 10 edited
-
include/arch/asm.h (modified) (5 diffs)
-
include/arch/atomic.h (modified) (8 diffs)
-
include/arch/cycle.h (modified) (1 diff)
-
include/arch/mm/page.h (modified) (2 diffs)
-
src/boot/boot.S (modified) (1 diff)
-
src/context.S (modified) (2 diffs)
-
src/drivers/ucb.c (modified) (3 diffs)
-
src/mm/frame.c (modified) (4 diffs)
-
src/mm/page.c (modified) (3 diffs)
-
src/riscv64.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/riscv64/include/arch/asm.h
r3061bc1 ra35b458 45 45 { 46 46 ipl_t ipl; 47 47 48 48 asm volatile ( 49 49 "csrrsi %[ipl], sstatus, " STRING(SSTATUS_SIE_MASK) "\n" 50 50 : [ipl] "=r" (ipl) 51 51 ); 52 52 53 53 return ipl; 54 54 } … … 57 57 { 58 58 ipl_t ipl; 59 59 60 60 asm volatile ( 61 61 "csrrci %[ipl], sstatus, " STRING(SSTATUS_SIE_MASK) "\n" 62 62 : [ipl] "=r" (ipl) 63 63 ); 64 64 65 65 return ipl; 66 66 } … … 77 77 { 78 78 ipl_t ipl; 79 79 80 80 asm volatile ( 81 81 "csrr %[ipl], sstatus\n" 82 82 : [ipl] "=r" (ipl) 83 83 ); 84 84 85 85 return ipl; 86 86 } … … 94 94 { 95 95 uintptr_t base; 96 96 97 97 asm volatile ( 98 98 "and %[base], sp, %[mask]\n" … … 100 100 : [mask] "r" (~(STACK_SIZE - 1)) 101 101 ); 102 102 103 103 return base; 104 104 } -
kernel/arch/riscv64/include/arch/atomic.h
r3061bc1 ra35b458 59 59 { 60 60 atomic_count_t orig; 61 61 62 62 asm volatile ( 63 63 "amoadd.d %[orig], %[inc], %[addr]\n" … … 65 65 : [inc] "r" (1) 66 66 ); 67 67 68 68 return orig; 69 69 } … … 72 72 { 73 73 atomic_count_t orig; 74 74 75 75 asm volatile ( 76 76 "amoadd.d %[orig], %[inc], %[addr]\n" … … 78 78 : [inc] "r" (-1) 79 79 ); 80 80 81 81 return orig; 82 82 } … … 85 85 { 86 86 atomic_count_t orig; 87 87 88 88 asm volatile ( 89 89 "amoadd.d %[orig], %[inc], %[addr]\n" … … 91 91 : [inc] "r" (1) 92 92 ); 93 93 94 94 return orig - 1; 95 95 } … … 98 98 { 99 99 atomic_count_t orig; 100 100 101 101 asm volatile ( 102 102 "amoadd.d %[orig], %[inc], %[addr]\n" … … 104 104 : [inc] "r" (-1) 105 105 ); 106 106 107 107 return orig + 1; 108 108 } -
kernel/arch/riscv64/include/arch/cycle.h
r3061bc1 ra35b458 41 41 { 42 42 uint64_t cycle; 43 43 44 44 asm volatile ( 45 45 "rdcycle %[cycle]\n" 46 46 : [cycle] "=r" (cycle) 47 47 ); 48 48 49 49 return cycle; 50 50 } -
kernel/arch/riscv64/include/arch/mm/page.h
r3061bc1 ra35b458 182 182 { 183 183 pte_t *entry = &pt[i]; 184 184 185 185 return (((!entry->valid) << PAGE_PRESENT_SHIFT) | 186 186 (entry->user << PAGE_USER_SHIFT) | … … 194 194 { 195 195 pte_t *entry = &pt[i]; 196 196 197 197 entry->valid = !(flags & PAGE_NOT_PRESENT); 198 198 entry->readable = (flags & PAGE_READ) != 0; -
kernel/arch/riscv64/src/boot/boot.S
r3061bc1 ra35b458 36 36 /* Setup temporary stack */ 37 37 la sp, temp_stack 38 38 39 39 /* Create the first stack frame */ 40 40 addi sp, sp, -16 41 41 42 42 /* Call riscv64_pre_main() */ 43 43 jal riscv64_pre_main 44 44 45 45 /* Call main_bsp() */ 46 46 jal main_bsp 47 47 48 48 /* Not reached */ 49 49 csrci sstatus, SSTATUS_SIE_MASK -
kernel/arch/riscv64/src/context.S
r3061bc1 ra35b458 47 47 sd s10, CONTEXT_OFFSET_S10(a0) 48 48 sd s11, CONTEXT_OFFSET_S11(a0) 49 49 50 50 sd ra, CONTEXT_OFFSET_PC(a0) 51 51 sd sp, CONTEXT_OFFSET_SP(a0) 52 52 53 53 # context_save returns 1 54 54 li a0, 1 … … 71 71 ld s10, CONTEXT_OFFSET_S10(a0) 72 72 ld s11, CONTEXT_OFFSET_S11(a0) 73 73 74 74 ld ra, CONTEXT_OFFSET_PC(a0) 75 75 ld sp, CONTEXT_OFFSET_SP(a0) 76 76 77 77 # context_restore returns 0 78 78 li a0, 0 -
kernel/arch/riscv64/src/drivers/ucb.c
r3061bc1 ra35b458 53 53 if (!val) 54 54 return; 55 55 56 56 *fromhost = 0; 57 57 } … … 68 68 if (!htifdev) 69 69 return NULL; 70 70 71 71 outdev_initialize("htifdev", htifdev, &htifdev_ops); 72 72 return htifdev; … … 78 78 (((uint64_t) cmd) << 48) | 79 79 (payload & UINT64_C(0xffffffffffff)); 80 80 81 81 while (*tohost) 82 82 poll_fromhost(); 83 83 84 84 *tohost = val; 85 85 } -
kernel/arch/riscv64/src/mm/frame.c
r3061bc1 ra35b458 56 56 pfn_t minconf = 57 57 max3(ADDR2PFN(physmem_start), htif_frame + 1, pt_frame + 1); 58 58 59 59 for (size_t i = 0; i < memmap.cnt; i++) { 60 60 /* To be safe, make the available zone possibly smaller */ … … 63 63 size_t size = ALIGN_DOWN(memmap.zones[i].size - 64 64 (base - ((uintptr_t) memmap.zones[i].start)), FRAME_SIZE); 65 65 66 66 if (!frame_adjust_zone_bounds(low, &base, &size)) 67 67 return; 68 68 69 69 pfn_t pfn = ADDR2PFN(base); 70 70 size_t count = SIZE2FRAMES(size); 71 71 pfn_t conf; 72 72 73 73 if (low) { 74 74 if ((minconf < pfn) || (minconf >= pfn + count)) … … 76 76 else 77 77 conf = minconf; 78 78 79 79 zone_create(pfn, count, conf, 80 80 ZONE_AVAILABLE | ZONE_LOWMEM); … … 91 91 { 92 92 frame_common_arch_init(true); 93 93 94 94 frame_mark_unavailable(htif_frame, 1); 95 95 frame_mark_unavailable(pt_frame, 1); -
kernel/arch/riscv64/src/mm/page.c
r3061bc1 ra35b458 53 53 if (config.cpu_active == 1) { 54 54 page_mapping_operations = &pt_mapping_operations; 55 55 56 56 page_table_lock(AS_KERNEL, true); 57 57 58 58 /* 59 59 * PA2KA(identity) mapping for all low-memory frames. … … 64 64 page_mapping_insert(AS_KERNEL, PA2KA(cur), cur, 65 65 PAGE_GLOBAL | PAGE_CACHEABLE | PAGE_EXEC | PAGE_WRITE | PAGE_READ); 66 66 67 67 page_table_unlock(AS_KERNEL, true); 68 68 69 69 // FIXME: register page fault extension handler 70 70 71 71 write_satp((uintptr_t) AS_KERNEL->genarch.page_table); 72 72 73 73 /* The boot page table is no longer needed. */ 74 74 // FIXME: frame_mark_available(pt_frame, 1); … … 84 84 uint64_t satp = ((ptl0 >> FRAME_WIDTH) & SATP_PFN_MASK) | 85 85 SATP_MODE_SV48; 86 86 87 87 asm volatile ( 88 88 "csrw sptbr, %[satp]\n" -
kernel/arch/riscv64/src/riscv64.c
r3061bc1 ra35b458 69 69 htif_frame = bootinfo->htif_frame; 70 70 pt_frame = bootinfo->pt_frame; 71 71 72 72 htif_init(bootinfo->ucbinfo.tohost, bootinfo->ucbinfo.fromhost); 73 73 74 74 /* Copy tasks map. */ 75 75 init.cnt = min3(bootinfo->taskmap.cnt, TASKMAP_MAX_RECORDS, 76 76 CONFIG_INIT_TASKS); 77 77 78 78 for (size_t i = 0; i < init.cnt; i++) { 79 79 init.tasks[i].paddr = KA2PA(bootinfo->taskmap.tasks[i].addr); … … 82 82 bootinfo->taskmap.tasks[i].name); 83 83 } 84 84 85 85 /* Copy physical memory map. */ 86 86 memmap.total = bootinfo->memmap.total;
Note:
See TracChangeset
for help on using the changeset viewer.
