Changeset de7663f in mainline
- Timestamp:
- 2007-06-13T18:39:31Z (17 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 341140c
- Parents:
- c03ee1c
- Files:
-
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
boot/arch/arm32/loader/asm.h
rc03ee1c rde7663f 63 63 * @param bootinfo_size Size of the bootinfo structure. 64 64 */ 65 extern void jump_to_kernel(void *entry, void *bootinfo, unsigned int bootinfo_size) __attribute__((noreturn)); 65 extern void jump_to_kernel(void *entry, void *bootinfo, 66 unsigned int bootinfo_size) __attribute__((noreturn)); 66 67 67 68 68 69 #endif 69 70 70 71 71 /** @} 72 72 */ 73 -
boot/arch/arm32/loader/main.h
rc03ee1c rde7663f 69 69 70 70 71 72 71 extern void bootstrap(void); 73 72 -
boot/arch/arm32/loader/mm.c
rc03ee1c rde7663f 43 43 * Will be readable/writable by kernel with no access from user mode. 44 44 * Will belong to domain 0. No cache or buffering is enabled. 45 * 46 * @param pte 47 * @param frame 45 * 46 * @param pte Section entry to initialize. 47 * @param frame First frame in the section (frame number). 48 48 * 49 * @note If frame is not 1MB aligned, first lower 1MB aligned frame will be used. 50 */ 51 static void init_pte_level0_section(pte_level0_section_t* pte, unsigned int frame) 49 * @note If frame is not 1MB aligned, first lower 1MB aligned frame will be 50 * used. 51 */ 52 static void init_pte_level0_section(pte_level0_section_t* pte, 53 unsigned int frame) 52 54 { 53 pte->descriptor_type 54 pte->bufferable 55 pte->cacheable = 0;56 pte->impl_specific 57 pte->domain 55 pte->descriptor_type = PTE_DESCRIPTOR_SECTION; 56 pte->bufferable = 0; 57 pte->cacheable = 0; 58 pte->impl_specific = 0; 59 pte->domain = 0; 58 60 pte->should_be_zero_1 = 0; 59 pte->access_permission = PTE_AP_USER_NO_KERNEL_RW; 61 pte->access_permission = PTE_AP_USER_NO_KERNEL_RW; 60 62 pte->should_be_zero_2 = 0; 61 63 pte->section_base_addr = frame; 62 64 } 63 64 65 65 66 /** Initializes page table used while booting the kernel. */ … … 69 70 const unsigned int first_kernel_page = ADDR2PFN(PA2KA(0)); 70 71 71 / / create 1:1 virtual-physical mapping (in lower 2GB)72 /* Create 1:1 virtual-physical mapping (in lower 2GB). */ 72 73 for (i = 0; i < first_kernel_page; i++) { 73 74 init_pte_level0_section(&page_table[i], i); 74 75 } 75 76 76 // create 1:1 virtual-physical mapping in kernel space (upper 2GB), 77 // physical addresses start from 0 77 /* 78 * Create 1:1 virtual-physical mapping in kernel space (upper 2GB), 79 * physical addresses start from 0. 80 */ 78 81 for (i = first_kernel_page; i < PTL0_ENTRIES; i++) { 79 82 init_pte_level0_section(&page_table[i], i - first_kernel_page); 80 83 } 81 84 } 82 83 85 84 86 /** Starts the MMU - initializes page table and enables paging. */ … … 89 91 } 90 92 91 92 93 /** @} 93 94 */ 94 95 -
boot/arch/arm32/loader/mm.h
rc03ee1c rde7663f 1 1 /* 2 * Copyright (c) 2007 Pavel Jancik, Michal Kebrt 2 * Copyright (c) 2007 Pavel Jancik 3 * Copyright (c) 2007 Michal Kebrt 3 4 * All rights reserved. 4 5 * … … 34 35 * @brief Memory management used while booting the kernel. 35 36 * 36 * So called "section" paging is used while booting the kernel. The term "section" 37 * comes from the ARM architecture specification and stands for the following: 38 * one-level paging, 1MB sized pages, 4096 entries in the page table. 37 * So called "section" paging is used while booting the kernel. The term 38 * "section" comes from the ARM architecture specification and stands for the 39 * following: one-level paging, 1MB sized pages, 4096 entries in the page 40 * table. 39 41 */ 40 42 … … 50 52 51 53 /** Frame width. */ 52 #define FRAME_WIDTH 54 #define FRAME_WIDTH 20 53 55 54 56 /** Frame size. */ 55 #define FRAME_SIZE 57 #define FRAME_SIZE (1 << FRAME_WIDTH) 56 58 57 /** Page size in 2-level paging which is switched on later after the kernel initialization. */ 58 #define KERNEL_PAGE_SIZE (1 << 12) 59 /** Page size in 2-level paging which is switched on later after the kernel 60 * initialization. 61 */ 62 #define KERNEL_PAGE_SIZE (1 << 12) 59 63 60 64 61 65 #ifndef __ASM__ 62 66 /** Converts kernel address to physical address. */ 63 # define KA2PA(x) 67 # define KA2PA(x) (((uintptr_t) (x)) - 0x80000000) 64 68 /** Converts physical address to kernel address. */ 65 # define PA2KA(x) 69 # define PA2KA(x) (((uintptr_t) (x)) + 0x80000000) 66 70 #else 67 # define KA2PA(x) 68 # define PA2KA(x) 71 # define KA2PA(x) ((x) - 0x80000000) 72 # define PA2KA(x) ((x) + 0x80000000) 69 73 #endif 70 74 71 75 72 76 /** Number of entries in PTL0. */ 73 #define PTL0_ENTRIES (1<<12)/* 4096 */77 #define PTL0_ENTRIES (1 << 12) /* 4096 */ 74 78 75 79 /** Size of an entry in PTL0. */ 76 #define PTL0_ENTRY_SIZE 80 #define PTL0_ENTRY_SIZE 4 77 81 78 82 /** Returns number of frame the address belongs to. */ 79 #define ADDR2PFN( addr ) ( ((uintptr_t)(addr)) >> FRAME_WIDTH)83 #define ADDR2PFN(addr) (((uintptr_t) (addr)) >> FRAME_WIDTH) 80 84 81 85 /** Describes "section" page table entry (one-level paging with 1MB sized pages). */ 82 #define PTE_DESCRIPTOR_SECTION 86 #define PTE_DESCRIPTOR_SECTION 0x2 83 87 84 88 /** Page table access rights: user - no access, kernel - read/write. */ 85 #define PTE_AP_USER_NO_KERNEL_RW 89 #define PTE_AP_USER_NO_KERNEL_RW 0x1 86 90 87 91 … … 89 93 90 94 91 /** Page table level 0 entry - "section" format is used (one-level paging, 1MB sized92 * pages). Used only while booting the kernel.95 /** Page table level 0 entry - "section" format is used (one-level paging, 1MB 96 * sized pages). Used only while booting the kernel. 93 97 */ 94 98 typedef struct { 95 unsigned descriptor_type 96 unsigned bufferable 97 unsigned cacheable 98 unsigned impl_specific 99 unsigned domain 100 unsigned should_be_zero_1 101 unsigned access_permission 102 unsigned should_be_zero_2 103 unsigned section_base_addr 99 unsigned descriptor_type : 2; 100 unsigned bufferable : 1; 101 unsigned cacheable : 1; 102 unsigned impl_specific : 1; 103 unsigned domain : 4; 104 unsigned should_be_zero_1 : 1; 105 unsigned access_permission : 2; 106 unsigned should_be_zero_2 : 8; 107 unsigned section_base_addr : 12; 104 108 } __attribute__ ((packed)) pte_level0_section_t; 105 109 106 110 107 /** Page table that holds 1:1 virtual to physical mapping used while booting the kernel. */ 111 /** Page table that holds 1:1 virtual to physical mapping used while booting the 112 * kernel. 113 */ 108 114 extern pte_level0_section_t page_table[PTL0_ENTRIES]; 109 115 … … 118 124 */ 119 125 asm volatile ( 120 / / behave as a client of domains121 "ldr r0, =0x55555555 122 "mcr p15, 0, r0, c3, c0, 0 126 /* behave as a client of domains */ 127 "ldr r0, =0x55555555\n" 128 "mcr p15, 0, r0, c3, c0, 0\n" 123 129 124 / / current settings125 "mrc p15, 0, r0, c1, c0, 0 130 /* current settings */ 131 "mrc p15, 0, r0, c1, c0, 0\n" 126 132 127 / / mask to enable paging128 "ldr r1, =0x00000001 129 "orr r0, r0, r1 133 /* mask to enable paging */ 134 "ldr r1, =0x00000001\n" 135 "orr r0, r0, r1\n" 130 136 131 / / store settings132 "mcr p15, 0, r0, c1, c0, 0 137 /* store settings */ 138 "mcr p15, 0, r0, c1, c0, 0\n" 133 139 : 134 140 : … … 144 150 static inline void set_ptl0_address(pte_level0_section_t* pt) 145 151 { 146 147 "mcr p15, 0, %0, c2, c0, 0 152 asm volatile ( 153 "mcr p15, 0, %0, c2, c0, 0\n" 148 154 : 149 : "r" (pt)150 155 : "r" (pt) 156 ); 151 157 } 152 158 -
boot/arch/arm32/loader/print/gxemul.c
rc03ee1c rde7663f 49 49 static void putc(char ch) 50 50 { 51 *((volatile char *) PUTC_ADDRESS) = ch;51 *((volatile char *) PUTC_ADDRESS) = ch; 52 52 } 53 53 -
boot/arch/arm32/loader/types.h
rc03ee1c rde7663f 58 58 /** @} 59 59 */ 60 -
boot/arch/mips32/loader/asm.h
rc03ee1c rde7663f 27 27 */ 28 28 29 #ifndef __ASM_H__30 #define __ASM_H__29 #ifndef BOOT_mips32_ASM_H_ 30 #define BOOT_mips32_ASM_H_ 31 31 32 32 #define PAGE_SIZE 16384 33 33 #define PAGE_WIDTH 14 34 34 35 #define memcpy(dst, src, cnt) 35 #define memcpy(dst, src, cnt) __builtin_memcpy((dst), (src), (cnt)) 36 36 37 37 void jump_to_kernel(void *entry, void *bootinfo, unsigned int bootinfo_size) __attribute__((noreturn)); -
boot/arch/mips32/loader/main.h
rc03ee1c rde7663f 27 27 */ 28 28 29 #ifndef __MAIN_H__30 #define __MAIN_H__29 #ifndef BOOT_mips32_MAIN_H_ 30 #define BOOT_mips32_MAIN_H_ 31 31 32 32 /** Align to the nearest higher address. -
boot/arch/mips32/loader/msim.h
rc03ee1c rde7663f 27 27 */ 28 28 29 #ifndef __MSIM_H__30 #define __MSIM_H__29 #ifndef BOOT_mips32_MSIM_H_ 30 #define BOOT_mips32_MSIM_H_ 31 31 32 32 extern void init(void); -
boot/arch/mips32/loader/regname.h
rc03ee1c rde7663f 27 27 */ 28 28 29 #ifndef __mips32_REGNAME_H_30 #define __mips32_REGNAME_H_29 #ifndef BOOT_mips32_REGNAME_H_ 30 #define BOOT_mips32_REGNAME_H_ 31 31 32 32 #define zero 0 … … 86 86 #define eepc 30 87 87 88 89 88 #endif /* _REGNAME_H_ */ -
boot/arch/mips32/loader/types.h
rc03ee1c rde7663f 27 27 */ 28 28 29 #ifndef TYPES_H__30 #define TYPES_H__29 #ifndef BOOT_mips32_TYPES_H_ 30 #define BOOT_mips32_TYPES_H_ 31 31 32 32 #include <gentypes.h> -
uspace/libc/arch/arm32/include/atomic.h
rc03ee1c rde7663f 50 50 51 51 asm volatile ( 52 "1:\n"53 "ldr r2, [%1] 54 "add r3, r2, %2 55 "str r3, %0 56 "swp r3, r3, [%1] 57 "cmp r3, r2 58 "bne 1b 52 "1:\n" 53 "ldr r2, [%1]\n" 54 "add r3, r2, %2\n" 55 "str r3, %0\n" 56 "swp r3, r3, [%1]\n" 57 "cmp r3, r2\n" 58 "bne 1b\n" 59 59 60 60 : "=m" (ret) … … 71 71 * @param val Variable to be incremented. 72 72 */ 73 static inline void atomic_inc(atomic_t *val) { atomic_add(val, 1); } 73 static inline void atomic_inc(atomic_t *val) 74 { 75 atomic_add(val, 1); 76 } 74 77 75 78 … … 78 81 * @param val Variable to be decremented. 79 82 */ 80 static inline void atomic_dec(atomic_t *val) { atomic_add(val, -1); } 83 static inline void atomic_dec(atomic_t *val) 84 { 85 atomic_add(val, -1); 86 } 81 87 82 88 … … 86 92 * @return Value after incrementation. 87 93 */ 88 static inline long atomic_preinc(atomic_t *val) { return atomic_add(val, 1); } 94 static inline long atomic_preinc(atomic_t *val) 95 { 96 return atomic_add(val, 1); 97 } 89 98 90 99 … … 94 103 * @return Value after decrementation. 95 104 */ 96 static inline long atomic_predec(atomic_t *val) { return atomic_add(val, -1); } 105 static inline long atomic_predec(atomic_t *val) 106 { 107 return atomic_add(val, -1); 108 } 97 109 98 110 … … 102 114 * @return Value before incrementation. 103 115 */ 104 static inline long atomic_postinc(atomic_t *val) { return atomic_add(val, 1) - 1; } 116 static inline long atomic_postinc(atomic_t *val) 117 { 118 return atomic_add(val, 1) - 1; 119 } 105 120 106 121 … … 110 125 * @return Value before decrementation. 111 126 */ 112 static inline long atomic_postdec(atomic_t *val) { return atomic_add(val, -1) + 1; } 127 static inline long atomic_postdec(atomic_t *val) 128 { 129 return atomic_add(val, -1) + 1; 130 } 113 131 114 132 -
uspace/libc/arch/arm32/include/thread.h
rc03ee1c rde7663f 61 61 static inline void __tcb_set(tcb_t *tcb) 62 62 { 63 void *tls = (void *) tcb;63 void *tls = (void *) tcb; 64 64 tls += sizeof(tcb_t) + ARM_TP_OFFSET; 65 65 asm volatile ( … … 82 82 : "=r"(ret) 83 83 ); 84 return (tcb_t *) (ret - ARM_TP_OFFSET - sizeof(tcb_t));84 return (tcb_t *) (ret - ARM_TP_OFFSET - sizeof(tcb_t)); 85 85 } 86 86
Note:
See TracChangeset
for help on using the changeset viewer.