Changeset 99c2c69e in mainline for kernel/arch
- Timestamp:
- 2013-09-13T00:36:30Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 67fbd5e
- Parents:
- 7f84430 (diff), 11d41be5 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - Location:
- kernel/arch
- Files:
-
- 37 edited
-
abs32le/include/arch/mm/frame.h (modified) (1 diff)
-
abs32le/include/arch/mm/page.h (modified) (1 diff)
-
amd64/include/arch/mm/frame.h (modified) (1 diff)
-
amd64/include/arch/mm/page.h (modified) (1 diff)
-
amd64/src/ddi/ddi.c (modified) (7 diffs)
-
amd64/src/proc/task.c (modified) (3 diffs)
-
arm32/include/arch/mm/frame.h (modified) (1 diff)
-
arm32/include/arch/mm/page.h (modified) (1 diff)
-
arm32/src/mach/beagleboardxm/beagleboardxm.c (modified) (6 diffs)
-
arm32/src/mach/beaglebone/beaglebone.c (modified) (6 diffs)
-
arm32/src/mm/frame.c (modified) (1 diff)
-
arm32/src/mm/page.c (modified) (1 diff)
-
arm32/src/ras.c (modified) (1 diff)
-
ia32/include/arch/mm/frame.h (modified) (1 diff)
-
ia32/include/arch/mm/page.h (modified) (1 diff)
-
ia32/src/ddi/ddi.c (modified) (6 diffs)
-
ia32/src/mm/frame.c (modified) (2 diffs)
-
ia32/src/proc/task.c (modified) (1 diff)
-
ia64/include/arch/mm/frame.h (modified) (1 diff)
-
ia64/src/ddi/ddi.c (modified) (3 diffs)
-
ia64/src/mm/vhpt.c (modified) (2 diffs)
-
mips32/include/arch/mm/frame.h (modified) (1 diff)
-
mips32/include/arch/mm/page.h (modified) (3 diffs)
-
mips32/src/mach/malta/malta.c (modified) (1 diff)
-
mips32/src/mm/tlb.c (modified) (3 diffs)
-
mips64/include/arch/mm/frame.h (modified) (1 diff)
-
ppc32/include/arch/mm/frame.h (modified) (1 diff)
-
ppc32/include/arch/mm/page.h (modified) (1 diff)
-
sparc64/include/arch/mm/frame.h (modified) (1 diff)
-
sparc64/include/arch/mm/sun4u/frame.h (modified) (4 diffs)
-
sparc64/include/arch/mm/sun4v/frame.h (modified) (2 diffs)
-
sparc64/include/arch/trap/sun4v/mmu.h (modified) (1 diff)
-
sparc64/src/mm/sun4u/as.c (modified) (1 diff)
-
sparc64/src/mm/sun4v/as.c (modified) (2 diffs)
-
sparc64/src/mm/sun4v/frame.c (modified) (1 diff)
-
sparc64/src/mm/sun4v/tlb.c (modified) (3 diffs)
-
sparc64/src/sun4v/start.S (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/abs32le/include/arch/mm/frame.h
r7f84430 r99c2c69e 39 39 #define FRAME_SIZE (1 << FRAME_WIDTH) 40 40 41 #define FRAME_LOWPRIO 0 42 41 43 #include <typedefs.h> 42 44 -
kernel/arch/abs32le/include/arch/mm/page.h
r7f84430 r99c2c69e 57 57 58 58 /* Page table sizes for each level. */ 59 #define PTL0_ SIZE_ARCH ONE_FRAME60 #define PTL1_ SIZE_ARCH 061 #define PTL2_ SIZE_ARCH 062 #define PTL3_ SIZE_ARCH ONE_FRAME59 #define PTL0_FRAMES_ARCH 1 60 #define PTL1_FRAMES_ARCH 1 61 #define PTL2_FRAMES_ARCH 1 62 #define PTL3_FRAMES_ARCH 1 63 63 64 64 /* Macros calculating indices for each level. */ -
kernel/arch/amd64/include/arch/mm/frame.h
r7f84430 r99c2c69e 39 39 #define FRAME_SIZE (1 << FRAME_WIDTH) 40 40 41 #define FRAME_LOWPRIO 0x1000 42 41 43 #ifndef __ASM__ 42 44 -
kernel/arch/amd64/include/arch/mm/page.h
r7f84430 r99c2c69e 61 61 62 62 /* Page table sizes for each level. */ 63 #define PTL0_ SIZE_ARCH ONE_FRAME64 #define PTL1_ SIZE_ARCH ONE_FRAME65 #define PTL2_ SIZE_ARCH ONE_FRAME66 #define PTL3_ SIZE_ARCH ONE_FRAME63 #define PTL0_FRAMES_ARCH 1 64 #define PTL1_FRAMES_ARCH 1 65 #define PTL2_FRAMES_ARCH 1 66 #define PTL3_FRAMES_ARCH 1 67 67 68 68 /* Macros calculating indices into page tables in each level. */ -
kernel/arch/amd64/src/ddi/ddi.c
r7f84430 r99c2c69e 42 42 #include <errno.h> 43 43 #include <arch/cpu.h> 44 #include <cpu.h> 44 45 #include <arch.h> 45 46 #include <align.h> … … 58 59 int ddi_iospace_enable_arch(task_t *task, uintptr_t ioaddr, size_t size) 59 60 { 60 size_t bits = ioaddr + size;61 if ( bits > IO_PORTS)61 size_t elements = ioaddr + size; 62 if (elements > IO_PORTS) 62 63 return ENOENT; 63 64 64 if (task->arch.iomap. bits < bits) {65 if (task->arch.iomap.elements < elements) { 65 66 /* 66 67 * The I/O permission bitmap is too small and needs to be grown. 67 68 */ 68 69 69 uint8_t *newmap = (uint8_t *) malloc(BITS2BYTES(bits), FRAME_ATOMIC);70 if (! newmap)70 void *store = malloc(bitmap_size(elements), FRAME_ATOMIC); 71 if (!store) 71 72 return ENOMEM; 72 73 73 74 bitmap_t oldiomap; 74 bitmap_initialize(&oldiomap, task->arch.iomap. map,75 bitmap_initialize(&oldiomap, task->arch.iomap.elements, 75 76 task->arch.iomap.bits); 76 bitmap_initialize(&task->arch.iomap, newmap, bits); 77 78 bitmap_initialize(&task->arch.iomap, elements, store); 77 79 78 80 /* 79 81 * Mark the new range inaccessible. 80 82 */ 81 bitmap_set_range(&task->arch.iomap, oldiomap. bits,82 bits - oldiomap.bits);83 bitmap_set_range(&task->arch.iomap, oldiomap.elements, 84 elements - oldiomap.elements); 83 85 84 86 /* … … 88 90 if (oldiomap.bits) { 89 91 bitmap_copy(&task->arch.iomap, &oldiomap, 90 oldiomap.bits); 91 free(oldiomap.map); 92 oldiomap.elements); 93 94 free(oldiomap.bits); 92 95 } 93 96 } … … 96 99 * Enable the range and we are done. 97 100 */ 98 bitmap_clear_range(&task->arch.iomap, (size_t) ioaddr, (size_t)size);101 bitmap_clear_range(&task->arch.iomap, (size_t) ioaddr, size); 99 102 100 103 /* … … 118 121 /* First, copy the I/O Permission Bitmap. */ 119 122 irq_spinlock_lock(&TASK->lock, false); 123 120 124 size_t ver = TASK->arch.iomapver; 121 size_t bits = TASK->arch.iomap.bits; 122 if (bits) { 123 ASSERT(TASK->arch.iomap.map); 125 size_t elements = TASK->arch.iomap.elements; 126 127 if (elements > 0) { 128 ASSERT(TASK->arch.iomap.bits); 124 129 125 130 bitmap_t iomap; 126 bitmap_initialize(&iomap, CPU->arch.tss->iomap,127 TSS_IOMAP_SIZE * 8);128 bitmap_copy(&iomap, &TASK->arch.iomap, bits);131 bitmap_initialize(&iomap, TSS_IOMAP_SIZE * 8, 132 CPU->arch.tss->iomap); 133 bitmap_copy(&iomap, &TASK->arch.iomap, elements); 129 134 130 135 /* … … 132 137 * I/O access. 133 138 */ 134 bitmap_set_range(&iomap, bits, ALIGN_UP(bits, 8) - bits); 139 bitmap_set_range(&iomap, elements, 140 ALIGN_UP(elements, 8) - elements); 141 135 142 /* 136 143 * It is safe to set the trailing eight bits because of the 137 144 * extra convenience byte in TSS_IOMAP_SIZE. 138 145 */ 139 bitmap_set_range(&iomap, ALIGN_UP( bits, 8), 8);146 bitmap_set_range(&iomap, ALIGN_UP(elements, 8), 8); 140 147 } 148 141 149 irq_spinlock_unlock(&TASK->lock, false); 142 150 143 151 /* 144 152 * Second, adjust TSS segment limit. 145 * Take the extra ending byte wi ll all bits set into account.153 * Take the extra ending byte with all bits set into account. 146 154 */ 147 155 ptr_16_64_t cpugdtr; … … 149 157 150 158 descriptor_t *gdt_p = (descriptor_t *) cpugdtr.base; 151 gdt_tss_setlimit(&gdt_p[TSS_DES], TSS_BASIC_SIZE + BITS2BYTES(bits)); 159 size_t size = bitmap_size(elements); 160 gdt_tss_setlimit(&gdt_p[TSS_DES], TSS_BASIC_SIZE + size); 152 161 gdtr_load(&cpugdtr); 153 162 -
kernel/arch/amd64/src/proc/task.c
r7f84430 r99c2c69e 34 34 35 35 #include <proc/task.h> 36 #include <typedefs.h> 37 #include <adt/bitmap.h> 36 38 #include <mm/slab.h> 37 #include <typedefs.h>38 39 39 40 /** Perform amd64 specific task initialization. … … 45 46 { 46 47 task->arch.iomapver = 0; 47 bitmap_initialize(&task->arch.iomap, NULL, 0);48 bitmap_initialize(&task->arch.iomap, 0, NULL); 48 49 } 49 50 … … 55 56 void task_destroy_arch(task_t *task) 56 57 { 57 if (task->arch.iomap. map)58 free(task->arch.iomap. map);58 if (task->arch.iomap.bits != NULL) 59 free(task->arch.iomap.bits); 59 60 } 60 61 -
kernel/arch/arm32/include/arch/mm/frame.h
r7f84430 r99c2c69e 39 39 #define FRAME_WIDTH 12 /* 4KB frames */ 40 40 #define FRAME_SIZE (1 << FRAME_WIDTH) 41 42 #define FRAME_LOWPRIO 0 41 43 42 44 #ifndef __ASM__ -
kernel/arch/arm32/include/arch/mm/page.h
r7f84430 r99c2c69e 73 73 74 74 /* Page table sizes for each level. */ 75 #define PTL0_ SIZE_ARCH FOUR_FRAMES76 #define PTL1_ SIZE_ARCH 077 #define PTL2_ SIZE_ARCH 078 #define PTL3_ SIZE_ARCH ONE_FRAME75 #define PTL0_FRAMES_ARCH 4 76 #define PTL1_FRAMES_ARCH 1 77 #define PTL2_FRAMES_ARCH 1 78 #define PTL3_FRAMES_ARCH 1 79 79 80 80 /* Macros calculating indices into page tables for each level. */ -
kernel/arch/arm32/src/mach/beagleboardxm/beagleboardxm.c
r7f84430 r99c2c69e 60 60 61 61 static struct beagleboard { 62 amdm37x_irc_regs_t *irc_addr;62 omap_irc_regs_t *irc_addr; 63 63 omap_uart_t uart; 64 64 amdm37x_gpt_t timer; … … 103 103 PAGE_NOT_CACHEABLE); 104 104 ASSERT(beagleboard.irc_addr); 105 amdm37x_irc_init(beagleboard.irc_addr);105 omap_irc_init(beagleboard.irc_addr); 106 106 107 107 /* Initialize timer. Use timer1, because it is in WKUP power domain … … 123 123 124 124 /* Enable timer interrupt */ 125 amdm37x_irc_enable(beagleboard.irc_addr, AMDM37x_GPT1_IRQ);125 omap_irc_enable(beagleboard.irc_addr, AMDM37x_GPT1_IRQ); 126 126 127 127 /* Start timer here */ … … 147 147 static void bbxm_irq_exception(unsigned int exc_no, istate_t *istate) 148 148 { 149 const unsigned inum = amdm37x_irc_inum_get(beagleboard.irc_addr);149 const unsigned inum = omap_irc_inum_get(beagleboard.irc_addr); 150 150 151 151 irq_t *irq = irq_dispatch_and_lock(inum); … … 161 161 /** amdm37x manual ch. 12.5.2 (p. 2428) places irc ack at the end 162 162 * of ISR. DO this to avoid strange behavior. */ 163 amdm37x_irc_irq_ack(beagleboard.irc_addr);163 omap_irc_irq_ack(beagleboard.irc_addr); 164 164 } 165 165 … … 188 188 indev_t *srln = srln_wire(srln_instance, sink); 189 189 omap_uart_input_wire(&beagleboard.uart, srln); 190 amdm37x_irc_enable(beagleboard.irc_addr, AMDM37x_UART3_IRQ);190 omap_irc_enable(beagleboard.irc_addr, AMDM37x_UART3_IRQ); 191 191 } 192 192 #endif -
kernel/arch/arm32/src/mach/beaglebone/beaglebone.c
r7f84430 r99c2c69e 63 63 64 64 static struct beaglebone { 65 am335x_irc_regs_t *irc_addr;65 omap_irc_regs_t *irc_addr; 66 66 am335x_cm_per_regs_t *cm_per_addr; 67 67 am335x_cm_dpll_regs_t *cm_dpll_addr; … … 104 104 105 105 /* Initialize the interrupt controller */ 106 am335x_irc_init(bbone.irc_addr);106 omap_irc_init(bbone.irc_addr); 107 107 } 108 108 … … 153 153 } 154 154 /* Enable the interrupt */ 155 am335x_irc_enable(bbone.irc_addr, AM335x_DMTIMER2_IRQ);155 omap_irc_enable(bbone.irc_addr, AM335x_DMTIMER2_IRQ); 156 156 /* Start the timer */ 157 157 am335x_timer_start(&bbone.timer); … … 176 176 static void bbone_irq_exception(unsigned int exc_no, istate_t *istate) 177 177 { 178 const unsigned inum = am335x_irc_inum_get(bbone.irc_addr);178 const unsigned inum = omap_irc_inum_get(bbone.irc_addr); 179 179 180 180 irq_t *irq = irq_dispatch_and_lock(inum); … … 187 187 } 188 188 189 am335x_irc_irq_ack(bbone.irc_addr);189 omap_irc_irq_ack(bbone.irc_addr); 190 190 } 191 191 … … 214 214 indev_t *srln = srln_wire(srln_instance, sink); 215 215 omap_uart_input_wire(&bbone.uart, srln); 216 am335x_irc_enable(bbone.irc_addr, AM335x_UART0_IRQ);216 omap_irc_enable(bbone.irc_addr, AM335x_UART0_IRQ); 217 217 } 218 218 #endif -
kernel/arch/arm32/src/mm/frame.c
r7f84430 r99c2c69e 88 88 void boot_page_table_free(void) 89 89 { 90 unsigned int i; 91 for (i = 0; i < BOOT_PAGE_TABLE_SIZE_IN_FRAMES; i++) 92 frame_free(i * FRAME_SIZE + BOOT_PAGE_TABLE_ADDRESS); 90 frame_free(BOOT_PAGE_TABLE_ADDRESS, 91 BOOT_PAGE_TABLE_SIZE_IN_FRAMES); 93 92 } 94 93 -
kernel/arch/arm32/src/mm/page.c
r7f84430 r99c2c69e 69 69 #ifdef HIGH_EXCEPTION_VECTORS 70 70 /* Create mapping for exception table at high offset */ 71 uintptr_t ev_frame = (uintptr_t) frame_alloc(ONE_FRAME, FRAME_NONE);71 uintptr_t ev_frame = frame_alloc(1, FRAME_NONE, 0); 72 72 page_mapping_insert(AS_KERNEL, EXC_BASE_ADDRESS, ev_frame, flags); 73 73 #else -
kernel/arch/arm32/src/ras.c
r7f84430 r99c2c69e 51 51 void ras_init(void) 52 52 { 53 uintptr_t frame; 54 55 frame = (uintptr_t) frame_alloc(ONE_FRAME, 56 FRAME_ATOMIC | FRAME_HIGHMEM); 53 uintptr_t frame = 54 frame_alloc(1, FRAME_ATOMIC | FRAME_HIGHMEM, 0); 57 55 if (!frame) 58 frame = (uintptr_t) frame_alloc(ONE_FRAME, FRAME_LOWMEM); 56 frame = frame_alloc(1, FRAME_LOWMEM, 0); 57 59 58 ras_page = (uintptr_t *) km_map(frame, 60 59 PAGE_SIZE, PAGE_READ | PAGE_WRITE | PAGE_USER | PAGE_CACHEABLE); 61 60 62 61 memsetb(ras_page, PAGE_SIZE, 0); 63 62 ras_page[RAS_START] = 0; -
kernel/arch/ia32/include/arch/mm/frame.h
r7f84430 r99c2c69e 39 39 #define FRAME_SIZE (1 << FRAME_WIDTH) 40 40 41 #define FRAME_LOWPRIO 0x1000 42 41 43 #ifndef __ASM__ 42 44 -
kernel/arch/ia32/include/arch/mm/page.h
r7f84430 r99c2c69e 66 66 67 67 /* Page table sizes for each level. */ 68 #define PTL0_ SIZE_ARCH ONE_FRAME69 #define PTL1_ SIZE_ARCH 070 #define PTL2_ SIZE_ARCH 071 #define PTL3_ SIZE_ARCH ONE_FRAME68 #define PTL0_FRAMES_ARCH 1 69 #define PTL1_FRAMES_ARCH 1 70 #define PTL2_FRAMES_ARCH 1 71 #define PTL3_FRAMES_ARCH 1 72 72 73 73 /* Macros calculating indices for each level. */ -
kernel/arch/ia32/src/ddi/ddi.c
r7f84430 r99c2c69e 59 59 int ddi_iospace_enable_arch(task_t *task, uintptr_t ioaddr, size_t size) 60 60 { 61 size_t bits = ioaddr + size;62 if ( bits > IO_PORTS)61 size_t elements = ioaddr + size; 62 if (elements > IO_PORTS) 63 63 return ENOENT; 64 64 65 if (task->arch.iomap. bits < bits) {65 if (task->arch.iomap.elements < elements) { 66 66 /* 67 67 * The I/O permission bitmap is too small and needs to be grown. 68 68 */ 69 69 70 uint8_t *newmap = (uint8_t *) malloc(BITS2BYTES(bits), FRAME_ATOMIC);71 if (! newmap)70 void *store = malloc(bitmap_size(elements), FRAME_ATOMIC); 71 if (!store) 72 72 return ENOMEM; 73 73 74 74 bitmap_t oldiomap; 75 bitmap_initialize(&oldiomap, task->arch.iomap. map,75 bitmap_initialize(&oldiomap, task->arch.iomap.elements, 76 76 task->arch.iomap.bits); 77 bitmap_initialize(&task->arch.iomap, newmap, bits); 77 78 bitmap_initialize(&task->arch.iomap, elements, store); 78 79 79 80 /* 80 81 * Mark the new range inaccessible. 81 82 */ 82 bitmap_set_range(&task->arch.iomap, oldiomap. bits,83 bits - oldiomap.bits);83 bitmap_set_range(&task->arch.iomap, oldiomap.elements, 84 elements - oldiomap.elements); 84 85 85 86 /* … … 89 90 if (oldiomap.bits) { 90 91 bitmap_copy(&task->arch.iomap, &oldiomap, 91 oldiomap.bits); 92 free(oldiomap.map); 92 oldiomap.elements); 93 94 free(oldiomap.bits); 93 95 } 94 96 } … … 97 99 * Enable the range and we are done. 98 100 */ 99 bitmap_clear_range(&task->arch.iomap, (size_t) ioaddr, (size_t)size);101 bitmap_clear_range(&task->arch.iomap, (size_t) ioaddr, size); 100 102 101 103 /* … … 119 121 /* First, copy the I/O Permission Bitmap. */ 120 122 irq_spinlock_lock(&TASK->lock, false); 123 121 124 size_t ver = TASK->arch.iomapver; 122 size_t bits = TASK->arch.iomap.bits; 123 if (bits) { 124 ASSERT(TASK->arch.iomap.map); 125 size_t elements = TASK->arch.iomap.elements; 126 127 if (elements > 0) { 128 ASSERT(TASK->arch.iomap.bits); 125 129 126 130 bitmap_t iomap; 127 bitmap_initialize(&iomap, CPU->arch.tss->iomap,128 TSS_IOMAP_SIZE * 8);129 bitmap_copy(&iomap, &TASK->arch.iomap, bits);131 bitmap_initialize(&iomap, TSS_IOMAP_SIZE * 8, 132 CPU->arch.tss->iomap); 133 bitmap_copy(&iomap, &TASK->arch.iomap, elements); 130 134 131 135 /* … … 133 137 * I/O access. 134 138 */ 135 bitmap_set_range(&iomap, bits, ALIGN_UP(bits, 8) - bits); 139 bitmap_set_range(&iomap, elements, 140 ALIGN_UP(elements, 8) - elements); 141 136 142 /* 137 143 * It is safe to set the trailing eight bits because of the 138 144 * extra convenience byte in TSS_IOMAP_SIZE. 139 145 */ 140 bitmap_set_range(&iomap, ALIGN_UP( bits, 8), 8);146 bitmap_set_range(&iomap, ALIGN_UP(elements, 8), 8); 141 147 } 148 142 149 irq_spinlock_unlock(&TASK->lock, false); 143 150 … … 150 157 151 158 descriptor_t *gdt_p = (descriptor_t *) cpugdtr.base; 152 gdt_setlimit(&gdt_p[TSS_DES], TSS_BASIC_SIZE + BITS2BYTES(bits)); 159 size_t size = bitmap_size(elements); 160 gdt_setlimit(&gdt_p[TSS_DES], TSS_BASIC_SIZE + size); 153 161 gdtr_load(&cpugdtr); 154 162 -
kernel/arch/ia32/src/mm/frame.c
r7f84430 r99c2c69e 47 47 48 48 #define PHYSMEM_LIMIT32 UINT64_C(0x100000000) 49 #define PHYSMEM_LIMIT_DMA UINT64_C(0x1000000)50 49 51 50 size_t hardcoded_unmapped_ktext_size = 0; … … 92 91 else 93 92 conf = minconf; 94 95 if ((pfn * PAGE_SIZE) < PHYSMEM_LIMIT_DMA) { 96 size_t dma_count = min( 97 PHYSMEM_LIMIT_DMA / PAGE_SIZE - pfn, 98 count); 99 zone_create(pfn, dma_count, conf, 100 ZONE_AVAILABLE | ZONE_DMA); 101 count -= dma_count; 102 pfn += dma_count; 103 } 104 105 conf = pfn; 106 if (count) { 107 zone_create(pfn, count, conf, 108 ZONE_AVAILABLE | ZONE_LOWMEM); 109 } 93 zone_create(pfn, count, conf, 94 ZONE_AVAILABLE | ZONE_LOWMEM); 110 95 } else { 111 96 conf = zone_external_conf_alloc(count); 112 if (conf != 0) {97 if (conf != 0) 113 98 zone_create(pfn, count, conf, 114 99 ZONE_AVAILABLE | ZONE_HIGHMEM); 115 }116 100 } 117 101 } else if ((e820table[i].type == MEMMAP_MEMORY_ACPI) || -
kernel/arch/ia32/src/proc/task.c
r7f84430 r99c2c69e 40 40 /** Perform ia32 specific task initialization. 41 41 * 42 * @param t Task to be initialized. 42 * @param task Task to be initialized. 43 * 43 44 */ 44 void task_create_arch(task_t *t )45 void task_create_arch(task_t *task) 45 46 { 46 t ->arch.iomapver = 0;47 bitmap_initialize(&t ->arch.iomap, NULL, 0);47 task->arch.iomapver = 0; 48 bitmap_initialize(&task->arch.iomap, 0, NULL); 48 49 } 49 50 50 51 /** Perform ia32 specific task destruction. 51 52 * 52 * @param t Task to be initialized. 53 * @param task Task to be initialized. 54 * 53 55 */ 54 void task_destroy_arch(task_t *t )56 void task_destroy_arch(task_t *task) 55 57 { 56 if (t ->arch.iomap.map)57 free(t ->arch.iomap.map);58 if (task->arch.iomap.bits != NULL) 59 free(task->arch.iomap.bits); 58 60 } 59 61 -
kernel/arch/ia64/include/arch/mm/frame.h
r7f84430 r99c2c69e 39 39 #define FRAME_SIZE (1 << FRAME_WIDTH) 40 40 41 #define FRAME_LOWPRIO 0 42 41 43 #ifndef __ASM__ 42 44 -
kernel/arch/ia64/src/ddi/ddi.c
r7f84430 r99c2c69e 1 1 /* 2 2 * Copyright (c) 2006 Jakub Jermar 3 * Copyright (c) 2008 Jakub vana3 * Copyright (c) 2008 Jakub Vana 4 4 * All rights reserved. 5 5 * … … 56 56 { 57 57 if (!task->arch.iomap) { 58 uint8_t *map;59 60 58 task->arch.iomap = malloc(sizeof(bitmap_t), 0); 61 map = malloc(BITS2BYTES(IO_MEMMAP_PAGES), 0); 62 if(!map) 59 if (task->arch.iomap == NULL) 63 60 return ENOMEM; 64 bitmap_initialize(task->arch.iomap, map, IO_MEMMAP_PAGES); 61 62 void *store = malloc(bitmap_size(IO_MEMMAP_PAGES), 0); 63 if (store == NULL) 64 return ENOMEM; 65 66 bitmap_initialize(task->arch.iomap, IO_MEMMAP_PAGES, store); 65 67 bitmap_clear_range(task->arch.iomap, 0, IO_MEMMAP_PAGES); 66 68 } … … 69 71 size = ALIGN_UP(size + ioaddr - 4 * iopage, PORTS_PER_PAGE); 70 72 bitmap_set_range(task->arch.iomap, iopage, size / 4); 71 73 72 74 return 0; 73 75 } -
kernel/arch/ia64/src/mm/vhpt.c
r7f84430 r99c2c69e 42 42 uintptr_t vhpt_set_up(void) 43 43 { 44 vhpt_base = frame_alloc(VHPT_WIDTH - FRAME_WIDTH,45 FRAME_KA | FRAME_ATOMIC);46 if (!vhpt_ base)44 uintptr_t vhpt_frame = 45 frame_alloc(SIZE2FRAMES(VHPT_SIZE), FRAME_ATOMIC, 0); 46 if (!vhpt_frame) 47 47 panic("Kernel configured with VHPT but no memory for table."); 48 49 vhpt_base = (vhpt_entry_t *) PA2KA(vhpt_frame); 48 50 vhpt_invalidate_all(); 49 51 return (uintptr_t) vhpt_base; … … 82 84 void vhpt_invalidate_all() 83 85 { 84 memsetb(vhpt_base, 1 << VHPT_WIDTH, 0);86 memsetb(vhpt_base, VHPT_SIZE, 0); 85 87 } 86 88 -
kernel/arch/mips32/include/arch/mm/frame.h
r7f84430 r99c2c69e 39 39 #define FRAME_SIZE (1 << FRAME_WIDTH) 40 40 41 #define FRAME_LOWPRIO 0 42 41 43 #ifndef __ASM__ 42 44 -
kernel/arch/mips32/include/arch/mm/page.h
r7f84430 r99c2c69e 27 27 */ 28 28 29 /** @addtogroup mips32mm 29 /** @addtogroup mips32mm 30 30 * @{ 31 31 */ … … 70 70 * - PTL3 has 4096 entries (12 bits) 71 71 */ 72 72 73 73 /* Macros describing number of entries in each level. */ 74 #define PTL0_ENTRIES_ARCH 6475 #define PTL1_ENTRIES_ARCH 076 #define PTL2_ENTRIES_ARCH 077 #define PTL3_ENTRIES_ARCH 409674 #define PTL0_ENTRIES_ARCH 64 75 #define PTL1_ENTRIES_ARCH 0 76 #define PTL2_ENTRIES_ARCH 0 77 #define PTL3_ENTRIES_ARCH 4096 78 78 79 79 /* Macros describing size of page tables in each level. */ 80 #define PTL0_ SIZE_ARCH ONE_FRAME81 #define PTL1_ SIZE_ARCH 082 #define PTL2_ SIZE_ARCH 083 #define PTL3_ SIZE_ARCH ONE_FRAME80 #define PTL0_FRAMES_ARCH 1 81 #define PTL1_FRAMES_ARCH 1 82 #define PTL2_FRAMES_ARCH 1 83 #define PTL3_FRAMES_ARCH 1 84 84 85 85 /* Macros calculating entry indices for each level. */ 86 #define PTL0_INDEX_ARCH(vaddr) ((vaddr) >> 26)87 #define PTL1_INDEX_ARCH(vaddr) 088 #define PTL2_INDEX_ARCH(vaddr) 089 #define PTL3_INDEX_ARCH(vaddr) (((vaddr) >> 14) & 0xfff)86 #define PTL0_INDEX_ARCH(vaddr) ((vaddr) >> 26) 87 #define PTL1_INDEX_ARCH(vaddr) 0 88 #define PTL2_INDEX_ARCH(vaddr) 0 89 #define PTL3_INDEX_ARCH(vaddr) (((vaddr) >> 14) & 0xfff) 90 90 91 91 /* Set accessor for PTL0 address. */ 92 92 #define SET_PTL0_ADDRESS_ARCH(ptl0) 93 93 94 /* Get PTE address accessors for each level. */ 94 /* Get PTE address accessors for each level. */ 95 95 #define GET_PTL1_ADDRESS_ARCH(ptl0, i) \ 96 96 (((pte_t *) (ptl0))[(i)].pfn << 12) … … 196 196 p->p = 1; 197 197 } 198 199 198 200 199 extern void page_arch_init(void); -
kernel/arch/mips32/src/mach/malta/malta.c
r7f84430 r99c2c69e 103 103 void malta_input_init(void) 104 104 { 105 (void) stdin_wire(); 105 106 } 106 107 -
kernel/arch/mips32/src/mm/tlb.c
r7f84430 r99c2c69e 48 48 #include <symtab.h> 49 49 50 #define PFN_SHIFT 12 51 #define VPN_SHIFT 12 52 #define ADDR2VPN(a) ((a) >> VPN_SHIFT) 53 #define ADDR2VPN2(a) (ADDR2VPN((a)) >> 1) 54 #define VPN2ADDR(vpn) ((vpn) << VPN_SHIFT) 55 #define VPN22ADDR(vpn2) (VPN2ADDR(vpn2) << 1) 56 #define PFN2ADDR(pfn) ((pfn) << PFN_SHIFT) 57 58 #define BANK_SELECT_BIT(a) (((a) >> PAGE_WIDTH) & 1) 59 50 #define PFN_SHIFT 12 51 #define VPN_SHIFT 12 52 53 #define ADDR2HI_VPN(a) ((a) >> VPN_SHIFT) 54 #define ADDR2HI_VPN2(a) (ADDR2HI_VPN((a)) >> 1) 55 56 #define HI_VPN2ADDR(vpn) ((vpn) << VPN_SHIFT) 57 #define HI_VPN22ADDR(vpn2) (HI_VPN2ADDR(vpn2) << 1) 58 59 #define LO_PFN2ADDR(pfn) ((pfn) << PFN_SHIFT) 60 61 #define BANK_SELECT_BIT(a) (((a) >> PAGE_WIDTH) & 1) 60 62 61 63 /** Initialize TLB. … … 266 268 { 267 269 hi->value = 0; 268 hi->vpn2 = ADDR2 VPN2(ALIGN_DOWN(addr, PAGE_SIZE));270 hi->vpn2 = ADDR2HI_VPN2(ALIGN_DOWN(addr, PAGE_SIZE)); 269 271 hi->asid = asid; 270 272 } … … 295 297 296 298 printf("%-4u %-6u %0#10x %-#6x %1u%1u%1u%1u %0#10x\n", 297 i, hi.asid, VPN22ADDR(hi.vpn2), mask.mask,298 lo0.g, lo0.v, lo0.d, lo0.c, PFN2ADDR(lo0.pfn));299 i, hi.asid, HI_VPN22ADDR(hi.vpn2), mask.mask, 300 lo0.g, lo0.v, lo0.d, lo0.c, LO_PFN2ADDR(lo0.pfn)); 299 301 printf(" %1u%1u%1u%1u %0#10x\n", 300 lo1.g, lo1.v, lo1.d, lo1.c, PFN2ADDR(lo1.pfn));302 lo1.g, lo1.v, lo1.d, lo1.c, LO_PFN2ADDR(lo1.pfn)); 301 303 } 302 304 -
kernel/arch/mips64/include/arch/mm/frame.h
r7f84430 r99c2c69e 39 39 #define FRAME_SIZE (1 << FRAME_WIDTH) 40 40 41 #define FRAME_LOWPRIO 0 42 41 43 #ifndef __ASM__ 42 44 -
kernel/arch/ppc32/include/arch/mm/frame.h
r7f84430 r99c2c69e 39 39 #define FRAME_SIZE (1 << FRAME_WIDTH) 40 40 41 #define FRAME_LOWPRIO 0 42 41 43 #ifndef __ASM__ 42 44 -
kernel/arch/ppc32/include/arch/mm/page.h
r7f84430 r99c2c69e 70 70 71 71 /* Page table sizes for each level. */ 72 #define PTL0_ SIZE_ARCH ONE_FRAME73 #define PTL1_ SIZE_ARCH 074 #define PTL2_ SIZE_ARCH 075 #define PTL3_ SIZE_ARCH ONE_FRAME72 #define PTL0_FRAMES_ARCH 1 73 #define PTL1_FRAMES_ARCH 1 74 #define PTL2_FRAMES_ARCH 1 75 #define PTL3_FRAMES_ARCH 1 76 76 77 77 /* Macros calculating indices into page tables on each level. */ -
kernel/arch/sparc64/include/arch/mm/frame.h
r7f84430 r99c2c69e 46 46 #endif 47 47 48 #ifndef __ASM__ 49 50 #include <typedefs.h> 51 52 extern uintptr_t end_of_identity; 53 54 extern void frame_low_arch_init(void); 55 extern void frame_high_arch_init(void); 56 #define physmem_print() 57 58 #endif 59 48 60 #endif 49 61 -
kernel/arch/sparc64/include/arch/mm/sun4u/frame.h
r7f84430 r99c2c69e 27 27 */ 28 28 29 /** @addtogroup sparc64mm 29 /** @addtogroup sparc64mm 30 30 * @{ 31 31 */ … … 41 41 * Therefore, the kernel uses 8K only internally on the TLB and TSB levels. 42 42 */ 43 #define MMU_FRAME_WIDTH 13/* 8K */44 #define MMU_FRAME_SIZE (1 << MMU_FRAME_WIDTH)43 #define MMU_FRAME_WIDTH 13 /* 8K */ 44 #define MMU_FRAME_SIZE (1 << MMU_FRAME_WIDTH) 45 45 46 46 /* … … 49 49 * each 16K page with a pair of adjacent 8K pages. 50 50 */ 51 #define FRAME_WIDTH 14 /* 16K */ 52 #define FRAME_SIZE (1 << FRAME_WIDTH) 51 #define FRAME_WIDTH 14 /* 16K */ 52 #define FRAME_SIZE (1 << FRAME_WIDTH) 53 54 #define FRAME_LOWPRIO 0 53 55 54 56 #ifndef __ASM__ … … 72 74 typedef union frame_address frame_address_t; 73 75 74 extern uintptr_t end_of_identity;75 76 extern void frame_low_arch_init(void);77 extern void frame_high_arch_init(void);78 #define physmem_print()79 80 76 #endif 81 77 -
kernel/arch/sparc64/include/arch/mm/sun4v/frame.h
r7f84430 r99c2c69e 27 27 */ 28 28 29 /** @addtogroup sparc64mm 29 /** @addtogroup sparc64mm 30 30 * @{ 31 31 */ … … 36 36 #define KERN_sparc64_sun4v_FRAME_H_ 37 37 38 #define MMU_FRAME_WIDTH 13/* 8K */39 #define MMU_FRAME_SIZE (1 << MMU_FRAME_WIDTH)38 #define MMU_FRAME_WIDTH 13 /* 8K */ 39 #define MMU_FRAME_SIZE (1 << MMU_FRAME_WIDTH) 40 40 41 #define FRAME_WIDTH 1342 #define FRAME_SIZE (1 << FRAME_WIDTH)41 #define FRAME_WIDTH 13 42 #define FRAME_SIZE (1 << FRAME_WIDTH) 43 43 44 #ifndef __ASM__ 45 46 #include <typedefs.h> 47 48 extern void frame_low_arch_init(void); 49 extern void frame_high_arch_init(void); 50 #define physmem_print() 51 52 #endif 44 #define FRAME_LOWPRIO 0 53 45 54 46 #endif -
kernel/arch/sparc64/include/arch/trap/sun4v/mmu.h
r7f84430 r99c2c69e 102 102 nop 103 103 104 /* exclude pages beyond the end of memory from the identity mapping */ 105 sethi %hi(end_of_identity), %g4 106 ldx [%g4 + %lo(end_of_identity)], %g4 107 cmp %g1, %g4 108 bgeu %xcc, 0f 109 nop 110 104 111 /* 105 112 * Installing the identity does not fit into 32 instructions, call -
kernel/arch/sparc64/src/mm/sun4u/as.c
r7f84430 r99c2c69e 63 63 { 64 64 #ifdef CONFIG_TSB 65 /* 66 * The order must be calculated with respect to the emulated 67 * 16K page size. 68 * 69 */ 70 uint8_t order = fnzb32(((ITSB_ENTRY_COUNT + DTSB_ENTRY_COUNT) * 71 sizeof(tsb_entry_t)) >> FRAME_WIDTH); 72 73 uintptr_t tsb = (uintptr_t) frame_alloc(order, flags | FRAME_KA); 74 75 if (!tsb) 65 uintptr_t tsb_phys = 66 frame_alloc(SIZE2FRAMES((ITSB_ENTRY_COUNT + DTSB_ENTRY_COUNT) * 67 sizeof(tsb_entry_t)), flags, 0); 68 if (!tsb_phys) 76 69 return -1; 77 70 78 as->arch.itsb = (tsb_entry_t *) tsb; 79 as->arch.dtsb = (tsb_entry_t *) (tsb + ITSB_ENTRY_COUNT * 71 tsb_entry_t *tsb = (tsb_entry_t *) PA2KA(tsb_phys); 72 73 as->arch.itsb = tsb; 74 as->arch.dtsb = tsb + ITSB_ENTRY_COUNT; 75 76 memsetb(as->arch.itsb, (ITSB_ENTRY_COUNT + DTSB_ENTRY_COUNT) * 77 sizeof(tsb_entry_t), 0); 78 #endif 79 80 return 0; 81 } 82 83 int as_destructor_arch(as_t *as) 84 { 85 #ifdef CONFIG_TSB 86 size_t frames = SIZE2FRAMES((ITSB_ENTRY_COUNT + DTSB_ENTRY_COUNT) * 80 87 sizeof(tsb_entry_t)); 81 82 memsetb(as->arch.itsb, 83 (ITSB_ENTRY_COUNT + DTSB_ENTRY_COUNT) * sizeof(tsb_entry_t), 0); 84 #endif 85 86 return 0; 87 } 88 89 int as_destructor_arch(as_t *as) 90 { 91 #ifdef CONFIG_TSB 92 /* 93 * The count must be calculated with respect to the emualted 16K page 94 * size. 95 */ 96 size_t cnt = ((ITSB_ENTRY_COUNT + DTSB_ENTRY_COUNT) * 97 sizeof(tsb_entry_t)) >> FRAME_WIDTH; 98 frame_free(KA2PA((uintptr_t) as->arch.itsb)); 99 100 return cnt; 88 frame_free(KA2PA((uintptr_t) as->arch.itsb), frames); 89 90 return frames; 101 91 #else 102 92 return 0; -
kernel/arch/sparc64/src/mm/sun4v/as.c
r7f84430 r99c2c69e 66 66 { 67 67 #ifdef CONFIG_TSB 68 uint8_t order = fnzb32( 69 (TSB_ENTRY_COUNT * sizeof(tsb_entry_t)) >> FRAME_WIDTH); 70 71 uintptr_t tsb = (uintptr_t) frame_alloc(order, flags); 72 68 uintptr_t tsb = 69 frame_alloc(SIZE2FRAMES(TSB_ENTRY_COUNT * sizeof(tsb_entry_t)), 70 flags, 0); 73 71 if (!tsb) 74 72 return -1; … … 92 90 { 93 91 #ifdef CONFIG_TSB 94 size_t cnt = (TSB_ENTRY_COUNT * sizeof(tsb_entry_t)) >> FRAME_WIDTH;95 frame_free( (uintptr_t) as->arch.tsb_description.tsb_base);92 size_t frames = SIZE2FRAMES(TSB_ENTRY_COUNT * sizeof(tsb_entry_t)); 93 frame_free(as->arch.tsb_description.tsb_base, frames); 96 94 97 return cnt;95 return frames; 98 96 #else 99 97 return 0; -
kernel/arch/sparc64/src/mm/sun4v/frame.c
r7f84430 r99c2c69e 101 101 */ 102 102 frame_mark_unavailable(ADDR2PFN(KA2PA(PFN2ADDR(0))), 1); 103 104 /* PA2KA will work only on low-memory. */ 105 end_of_identity = PA2KA(config.physmem_end - FRAME_SIZE) + PAGE_SIZE; 103 106 } 104 107 -
kernel/arch/sparc64/src/mm/sun4v/tlb.c
r7f84430 r99c2c69e 251 251 uintptr_t va = DMISS_ADDRESS(page_and_ctx); 252 252 uint16_t ctx = DMISS_CONTEXT(page_and_ctx); 253 as_t *as = AS; 253 254 254 255 if (ctx == ASID_KERNEL) { … … 256 257 /* NULL access in kernel */ 257 258 panic("NULL pointer dereference."); 259 } else if (va >= end_of_identity) { 260 /* Kernel non-identity */ 261 as = AS_KERNEL; 262 } else { 263 panic("Unexpected kernel page fault."); 258 264 } 259 panic("Unexpected kernel page fault."); 260 } 261 262 t = page_mapping_find(AS, va, true); 265 } 266 267 t = page_mapping_find(as, va, true); 263 268 if (t) { 264 269 /* … … 295 300 uintptr_t va = DMISS_ADDRESS(page_and_ctx); 296 301 uint16_t ctx = DMISS_CONTEXT(page_and_ctx); 297 298 t = page_mapping_find(AS, va, true); 302 as_t *as = AS; 303 304 if (ctx == ASID_KERNEL) 305 as = AS_KERNEL; 306 307 t = page_mapping_find(as, va, true); 299 308 if (t && PTE_WRITABLE(t)) { 300 309 /* -
kernel/arch/sparc64/src/sun4v/start.S
r7f84430 r99c2c69e 345 345 .quad 0 346 346 347 /* 348 * This variable is used by the fast_data_access_MMU_miss trap handler. 349 * In runtime, it is modified to contain the address of the end of physical 350 * memory. 351 */ 352 .global end_of_identity 353 end_of_identity: 354 .quad -1 355 347 356 .global kernel_8k_tlb_data_template 348 357 kernel_8k_tlb_data_template:
Note:
See TracChangeset
for help on using the changeset viewer.
