Changes in / [e882e3a:fb8dcb4] in mainline
- Files:
-
- 20 added
- 6 deleted
- 35 edited
Legend:
- Unmodified
- Added
- Removed
-
HelenOS.config
re882e3a rfb8dcb4 65 65 @ "testarm" GXEmul Testarm 66 66 @ "integratorcp" Integratorcp 67 @ "beagleboardxm" BeogleBoard-xM 67 68 ! [PLATFORM=arm32] MACHINE (choice) 68 69 … … 86 87 ! [PLATFORM=sparc64&MACHINE=generic] PROCESSOR (choice) 87 88 89 % CPU type 90 @ "armv4" ARMv4 91 ! [PLATFORM=arm32&(MACHINE=gta02|MACHINE=gxemul)] PROCESSOR (choice) 92 93 % CPU type 94 @ "armv5" ARMv5 95 ! [PLATFORM=arm32&MACHINE=integratorcp] PROCESSOR (choice) 96 97 % CPU type 98 @ "armv7" ARMv7 99 ! [PLATFORM=arm32&MACHINE=beagleboardxm] PROCESSOR (choice) 100 101 88 102 % RAM disk format 89 103 @ "tmpfs" TMPFS image … … 408 422 % Output device class 409 423 @ "generic" Monitor or serial line 410 ! [PLATFORM=arm32&(MACHINE=gta02|MACHINE=integratorcp )] CONFIG_HID_OUT (choice)424 ! [PLATFORM=arm32&(MACHINE=gta02|MACHINE=integratorcp|MACHINE=beagleboardxm)] CONFIG_HID_OUT (choice) 411 425 412 426 % Output device class … … 465 479 ! [PLATFORM=arm32&MACHINE=gta02] CONFIG_S3C24XX_IRQC (y) 466 480 481 % Support for TI AMDM37X on-chip UART 482 ! [(CONFIG_HID_OUT=generic|CONFIG_HID_OUT=serial)&PLATFORM=arm32&MACHINE=beagleboardxm] CONFIG_AMDM37X_UART (y/n) 483 467 484 % Support for i8042 controller 468 485 ! [CONFIG_PC_KBD=y] CONFIG_I8042 (y) … … 484 501 485 502 % Serial line input module 486 ! [CONFIG_DSRLNIN=y|(PLATFORM=arm32&MACHINE=gta02)|(PLATFORM= ia64&MACHINE=i460GX&CONFIG_NS16550=y)|(PLATFORM=ia64&MACHINE=ski)|(PLATFORM=sparc64&PROCESSOR=sun4v)] CONFIG_SRLN (y)503 ! [CONFIG_DSRLNIN=y|(PLATFORM=arm32&MACHINE=gta02)|(PLATFORM=arm32&MACHINE=beagleboardxm)|(PLATFORM=ia64&MACHINE=i460GX&CONFIG_NS16550=y)|(PLATFORM=ia64&MACHINE=ski)|(PLATFORM=sparc64&PROCESSOR=sun4v)] CONFIG_SRLN (y) 487 504 488 505 % EGA support -
boot/Makefile.uboot
re882e3a rfb8dcb4 40 40 41 41 $(POST_OUTPUT): $(BIN_OUTPUT) 42 $(MKUIMAGE) -name "$(IMAGE_NAME)" -laddr 0x30008000 -saddr 0x30008000$< $@42 $(MKUIMAGE) -name "$(IMAGE_NAME)" -laddr $(LADDR) -saddr $(SADDR) $< $@ 43 43 44 44 clean: -
boot/arch/arm32/Makefile.inc
re882e3a rfb8dcb4 30 30 BOOT_OUTPUT = image.boot 31 31 POST_OUTPUT = $(ROOT_PATH)/uImage.bin 32 LADDR = 0x30008000 33 SADDR = 0x30008000 34 POSTBUILD = Makefile.uboot 35 endif 36 37 ifeq ($(MACHINE), beagleboardxm) 38 BOOT_OUTPUT = image.boot 39 POST_OUTPUT = $(ROOT_PATH)/uImage.bin 40 LADDR = 0x80000000 41 SADDR = 0x80000000 32 42 POSTBUILD = Makefile.uboot 33 43 endif … … 40 50 ENDIANESS = LE 41 51 52 ifeq ($(MACHINE), gta02) 42 53 RD_SRVS_ESSENTIAL += \ 43 54 $(USPACE_PATH)/srv/hid/s3c24xx_ts/s3c24ts \ 44 55 $(USPACE_PATH)/srv/hw/char/s3c24xx_uart/s3c24ser 56 endif 45 57 58 ifeq ($(MACHINE), gxemul) 46 59 RD_SRVS_NON_ESSENTIAL += \ 47 60 $(USPACE_PATH)/srv/bd/gxe_bd/gxe_bd 61 endif 62 63 RD_DRVS += \ 64 infrastructure/rootamdm37x \ 65 bus/usb/ehci \ 66 bus/usb/ohci \ 67 bus/usb/usbflbk \ 68 bus/usb/usbhub \ 69 bus/usb/usbhid \ 70 bus/usb/usbmast \ 71 bus/usb/usbmid 48 72 49 73 SOURCES = \ -
boot/arch/arm32/include/arch.h
re882e3a rfb8dcb4 42 42 #ifdef MACHINE_gta02 43 43 #define BOOT_BASE 0x30008000 44 #elif defined MACHINE_beagleboardxm 45 #define BOOT_BASE 0x80000000 44 46 #else 45 47 #define BOOT_BASE 0x00000000 … … 48 50 #define BOOT_OFFSET (BOOT_BASE + 0xa00000) 49 51 52 #ifdef MACHINE_beagleboardxm 53 #define PA_OFFSET 0 54 #else 55 #define PA_OFFSET 0x80000000 56 #endif 57 50 58 #ifndef __ASM__ 51 #define PA2KA(addr) (((uintptr_t) (addr)) + 0x80000000)59 #define PA2KA(addr) (((uintptr_t) (addr)) + PA_OFFSET) 52 60 #else 53 #define PA2KA(addr) ((addr) + 0x80000000)61 #define PA2KA(addr) ((addr) + PA_OFFSET) 54 62 #endif 63 55 64 56 65 #endif -
boot/arch/arm32/include/main.h
re882e3a rfb8dcb4 40 40 /** Address where characters to be printed are expected. */ 41 41 42 43 /** BeagleBoard-xM UART register address 44 * 45 * This is UART3 of AM/DM37x CPU 46 */ 47 #define BBXM_SCONS_THR 0x49020000 48 #define BBXM_SCONS_SSR 0x49020044 49 50 /* Check this bit before writing (tx fifo full) */ 51 #define BBXM_THR_FULL 0x00000001 52 53 42 54 /** GTA02 serial console UART register addresses. 43 55 * -
boot/arch/arm32/include/mm.h
re882e3a rfb8dcb4 58 58 unsigned int bufferable : 1; 59 59 unsigned int cacheable : 1; 60 unsigned int impl_specific: 1;60 unsigned int xn : 1; 61 61 unsigned int domain : 4; 62 62 unsigned int should_be_zero_1 : 1; 63 unsigned int access_permission : 2; 64 unsigned int should_be_zero_2 : 8; 63 unsigned int access_permission_0 : 2; 64 unsigned int tex : 3; 65 unsigned int access_permission_1 : 2; 66 unsigned int non_global : 1; 67 unsigned int should_be_zero_2 : 1; 68 unsigned int non_secure : 1; 65 69 unsigned int section_base_addr : 12; 66 70 } __attribute__((packed)) pte_level0_section_t; -
boot/arch/arm32/src/mm.c
re882e3a rfb8dcb4 54 54 { 55 55 pte->descriptor_type = PTE_DESCRIPTOR_SECTION; 56 pte->bufferable = 0;56 pte->bufferable = 1; 57 57 pte->cacheable = 0; 58 pte-> impl_specific= 0;58 pte->xn = 0; 59 59 pte->domain = 0; 60 60 pte->should_be_zero_1 = 0; 61 pte->access_permission = PTE_AP_USER_NO_KERNEL_RW; 61 pte->access_permission_0 = PTE_AP_USER_NO_KERNEL_RW; 62 pte->tex = 0; 63 pte->access_permission_1 = 0; 64 pte->non_global = 0; 62 65 pte->should_be_zero_2 = 0; 66 pte->non_secure = 0; 63 67 pte->section_base_addr = frame; 64 68 } … … 67 71 static void init_boot_pt(void) 68 72 { 69 pfn_t split_page = 0x800; 70 73 const pfn_t split_page = PTL0_ENTRIES; 71 74 /* Create 1:1 virtual-physical mapping (in lower 2 GB). */ 72 75 pfn_t page; … … 78 81 * (upper 2 GB), physical addresses start from 0. 79 82 */ 83 /* BeagleBoard-xM (MD37x) memory starts at 2GB border, 84 * thus mapping only lower 2GB is not not enough. 85 * Map entire AS 1:1 instead and hope it works. */ 80 86 for (page = split_page; page < PTL0_ENTRIES; page++) 87 #ifndef MACHINE_beagleboardxm 81 88 init_ptl0_section(&boot_pt[page], page - split_page); 89 #else 90 init_ptl0_section(&boot_pt[page], page); 91 #endif 82 92 83 93 asm volatile ( … … 95 105 /* Behave as a client of domains */ 96 106 "ldr r0, =0x55555555\n" 97 "mcr p15, 0, r0, c3, c0, 0\n" 107 "mcr p15, 0, r0, c3, c0, 0\n" 98 108 109 #ifdef PROCESSOR_armv7 110 /* Clean L2 cache */ 111 "mov r12, #0x1\n" //set up to invalidate L2 112 "smc #0\n" //Call SMI monitor 113 114 /* Read Auxiliary control register */ 115 "mrc p15, 0, r0, c1, c0, 1\n" 116 /* Mask to enable L2 cache */ 117 "ldr r1, =0x00000002\n" 118 "orr r0, r0, r1\n" 119 /* Store Auxiliary control register */ 120 "mrc p15, 0, r0, c1, c0, 1\n" 121 #endif 99 122 /* Current settings */ 100 123 "mrc p15, 0, r0, c1, c0, 0\n" 101 124 125 #ifdef PROCESSOR_armv7 126 /* Mask to enable paging, alignment and caching */ 127 "ldr r1, =0x00000007\n" 128 #else 102 129 /* Mask to enable paging */ 103 130 "ldr r1, =0x00000001\n" 131 #endif 104 132 "orr r0, r0, r1\n" 105 133 -
boot/arch/arm32/src/putchar.c
re882e3a rfb8dcb4 40 40 #include <putchar.h> 41 41 #include <str.h> 42 43 #ifdef MACHINE_beagleboardxm 44 45 /** Send a byte to the amdm37x serial console. 46 * 47 * @param byte Byte to send. 48 */ 49 static void scons_sendb_bbxm(uint8_t byte) 50 { 51 volatile uint32_t *thr = 52 (volatile uint32_t *)BBXM_SCONS_THR; 53 volatile uint32_t *ssr = 54 (volatile uint32_t *)BBXM_SCONS_SSR; 55 56 /* Wait until transmitter is empty. */ 57 while ((*ssr & BBXM_THR_FULL) == 1) ; 58 59 /* Transmit byte. */ 60 *thr = (uint32_t) byte; 61 } 62 63 #endif 42 64 43 65 #ifdef MACHINE_gta02 … … 97 119 static void scons_sendb(uint8_t byte) 98 120 { 121 #ifdef MACHINE_beagleboardxm 122 scons_sendb_bbxm(byte); 123 #endif 99 124 #ifdef MACHINE_gta02 100 125 scons_sendb_gta02(byte); -
kernel/arch/arm32/Makefile.inc
re882e3a rfb8dcb4 73 73 endif 74 74 75 ifeq ($(MACHINE),beagleboardxm) 76 ARCH_SOURCES += arch/$(KARCH)/src/mach/beagleboardxm/beagleboardxm.c 77 endif 78 75 79 ifeq ($(CONFIG_PL050),y) 76 80 ARCH_SOURCES += genarch/src/drivers/pl050/pl050.c -
kernel/arch/arm32/_link.ld.in
re882e3a rfb8dcb4 9 9 #ifdef MACHINE_gta02 10 10 #define KERNEL_LOAD_ADDRESS 0xb0a08000 11 #elif defined MACHINE_beagleboardxm 12 #define KERNEL_LOAD_ADDRESS 0x80a00000 11 13 #else 12 14 #define KERNEL_LOAD_ADDRESS 0x80a00000 -
kernel/arch/arm32/include/asm.h
re882e3a rfb8dcb4 43 43 #include <trace.h> 44 44 45 /** No such instruction on ARM to sleep CPU. */ 45 /** No such instruction on ARM to sleep CPU. 46 * 47 * ARMv7 introduced wait for event and wait for interrupt. 48 */ 46 49 NO_TRACE static inline void cpu_sleep(void) 47 50 { 51 #ifdef PROCESSOR_armv7 52 asm volatile ( 53 "wfe":: 54 ); 55 #endif 48 56 } 49 57 -
kernel/arch/arm32/include/cpu.h
re882e3a rfb8dcb4 41 41 42 42 43 /** Struct representing ARM CPU identifi action. */43 /** Struct representing ARM CPU identification. */ 44 44 typedef struct { 45 45 /** Implementator (vendor) number. */ -
kernel/arch/arm32/include/machine_func.h
re882e3a rfb8dcb4 108 108 extern size_t machine_get_irq_count(void); 109 109 110 extern const char * machine_get_platform_name(void); 111 110 112 #endif 111 113 -
kernel/arch/arm32/include/mm/frame.h
re882e3a rfb8dcb4 48 48 #ifdef MACHINE_gta02 49 49 #define BOOT_PAGE_TABLE_ADDRESS 0x30010000 50 #elif defined MACHINE_beagleboardxm 51 #define BOOT_PAGE_TABLE_ADDRESS 0x80008000 50 52 #else 51 53 #define BOOT_PAGE_TABLE_ADDRESS 0x00008000 … … 57 59 #ifdef MACHINE_gta02 58 60 #define PHYSMEM_START_ADDR 0x30008000 61 #elif defined MACHINE_beagleboardxm 62 #define PHYSMEM_START_ADDR 0x80000000 59 63 #else 60 64 #define PHYSMEM_START_ADDR 0x00000000 -
kernel/arch/arm32/include/mm/page.h
re882e3a rfb8dcb4 37 37 #define KERN_arm32_PAGE_H_ 38 38 39 #include <arch/mm/frame.h> 40 #include <mm/mm.h> 41 #include <arch/exception.h> 42 #include <trace.h> 43 44 #define PAGE_WIDTH FRAME_WIDTH 45 #define PAGE_SIZE FRAME_SIZE 46 39 #ifdef MACHINE_beagleboardxm 40 #ifndef __ASM__ 41 # define KA2PA(x) ((uintptr_t) (x)) 42 # define PA2KA(x) ((uintptr_t) (x)) 43 #else 44 # define KA2PA(x) (x) 45 # define PA2KA(x) (x) 46 #endif 47 #else 47 48 #ifndef __ASM__ 48 49 # define KA2PA(x) (((uintptr_t) (x)) - 0x80000000) … … 52 53 # define PA2KA(x) ((x) + 0x80000000) 53 54 #endif 55 #endif 54 56 55 /* Number of entries in each level. */ 56 #define PTL0_ENTRIES_ARCH (1 << 12) /* 4096 */ 57 #define PTL1_ENTRIES_ARCH 0 58 #define PTL2_ENTRIES_ARCH 0 59 /* coarse page tables used (256 * 4 = 1KB per page) */ 60 #define PTL3_ENTRIES_ARCH (1 << 8) /* 256 */ 61 62 /* Page table sizes for each level. */ 63 #define PTL0_SIZE_ARCH FOUR_FRAMES 64 #define PTL1_SIZE_ARCH 0 65 #define PTL2_SIZE_ARCH 0 66 #define PTL3_SIZE_ARCH ONE_FRAME 67 68 /* Macros calculating indices into page tables for each level. */ 69 #define PTL0_INDEX_ARCH(vaddr) (((vaddr) >> 20) & 0xfff) 70 #define PTL1_INDEX_ARCH(vaddr) 0 71 #define PTL2_INDEX_ARCH(vaddr) 0 72 #define PTL3_INDEX_ARCH(vaddr) (((vaddr) >> 12) & 0x0ff) 73 74 /* Get PTE address accessors for each level. */ 75 #define GET_PTL1_ADDRESS_ARCH(ptl0, i) \ 76 ((pte_t *) ((((pte_t *)(ptl0))[(i)].l0).coarse_table_addr << 10)) 77 #define GET_PTL2_ADDRESS_ARCH(ptl1, i) \ 78 (ptl1) 79 #define GET_PTL3_ADDRESS_ARCH(ptl2, i) \ 80 (ptl2) 81 #define GET_FRAME_ADDRESS_ARCH(ptl3, i) \ 82 ((uintptr_t) ((((pte_t *)(ptl3))[(i)].l1).frame_base_addr << 12)) 83 84 /* Set PTE address accessors for each level. */ 85 #define SET_PTL0_ADDRESS_ARCH(ptl0) \ 86 (set_ptl0_addr((pte_t *) (ptl0))) 87 #define SET_PTL1_ADDRESS_ARCH(ptl0, i, a) \ 88 (((pte_t *) (ptl0))[(i)].l0.coarse_table_addr = (a) >> 10) 89 #define SET_PTL2_ADDRESS_ARCH(ptl1, i, a) 90 #define SET_PTL3_ADDRESS_ARCH(ptl2, i, a) 91 #define SET_FRAME_ADDRESS_ARCH(ptl3, i, a) \ 92 (((pte_t *) (ptl3))[(i)].l1.frame_base_addr = (a) >> 12) 93 94 /* Get PTE flags accessors for each level. */ 95 #define GET_PTL1_FLAGS_ARCH(ptl0, i) \ 96 get_pt_level0_flags((pte_t *) (ptl0), (size_t) (i)) 97 #define GET_PTL2_FLAGS_ARCH(ptl1, i) \ 98 PAGE_PRESENT 99 #define GET_PTL3_FLAGS_ARCH(ptl2, i) \ 100 PAGE_PRESENT 101 #define GET_FRAME_FLAGS_ARCH(ptl3, i) \ 102 get_pt_level1_flags((pte_t *) (ptl3), (size_t) (i)) 103 104 /* Set PTE flags accessors for each level. */ 105 #define SET_PTL1_FLAGS_ARCH(ptl0, i, x) \ 106 set_pt_level0_flags((pte_t *) (ptl0), (size_t) (i), (x)) 107 #define SET_PTL2_FLAGS_ARCH(ptl1, i, x) 108 #define SET_PTL3_FLAGS_ARCH(ptl2, i, x) 109 #define SET_FRAME_FLAGS_ARCH(ptl3, i, x) \ 110 set_pt_level1_flags((pte_t *) (ptl3), (size_t) (i), (x)) 111 112 /* Macros for querying the last-level PTE entries. */ 113 #define PTE_VALID_ARCH(pte) \ 114 (*((uint32_t *) (pte)) != 0) 115 #define PTE_PRESENT_ARCH(pte) \ 116 (((pte_t *) (pte))->l0.descriptor_type != 0) 117 #define PTE_GET_FRAME_ARCH(pte) \ 118 (((pte_t *) (pte))->l1.frame_base_addr << FRAME_WIDTH) 119 #define PTE_WRITABLE_ARCH(pte) \ 120 (((pte_t *) (pte))->l1.access_permission_0 == PTE_AP_USER_RW_KERNEL_RW) 121 #define PTE_EXECUTABLE_ARCH(pte) \ 122 1 123 124 #ifndef __ASM__ 125 126 /** Level 0 page table entry. */ 127 typedef struct { 128 /* 0b01 for coarse tables, see below for details */ 129 unsigned descriptor_type : 2; 130 unsigned impl_specific : 3; 131 unsigned domain : 4; 132 unsigned should_be_zero : 1; 133 134 /* Pointer to the coarse 2nd level page table (holding entries for small 135 * (4KB) or large (64KB) pages. ARM also supports fine 2nd level page 136 * tables that may hold even tiny pages (1KB) but they are bigger (4KB 137 * per table in comparison with 1KB per the coarse table) 138 */ 139 unsigned coarse_table_addr : 22; 140 } ATTRIBUTE_PACKED pte_level0_t; 141 142 /** Level 1 page table entry (small (4KB) pages used). */ 143 typedef struct { 144 145 /* 0b10 for small pages */ 146 unsigned descriptor_type : 2; 147 unsigned bufferable : 1; 148 unsigned cacheable : 1; 149 150 /* access permissions for each of 4 subparts of a page 151 * (for each 1KB when small pages used */ 152 unsigned access_permission_0 : 2; 153 unsigned access_permission_1 : 2; 154 unsigned access_permission_2 : 2; 155 unsigned access_permission_3 : 2; 156 unsigned frame_base_addr : 20; 157 } ATTRIBUTE_PACKED pte_level1_t; 158 159 typedef union { 160 pte_level0_t l0; 161 pte_level1_t l1; 162 } pte_t; 163 164 /* Level 1 page tables access permissions */ 165 166 /** User mode: no access, privileged mode: no access. */ 167 #define PTE_AP_USER_NO_KERNEL_NO 0 168 169 /** User mode: no access, privileged mode: read/write. */ 170 #define PTE_AP_USER_NO_KERNEL_RW 1 171 172 /** User mode: read only, privileged mode: read/write. */ 173 #define PTE_AP_USER_RO_KERNEL_RW 2 174 175 /** User mode: read/write, privileged mode: read/write. */ 176 #define PTE_AP_USER_RW_KERNEL_RW 3 177 178 179 /* pte_level0_t and pte_level1_t descriptor_type flags */ 180 181 /** pte_level0_t and pte_level1_t "not present" flag (used in descriptor_type). */ 182 #define PTE_DESCRIPTOR_NOT_PRESENT 0 183 184 /** pte_level0_t coarse page table flag (used in descriptor_type). */ 185 #define PTE_DESCRIPTOR_COARSE_TABLE 1 186 187 /** pte_level1_t small page table flag (used in descriptor type). */ 188 #define PTE_DESCRIPTOR_SMALL_PAGE 2 189 190 191 /** Sets the address of level 0 page table. 192 * 193 * @param pt Pointer to the page table to set. 194 * 195 */ 196 NO_TRACE static inline void set_ptl0_addr(pte_t *pt) 197 { 198 asm volatile ( 199 "mcr p15, 0, %[pt], c2, c0, 0\n" 200 :: [pt] "r" (pt) 201 ); 202 } 203 204 205 /** Returns level 0 page table entry flags. 206 * 207 * @param pt Level 0 page table. 208 * @param i Index of the entry to return. 209 * 210 */ 211 NO_TRACE static inline int get_pt_level0_flags(pte_t *pt, size_t i) 212 { 213 pte_level0_t *p = &pt[i].l0; 214 int np = (p->descriptor_type == PTE_DESCRIPTOR_NOT_PRESENT); 215 216 return (np << PAGE_PRESENT_SHIFT) | (1 << PAGE_USER_SHIFT) | 217 (1 << PAGE_READ_SHIFT) | (1 << PAGE_WRITE_SHIFT) | 218 (1 << PAGE_EXEC_SHIFT) | (1 << PAGE_CACHEABLE_SHIFT); 219 } 220 221 /** Returns level 1 page table entry flags. 222 * 223 * @param pt Level 1 page table. 224 * @param i Index of the entry to return. 225 * 226 */ 227 NO_TRACE static inline int get_pt_level1_flags(pte_t *pt, size_t i) 228 { 229 pte_level1_t *p = &pt[i].l1; 230 231 int dt = p->descriptor_type; 232 int ap = p->access_permission_0; 233 234 return ((dt == PTE_DESCRIPTOR_NOT_PRESENT) << PAGE_PRESENT_SHIFT) | 235 ((ap == PTE_AP_USER_RO_KERNEL_RW) << PAGE_READ_SHIFT) | 236 ((ap == PTE_AP_USER_RW_KERNEL_RW) << PAGE_READ_SHIFT) | 237 ((ap == PTE_AP_USER_RW_KERNEL_RW) << PAGE_WRITE_SHIFT) | 238 ((ap != PTE_AP_USER_NO_KERNEL_RW) << PAGE_USER_SHIFT) | 239 ((ap == PTE_AP_USER_NO_KERNEL_RW) << PAGE_READ_SHIFT) | 240 ((ap == PTE_AP_USER_NO_KERNEL_RW) << PAGE_WRITE_SHIFT) | 241 (1 << PAGE_EXEC_SHIFT) | 242 (p->bufferable << PAGE_CACHEABLE); 243 } 244 245 /** Sets flags of level 0 page table entry. 246 * 247 * @param pt level 0 page table 248 * @param i index of the entry to be changed 249 * @param flags new flags 250 * 251 */ 252 NO_TRACE static inline void set_pt_level0_flags(pte_t *pt, size_t i, int flags) 253 { 254 pte_level0_t *p = &pt[i].l0; 255 256 if (flags & PAGE_NOT_PRESENT) { 257 p->descriptor_type = PTE_DESCRIPTOR_NOT_PRESENT; 258 /* 259 * Ensures that the entry will be recognized as valid when 260 * PTE_VALID_ARCH applied. 261 */ 262 p->should_be_zero = 1; 263 } else { 264 p->descriptor_type = PTE_DESCRIPTOR_COARSE_TABLE; 265 p->should_be_zero = 0; 266 } 267 } 268 269 270 /** Sets flags of level 1 page table entry. 271 * 272 * We use same access rights for the whole page. When page 273 * is not preset we store 1 in acess_rigts_3 so that at least 274 * one bit is 1 (to mark correct page entry, see #PAGE_VALID_ARCH). 275 * 276 * @param pt Level 1 page table. 277 * @param i Index of the entry to be changed. 278 * @param flags New flags. 279 * 280 */ 281 NO_TRACE static inline void set_pt_level1_flags(pte_t *pt, size_t i, int flags) 282 { 283 pte_level1_t *p = &pt[i].l1; 284 285 if (flags & PAGE_NOT_PRESENT) { 286 p->descriptor_type = PTE_DESCRIPTOR_NOT_PRESENT; 287 p->access_permission_3 = 1; 288 } else { 289 p->descriptor_type = PTE_DESCRIPTOR_SMALL_PAGE; 290 p->access_permission_3 = p->access_permission_0; 291 } 292 293 p->cacheable = p->bufferable = (flags & PAGE_CACHEABLE) != 0; 294 295 /* default access permission */ 296 p->access_permission_0 = p->access_permission_1 = 297 p->access_permission_2 = p->access_permission_3 = 298 PTE_AP_USER_NO_KERNEL_RW; 299 300 if (flags & PAGE_USER) { 301 if (flags & PAGE_READ) { 302 p->access_permission_0 = p->access_permission_1 = 303 p->access_permission_2 = p->access_permission_3 = 304 PTE_AP_USER_RO_KERNEL_RW; 305 } 306 if (flags & PAGE_WRITE) { 307 p->access_permission_0 = p->access_permission_1 = 308 p->access_permission_2 = p->access_permission_3 = 309 PTE_AP_USER_RW_KERNEL_RW; 310 } 311 } 312 } 313 314 315 extern void page_arch_init(void); 316 317 318 #endif /* __ASM__ */ 57 #if defined(PROCESSOR_armv7) 58 #include "page_armv7.h" 59 #elif defined(PROCESSOR_armv4) | defined(PROCESSOR_armv5) 60 #include "page_armv4.h" 61 #endif 319 62 320 63 #endif -
kernel/arch/arm32/include/regutils.h
re882e3a rfb8dcb4 41 41 #define STATUS_REG_MODE_MASK 0x1f 42 42 43 #define CP15_R1_MMU_ENABLE_BIT (1 << 0) 44 #define CP15_R1_ALIGNMENT_ENABLE_BIT (1 << 1) 45 #define CP15_R1_CACHE_ENABLE_BIT (1 << 2) 46 #define CP15_R1_BRANCH_PREDICT_BIT (1 << 11) 47 #define CP15_R1_INST_CACHE_BIT (1 << 12) 43 48 #define CP15_R1_HIGH_VECTORS_BIT (1 << 13) 49 #define CP15_R1_ROUND_ROBIN_BIT (1 << 14) 50 #define CP15_R1_HA_ENABLE_BIT (1 << 17) 51 #define CP15_R1_WXN_BIT (1 << 19) /* Only if virt. supported */ 52 #define CP15_R1_UWXN_BIT (1 << 20) /* Only if virt. supported */ 53 #define CP15_R1_FI_BIT (1 << 21) 54 #define CP15_R1_VE_BIT (1 << 24) 55 #define CP15_R1_EE_BIT (1 << 25) 56 #define CP15_R1_NMFI_BIT (1 << 27) 57 #define CP15_R1_TRE_BIT (1 << 28) 58 #define CP15_R1_AFE_BIT (1 << 29) 44 59 45 60 /* ARM Processor Operation Modes */ -
kernel/arch/arm32/src/arm32.c
re882e3a rfb8dcb4 49 49 #include <str.h> 50 50 #include <arch/ras.h> 51 #include <sysinfo/sysinfo.h> 51 52 52 53 /** Performs arm32-specific initialization before main_bsp() is called. */ … … 116 117 { 117 118 machine_input_init(); 119 const char *platform = machine_get_platform_name(); 120 121 sysinfo_set_item_data("platform", NULL, (void *) platform, 122 str_size(platform)); 118 123 } 119 124 -
kernel/arch/arm32/src/cpu/cpu.c
re882e3a rfb8dcb4 44 44 /** Implementators (vendor) names */ 45 45 static const char *imp_data[] = { 46 "?", /* IMP_DATA_START_OFFSET */ 47 "ARM Ltd", /* 0x41 */ 48 "", /* 0x42 */ 49 "", /* 0x43 */ 50 "Digital Equipment Corporation", /* 0x44 */ 51 "", "", "", "", "", "", "", "", "", "", /* 0x45 - 0x4e */ 52 "", "", "", "", "", "", "", "", "", "", /* 0x4f - 0x58 */ 53 "", "", "", "", "", "", "", "", "", "", /* 0x59 - 0x62 */ 54 "", "", "", "", "", "", /* 0x63 - 0x68 */ 55 "Intel Corporation" /* 0x69 */ 46 "?", /* IMP_DATA_START_OFFSET */ 47 "ARM Limited", /* 0x41 */ 48 "", "", /* 0x42 - 0x43 */ 49 "Digital Equipment Corporation", /* 0x44 */ 50 "", "", "", "", "", "", "", "", /* 0x45 - 0x4c */ 51 "Motorola, Freescale Semicondutor Inc.", /* 0x4d */ 52 "", "", "", /* 0x4e - 0x50 */ 53 "Qualcomm Inc.", /* 0x51 */ 54 "", "", "", "", /* 0x52 - 0x55 */ 55 "Marvell Semiconductor", /* 0x56 */ 56 "", "", "", "", "", "", "", "", "", "", /* 0x57 - 0x60 */ 57 "", "", "", "", "", "", "", "", /* 0x61 - 0x68 */ 58 "Intel Corporation" /* 0x69 */ 56 59 }; 57 60 … … 97 100 void cpu_arch_init(void) 98 101 { 102 #if defined(PROCESSOR_armv7) 103 uint32_t control_reg = 0; 104 asm volatile ( 105 "mrc p15, 0, %[control_reg], c1, c0" 106 : [control_reg] "=r" (control_reg) 107 ); 108 109 /* Turn off tex remap */ 110 control_reg &= ~CP15_R1_TRE_BIT; 111 /* Turn off accessed flag */ 112 control_reg &= ~(CP15_R1_AFE_BIT | CP15_R1_HA_ENABLE_BIT); 113 /* Enable caching */ 114 control_reg |= CP15_R1_CACHE_ENABLE_BIT; 115 116 asm volatile ( 117 "mcr p15, 0, %[control_reg], c1, c0" 118 :: [control_reg] "r" (control_reg) 119 ); 120 #endif 99 121 } 100 122 … … 112 134 cpu_arch_t * cpu_arch = &m->arch; 113 135 114 if ((cpu_arch->imp_num) > 0 && 115 (cpu_arch->imp_num < (imp_data_length + IMP_DATA_START_OFFSET))) { 136 const unsigned imp_offset = cpu_arch->imp_num - IMP_DATA_START_OFFSET; 137 138 if (imp_offset < imp_data_length) { 116 139 vendor = imp_data[cpu_arch->imp_num - IMP_DATA_START_OFFSET]; 117 140 } 118 141 119 if ((cpu_arch->arch_num) > 0 &&120 (cpu_arch->arch_num < arch_data_length)) {142 // TODO CPUs with arch_num == 0xf use CPUID scheme for identification 143 if (cpu_arch->arch_num < arch_data_length) { 121 144 architecture = arch_data[cpu_arch->arch_num]; 122 145 } -
kernel/arch/arm32/src/exception.c
re882e3a rfb8dcb4 120 120 static void high_vectors(void) 121 121 { 122 uint32_t control_reg; 123 122 register uint32_t control_reg = 0; 123 124 #if defined(PROCESSOR_armv7) 125 asm volatile ( 126 "mrc p15, 0, %[control_reg], c1, c0" 127 : [control_reg] "=r" (control_reg) 128 ); 129 #elif defined(PROCESSOR_armv4) | defined(PROCESSOR_armv5) 124 130 asm volatile ( 125 131 "mrc p15, 0, %[control_reg], c1, c1" 126 132 : [control_reg] "=r" (control_reg) 127 133 ); 134 #endif 128 135 129 136 /* switch on the high vectors bit */ 130 137 control_reg |= CP15_R1_HIGH_VECTORS_BIT; 131 138 139 #if defined(PROCESSOR_armv7) 140 asm volatile ( 141 "mcr p15, 0, %[control_reg], c1, c0" 142 :: [control_reg] "r" (control_reg) 143 ); 144 #elif defined(PROCESSOR_armv4) | defined(PROCESSOR_armv5) 132 145 asm volatile ( 133 146 "mcr p15, 0, %[control_reg], c1, c1" 134 147 :: [control_reg] "r" (control_reg) 135 148 ); 149 #endif 136 150 } 137 151 #endif -
kernel/arch/arm32/src/machine_func.c
re882e3a rfb8dcb4 42 42 #include <arch/mach/integratorcp/integratorcp.h> 43 43 #include <arch/mach/testarm/testarm.h> 44 #include <arch/mach/beagleboardxm/beagleboardxm.h> 44 45 45 46 /** Pointer to machine_ops structure being used. */ … … 55 56 #elif defined(MACHINE_integratorcp) 56 57 machine_ops = &icp_machine_ops; 58 #elif defined(MACHINE_beagleboardxm) 59 machine_ops = &bbxm_machine_ops; 57 60 #else 58 61 #error Machine type not defined. … … 131 134 } 132 135 136 const char * machine_get_platform_name(void) 137 { 138 if (machine_ops->machine_get_platform_name) 139 return machine_ops->machine_get_platform_name(); 140 return NULL; 141 } 133 142 /** @} 134 143 */ -
kernel/arch/arm32/src/mm/page.c
re882e3a rfb8dcb4 52 52 void page_arch_init(void) 53 53 { 54 int flags = PAGE_CACHEABLE ;54 int flags = PAGE_CACHEABLE | PAGE_EXEC; 55 55 page_mapping_operations = &pt_mapping_operations; 56 56 57 57 page_table_lock(AS_KERNEL, true); 58 58 59 uintptr_t cur;60 61 59 /* Kernel identity mapping */ 62 for (cur = PHYSMEM_START_ADDR; 63 cur < min(config.identity_size, config.physmem_end); 60 //FIXME: We need to consider the possibility that 61 //identity_base > identity_size and physmem_end. 62 //This might lead to overflow if identity_size is too big. 63 for (uintptr_t cur = PHYSMEM_START_ADDR; 64 cur < min(KA2PA(config.identity_base) + 65 config.identity_size, config.physmem_end); 64 66 cur += FRAME_SIZE) 65 67 page_mapping_insert(AS_KERNEL, PA2KA(cur), cur, flags); -
kernel/genarch/Makefile.inc
re882e3a rfb8dcb4 101 101 endif 102 102 103 ifeq ($(CONFIG_AMDM37X_UART),y) 104 GENARCH_SOURCES += \ 105 genarch/src/drivers/amdm37x_uart/amdm37x_uart.c 106 endif 107 103 108 ifeq ($(CONFIG_VIA_CUDA),y) 104 109 GENARCH_SOURCES += \ -
tools/mkuimage.py
re882e3a rfb8dcb4 120 120 header.start_addr = start_addr # Address of entry point 121 121 header.data_crc = data_crc 122 header.os = 5 # Linux122 header.os = 2 # NetBSD 123 123 header.arch = 2 # ARM 124 124 header.img_type = 2 # Kernel -
uspace/Makefile
re882e3a rfb8dcb4 174 174 endif 175 175 176 ifeq ($(UARCH),arm32) 177 DIRS += \ 178 drv/infrastructure/rootamdm37x 179 endif 180 176 181 ## System libraries 177 182 # -
uspace/drv/bus/usb/ehci/Makefile
re882e3a rfb8dcb4 43 43 SOURCES = \ 44 44 main.c \ 45 pci.c45 res.c 46 46 47 47 include $(USPACE_PREFIX)/Makefile.common -
uspace/drv/bus/usb/ehci/ehci.ma
re882e3a rfb8dcb4 1 20 usb/host=ehci 1 2 10 pci/class=0c&subclass=03&progif=20 -
uspace/drv/bus/usb/ehci/main.c
re882e3a rfb8dcb4 44 44 #include <usb/host/hcd.h> 45 45 46 #include " pci.h"46 #include "res.h" 47 47 48 48 #define NAME "ehci" … … 81 81 int irq = 0; 82 82 83 int ret = pci_get_my_registers(device, ®_base, ®_size, &irq);83 int ret = get_my_registers(device, ®_base, ®_size, &irq); 84 84 CHECK_RET_RETURN(ret, 85 85 "Failed to get memory addresses for %" PRIun ": %s.\n", … … 88 88 reg_base, reg_size, irq); 89 89 90 ret = pci_disable_legacy(device, reg_base, reg_size, irq);90 ret = disable_legacy(device, reg_base, reg_size); 91 91 CHECK_RET_RETURN(ret, 92 92 "Failed to disable legacy USB: %s.\n", str_error(ret)); -
uspace/drv/bus/usb/ohci/Makefile
re882e3a rfb8dcb4 50 50 ohci_batch.c \ 51 51 ohci_endpoint.c \ 52 pci.c \52 res.c \ 53 53 root_hub.c \ 54 54 hw_struct/endpoint_descriptor.c \ -
uspace/drv/bus/usb/ohci/hw_struct/hcca.h
re882e3a rfb8dcb4 46 46 uint16_t pad1; 47 47 uint32_t done_head; 48 uint32_t reserved[ 29];49 } __attribute__((packed, aligned))hcca_t;48 uint32_t reserved[30]; 49 } hcca_t; 50 50 51 51 static inline void * hcca_get(void) -
uspace/drv/bus/usb/ohci/ohci.c
re882e3a rfb8dcb4 42 42 43 43 #include "ohci.h" 44 #include " pci.h"44 #include "res.h" 45 45 #include "hc.h" 46 46 … … 180 180 int irq = 0; 181 181 182 ret = pci_get_my_registers(device, ®_base, ®_size, &irq);182 ret = get_my_registers(device, ®_base, ®_size, &irq); 183 183 CHECK_RET_DEST_FREE_RETURN(ret, 184 184 "Failed to get register memory addresses for %" PRIun ": %s.\n", … … 211 211 /* Try to enable interrupts */ 212 212 bool interrupts = false; 213 ret = pci_enable_interrupts(device);213 ret = enable_interrupts(device); 214 214 if (ret != EOK) { 215 215 usb_log_warning("Failed to enable interrupts: %s." -
uspace/drv/bus/usb/ohci/ohci.ma
re882e3a rfb8dcb4 1 20 usb/host=ohci 1 2 10 pci/class=0c&subclass=03&progif=10 -
uspace/drv/bus/usb/ohci/ohci_regs.h
re882e3a rfb8dcb4 228 228 #define RHPS_PRSC_FLAG (1 << 20) /* port reset status change WC */ 229 229 #define RHPS_CHANGE_WC_MASK 0x1f0000 230 } __attribute__((packed))ohci_regs_t;230 } ohci_regs_t; 231 231 #endif 232 232 /** -
uspace/drv/bus/usb/uhci/Makefile
re882e3a rfb8dcb4 44 44 hc.c \ 45 45 main.c \ 46 pci.c \46 res.c \ 47 47 root_hub.c \ 48 48 transfer_list.c \ -
uspace/drv/bus/usb/uhci/uhci.c
re882e3a rfb8dcb4 41 41 42 42 #include "uhci.h" 43 #include "pci.h" 44 43 44 #include "res.h" 45 45 #include "hc.h" 46 46 #include "root_hub.h" … … 49 49 * and USB root hub */ 50 50 typedef struct uhci { 51 /** Pointer to DDF represen ation of UHCI host controller */51 /** Pointer to DDF representation of UHCI host controller */ 52 52 ddf_fun_t *hc_fun; 53 /** Pointer to DDF represen ation of UHCI root hub */53 /** Pointer to DDF representation of UHCI root hub */ 54 54 ddf_fun_t *rh_fun; 55 55 56 /** Internal driver's represen ation of UHCI host controller */56 /** Internal driver's representation of UHCI host controller */ 57 57 hc_t hc; 58 /** Internal driver's represen ation of UHCI root hub */58 /** Internal driver's representation of UHCI root hub */ 59 59 rh_t rh; 60 60 } uhci_t; … … 187 187 int irq = 0; 188 188 189 ret = pci_get_my_registers(device, ®_base, ®_size, &irq);189 ret = get_my_registers(device, ®_base, ®_size, &irq); 190 190 CHECK_RET_DEST_FREE_RETURN(ret, 191 191 "Failed to get I/O addresses for %" PRIun ": %s.\n", … … 194 194 (void *) reg_base, reg_size, irq); 195 195 196 ret = pci_disable_legacy(device);196 ret = disable_legacy(device); 197 197 CHECK_RET_DEST_FREE_RETURN(ret, 198 198 "Failed to disable legacy USB: %s.\n", str_error(ret)); … … 220 220 221 221 bool interrupts = false; 222 ret = pci_enable_interrupts(device);222 ret = enable_interrupts(device); 223 223 if (ret != EOK) { 224 224 usb_log_warning("Failed to enable interrupts: %s." -
uspace/lib/usbdev/include/usb/dev/request.h
re882e3a rfb8dcb4 93 93 uint8_t request; 94 94 /** Main parameter to the request. */ 95 union {95 union __attribute__ ((packed)) { 96 96 uint16_t value; 97 97 /* FIXME: add #ifdefs according to host endianness */ 98 struct {98 struct __attribute__ ((packed)) { 99 99 uint8_t value_low; 100 100 uint8_t value_high; … … 108 108 uint16_t length; 109 109 } __attribute__ ((packed)) usb_device_request_setup_packet_t; 110 111 int assert[(sizeof(usb_device_request_setup_packet_t) == 8) ? 1: -1]; 110 112 111 113 int usb_control_request_set(usb_pipe_t *,
Note:
See TracChangeset
for help on using the changeset viewer.