- Timestamp:
- 2010-11-18T21:58:27Z (15 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 4e5c7ba
- Parents:
- 69e0d6d (diff), 45f04f8 (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
- Files:
-
- 8 edited
-
arch/amd64/include/mm/as.h (modified) (1 diff)
-
arch/amd64/include/pm.h (modified) (1 diff)
-
arch/amd64/src/ddi/ddi.c (modified) (1 diff)
-
arch/ia32/include/pm.h (modified) (1 diff)
-
arch/ia32/src/ddi/ddi.c (modified) (1 diff)
-
generic/include/typedefs.h (modified) (1 diff)
-
generic/src/adt/bitmap.c (modified) (9 diffs)
-
generic/src/syscall/copy.c (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/amd64/include/mm/as.h
r69e0d6d rcb569e6 36 36 #define KERN_amd64_AS_H_ 37 37 38 #define ADDRESS_SPACE_HOLE_START 0x0000800000000000ULL 39 #define ADDRESS_SPACE_HOLE_END 0xffff7fffffffffffULL 40 38 41 #define KERNEL_ADDRESS_SPACE_SHADOWED_ARCH 0 39 42 40 #define KERNEL_ADDRESS_SPACE_START_ARCH (unsigned long) 0xffff80000000000041 #define KERNEL_ADDRESS_SPACE_END_ARCH (unsigned long) 0xffffffffffffffff43 #define KERNEL_ADDRESS_SPACE_START_ARCH 0xffff800000000000ULL 44 #define KERNEL_ADDRESS_SPACE_END_ARCH 0xffffffffffffffffULL 42 45 43 #define USER_ADDRESS_SPACE_START_ARCH (unsigned long) 0x000000000000000044 #define USER_ADDRESS_SPACE_END_ARCH (unsigned long) 0x00007fffffffffff46 #define USER_ADDRESS_SPACE_START_ARCH 0x0000000000000000ULL 47 #define USER_ADDRESS_SPACE_END_ARCH 0x00007fffffffffffULL 45 48 46 49 #define USTACK_ADDRESS_ARCH (USER_ADDRESS_SPACE_END_ARCH - (PAGE_SIZE - 1)) -
kernel/arch/amd64/include/pm.h
r69e0d6d rcb569e6 83 83 84 84 #define TSS_BASIC_SIZE 104 85 #define TSS_IOMAP_SIZE ( 16 * 1024 + 1) /* 16K for bitmap + 1 terminating byte for convenience */85 #define TSS_IOMAP_SIZE (8 * 1024 + 1) /* 8K for bitmap + 1 terminating byte for convenience */ 86 86 87 87 #define IO_PORTS (64 * 1024) -
kernel/arch/amd64/src/ddi/ddi.c
r69e0d6d rcb569e6 126 126 bitmap_initialize(&iomap, CPU->arch.tss->iomap, 127 127 TSS_IOMAP_SIZE * 8); 128 bitmap_copy(&iomap, &TASK->arch.iomap, TASK->arch.iomap.bits);128 bitmap_copy(&iomap, &TASK->arch.iomap, bits); 129 129 130 /* 131 * Set the trailing bits in the last byte of the map to disable 132 * I/O access. 133 */ 134 bitmap_set_range(&iomap, bits, ALIGN_UP(bits, 8) - bits); 130 135 /* 131 136 * It is safe to set the trailing eight bits because of the 132 137 * extra convenience byte in TSS_IOMAP_SIZE. 133 138 */ 134 bitmap_set_range(&iomap, ALIGN_UP( TASK->arch.iomap.bits, 8), 8);139 bitmap_set_range(&iomap, ALIGN_UP(bits, 8), 8); 135 140 } 136 141 irq_spinlock_unlock(&TASK->lock, false); -
kernel/arch/ia32/include/pm.h
r69e0d6d rcb569e6 75 75 76 76 #define TSS_BASIC_SIZE 104 77 #define TSS_IOMAP_SIZE ( 16 * 1024 + 1) /* 16K for bitmap + 1 terminating byte for convenience */77 #define TSS_IOMAP_SIZE (8 * 1024 + 1) /* 8K for bitmap + 1 terminating byte for convenience */ 78 78 79 79 #define IO_PORTS (64 * 1024) -
kernel/arch/ia32/src/ddi/ddi.c
r69e0d6d rcb569e6 127 127 bitmap_initialize(&iomap, CPU->arch.tss->iomap, 128 128 TSS_IOMAP_SIZE * 8); 129 bitmap_copy(&iomap, &TASK->arch.iomap, TASK->arch.iomap.bits);129 bitmap_copy(&iomap, &TASK->arch.iomap, bits); 130 130 131 /* 132 * Set the trailing bits in the last byte of the map to disable 133 * I/O access. 134 */ 135 bitmap_set_range(&iomap, bits, ALIGN_UP(bits, 8) - bits); 131 136 /* 132 137 * It is safe to set the trailing eight bits because of the 133 138 * extra convenience byte in TSS_IOMAP_SIZE. 134 139 */ 135 bitmap_set_range(&iomap, ALIGN_UP( TASK->arch.iomap.bits, 8), 8);140 bitmap_set_range(&iomap, ALIGN_UP(bits, 8), 8); 136 141 } 137 142 irq_spinlock_unlock(&TASK->lock, false); -
kernel/generic/include/typedefs.h
r69e0d6d rcb569e6 40 40 #include <arch/types.h> 41 41 42 #define NULL 0 42 #define NULL 0UL 43 43 44 44 #define false 0 -
kernel/generic/src/adt/bitmap.c
r69e0d6d rcb569e6 32 32 /** 33 33 * @file 34 * @brief Implementation of bitmap ADT.34 * @brief Implementation of bitmap ADT. 35 35 * 36 36 * This file implements bitmap ADT and provides functions for … … 51 51 * No portion of the bitmap is set or cleared by this function. 52 52 * 53 * @param bitmap Bitmap structure.54 * @param map Address of the memory used to hold the map.55 * @param bits Number of bits stored in bitmap.53 * @param bitmap Bitmap structure. 54 * @param map Address of the memory used to hold the map. 55 * @param bits Number of bits stored in bitmap. 56 56 */ 57 57 void bitmap_initialize(bitmap_t *bitmap, uint8_t *map, size_t bits) … … 63 63 /** Set range of bits. 64 64 * 65 * @param bitmap Bitmap structure.66 * @param start Starting bit.67 * @param bits Number of bits to set.65 * @param bitmap Bitmap structure. 66 * @param start Starting bit. 67 * @param bits Number of bits to set. 68 68 */ 69 69 void bitmap_set_range(bitmap_t *bitmap, size_t start, size_t bits) … … 71 71 size_t i = 0; 72 72 size_t aligned_start; 73 size_t lub; /* leading unaligned bits */74 size_t amb; /* aligned middle bits */75 size_t tab; /* trailing aligned bits */73 size_t lub; /* leading unaligned bits */ 74 size_t amb; /* aligned middle bits */ 75 size_t tab; /* trailing aligned bits */ 76 76 77 77 ASSERT(start + bits <= bitmap->bits); … … 82 82 tab = amb % 8; 83 83 84 if ( start + bits < aligned_start ) { 85 /* 86 * Set bits in the middle of byte 87 */ 88 bitmap->map[start / 8] |= ((1 << lub)-1) << (start&7); 89 return; 84 if (!bits) 85 return; 86 87 if (start + bits < aligned_start) { 88 /* Set bits in the middle of byte. */ 89 bitmap->map[start / 8] |= ((1 << lub) - 1) << (start & 7); 90 return; 90 91 } 91 92 92 93 if (lub) { 93 /* 94 * Make sure to set any leading unaligned bits. 95 */ 94 /* Make sure to set any leading unaligned bits. */ 96 95 bitmap->map[start / 8] |= ~((1 << (8 - lub)) - 1); 97 96 } 98 97 for (i = 0; i < amb / 8; i++) { 99 /* 100 * The middle bits can be set byte by byte. 101 */ 98 /* The middle bits can be set byte by byte. */ 102 99 bitmap->map[aligned_start / 8 + i] = ALL_ONES; 103 100 } 104 101 if (tab) { 105 /* 106 * Make sure to set any trailing aligned bits. 107 */ 102 /* Make sure to set any trailing aligned bits. */ 108 103 bitmap->map[aligned_start / 8 + i] |= (1 << tab) - 1; 109 104 } … … 113 108 /** Clear range of bits. 114 109 * 115 * @param bitmap Bitmap structure.116 * @param start Starting bit.117 * @param bits Number of bits to clear.110 * @param bitmap Bitmap structure. 111 * @param start Starting bit. 112 * @param bits Number of bits to clear. 118 113 */ 119 114 void bitmap_clear_range(bitmap_t *bitmap, size_t start, size_t bits) … … 121 116 size_t i = 0; 122 117 size_t aligned_start; 123 size_t lub; /* leading unaligned bits */124 size_t amb; /* aligned middle bits */125 size_t tab; /* trailing aligned bits */118 size_t lub; /* leading unaligned bits */ 119 size_t amb; /* aligned middle bits */ 120 size_t tab; /* trailing aligned bits */ 126 121 127 122 ASSERT(start + bits <= bitmap->bits); … … 132 127 tab = amb % 8; 133 128 134 if ( start + bits < aligned_start)135 {136 /* 137 * Set bits in the middle of byte138 */139 bitmap->map[start / 8] &= ~(((1 << lub)-1) << (start&7));140 return;129 if (!bits) 130 return; 131 132 if (start + bits < aligned_start) { 133 /* Set bits in the middle of byte */ 134 bitmap->map[start / 8] &= ~(((1 << lub) - 1) << (start & 7)); 135 return; 141 136 } 142 137 143 144 138 if (lub) { 145 /* 146 * Make sure to clear any leading unaligned bits. 147 */ 139 /* Make sure to clear any leading unaligned bits. */ 148 140 bitmap->map[start / 8] &= (1 << (8 - lub)) - 1; 149 141 } 150 142 for (i = 0; i < amb / 8; i++) { 151 /* 152 * The middle bits can be cleared byte by byte. 153 */ 143 /* The middle bits can be cleared byte by byte. */ 154 144 bitmap->map[aligned_start / 8 + i] = ALL_ZEROES; 155 145 } 156 146 if (tab) { 157 /* 158 * Make sure to clear any trailing aligned bits. 159 */ 147 /* Make sure to clear any trailing aligned bits. */ 160 148 bitmap->map[aligned_start / 8 + i] &= ~((1 << tab) - 1); 161 149 } … … 165 153 /** Copy portion of one bitmap into another bitmap. 166 154 * 167 * @param dst Destination bitmap.168 * @param src Source bitmap.169 * @param bits Number of bits to copy.155 * @param dst Destination bitmap. 156 * @param src Source bitmap. 157 * @param bits Number of bits to copy. 170 158 */ 171 159 void bitmap_copy(bitmap_t *dst, bitmap_t *src, size_t bits) -
kernel/generic/src/syscall/copy.c
r69e0d6d rcb569e6 68 68 if (!KERNEL_ADDRESS_SPACE_SHADOWED) { 69 69 if (overlaps((uintptr_t) uspace_src, size, 70 KERNEL_ADDRESS_SPACE_START, KERNEL_ADDRESS_SPACE_END-KERNEL_ADDRESS_SPACE_START)) { 70 KERNEL_ADDRESS_SPACE_START, 71 KERNEL_ADDRESS_SPACE_END - KERNEL_ADDRESS_SPACE_START)) { 71 72 /* 72 73 * The userspace source block conflicts with kernel address space. … … 75 76 } 76 77 } 78 79 #ifdef ADDRESS_SPACE_HOLE_START 80 /* 81 * Check whether the address is outside the address space hole. 82 */ 83 if (overlaps((uintptr_t) uspace_src, size, ADDRESS_SPACE_HOLE_START, 84 ADDRESS_SPACE_HOLE_END - ADDRESS_SPACE_HOLE_START)) 85 return EPERM; 86 #endif 77 87 78 88 ipl = interrupts_disable(); … … 109 119 if (!KERNEL_ADDRESS_SPACE_SHADOWED) { 110 120 if (overlaps((uintptr_t) uspace_dst, size, 111 KERNEL_ADDRESS_SPACE_START, KERNEL_ADDRESS_SPACE_END-KERNEL_ADDRESS_SPACE_START)) { 121 KERNEL_ADDRESS_SPACE_START, 122 KERNEL_ADDRESS_SPACE_END - KERNEL_ADDRESS_SPACE_START)) { 112 123 /* 113 124 * The userspace destination block conflicts with kernel address space. … … 116 127 } 117 128 } 129 130 #ifdef ADDRESS_SPACE_HOLE_START 131 /* 132 * Check whether the address is outside the address space hole. 133 */ 134 if (overlaps((uintptr_t) uspace_dst, size, ADDRESS_SPACE_HOLE_START, 135 ADDRESS_SPACE_HOLE_END - ADDRESS_SPACE_HOLE_START)) 136 return EPERM; 137 #endif 118 138 119 139 ipl = interrupts_disable();
Note:
See TracChangeset
for help on using the changeset viewer.
