Rev 1856 | Rev 1860 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 1856 | Rev 1857 | ||
|---|---|---|---|
| Line 76... | Line 76... | ||
| 76 | /* |
76 | /* |
| 77 | * If this thread executes also in userspace, we have to lock |
77 | * If this thread executes also in userspace, we have to lock |
| 78 | * its userspace window buffer into DTLB. |
78 | * its userspace window buffer into DTLB. |
| 79 | */ |
79 | */ |
| 80 | ASSERT(THREAD->arch.uspace_window_buffer); |
80 | ASSERT(THREAD->arch.uspace_window_buffer); |
| 81 | uintptr_t uw_buf = (uintptr_t) THREAD->arch.uspace_window_buffer; |
81 | uintptr_t uw_buf = ALIGN_DOWN((uintptr_t) THREAD->arch.uspace_window_buffer, PAGE_SIZE); |
| 82 | if (!overlaps(uw_buf, PAGE_SIZE, base, 1<<KERNEL_PAGE_WIDTH)) { |
82 | if (!overlaps(uw_buf, PAGE_SIZE, base, 1<<KERNEL_PAGE_WIDTH)) { |
| 83 | /* |
83 | /* |
| 84 | * The buffer is not covered by the 4M locked kernel DTLB entry. |
84 | * The buffer is not covered by the 4M locked kernel DTLB entry. |
| 85 | */ |
85 | */ |
| 86 | dtlb_demap(TLB_DEMAP_PAGE, TLB_DEMAP_NUCLEUS, (uintptr_t) uw_buf); |
86 | dtlb_demap(TLB_DEMAP_PAGE, TLB_DEMAP_NUCLEUS, uw_buf); |
| 87 | dtlb_insert_mapping(uw_buf, KA2PA(uw_buf), PAGESIZE_8K, true, true); |
87 | dtlb_insert_mapping(uw_buf, KA2PA(uw_buf), PAGESIZE_8K, true, true); |
| 88 | } |
88 | } |
| 89 | 89 | ||
| 90 | /* |
90 | /* |
| 91 | * Write kernel stack address to %g6 and a pointer to the last item |
91 | * Write kernel stack address to %g6 and a pointer to the last item |
| Line 124... | Line 124... | ||
| 124 | */ |
124 | */ |
| 125 | ASSERT(THREAD->arch.uspace_window_buffer); |
125 | ASSERT(THREAD->arch.uspace_window_buffer); |
| 126 | 126 | ||
| 127 | flushw(); /* force all userspace windows into memory */ |
127 | flushw(); /* force all userspace windows into memory */ |
| 128 | 128 | ||
| 129 | uintptr_t uw_buf = (uintptr_t) THREAD->arch.uspace_window_buffer; |
129 | uintptr_t uw_buf = ALIGN_DOWN((uintptr_t) THREAD->arch.uspace_window_buffer, PAGE_SIZE); |
| 130 | if (!overlaps(uw_buf, PAGE_SIZE, base, 1<<KERNEL_PAGE_WIDTH)) { |
130 | if (!overlaps(uw_buf, PAGE_SIZE, base, 1<<KERNEL_PAGE_WIDTH)) { |
| 131 | /* |
131 | /* |
| 132 | * The buffer is not covered by the 4M locked kernel DTLB entry |
132 | * The buffer is not covered by the 4M locked kernel DTLB entry |
| 133 | * and therefore it was given a dedicated locked DTLB entry. |
133 | * and therefore it was given a dedicated locked DTLB entry. |
| 134 | * Demap it. |
134 | * Demap it. |
| 135 | */ |
135 | */ |
| 136 | dtlb_demap(TLB_DEMAP_PAGE, TLB_DEMAP_NUCLEUS, (uintptr_t) uw_buf); |
136 | dtlb_demap(TLB_DEMAP_PAGE, TLB_DEMAP_NUCLEUS, uw_buf); |
| 137 | } |
137 | } |
| 138 | 138 | ||
| 139 | /* sample the state of the userspace window buffer */ |
139 | /* sample the state of the userspace window buffer */ |
| 140 | THREAD->arch.uspace_window_buffer = (uint8_t *) read_from_ag_g7(); |
140 | THREAD->arch.uspace_window_buffer = (uint8_t *) read_from_ag_g7(); |
| 141 | } |
141 | } |