Changeset 57da95c in mainline for kernel/arch/sparc64/src


Ignore:
Timestamp:
2006-09-18T11:47:28Z (19 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
29b2bbf
Parents:
f1d1f5d3
Message:
  • Create a dedicated slab cache for as_t objects and switch from malloc/free to slab_alloc/slab_free for

them.

  • Slightly fix and improve both the kernel and userspace atomic_add() on sparc64.
  • More TSB work on the sparc64 front.
Location:
kernel/arch/sparc64/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/sparc64/src/mm/as.c

    rf1d1f5d3 r57da95c  
    3737#include <genarch/mm/as_ht.h>
    3838#include <genarch/mm/asid_fifo.h>
     39#include <debug.h>
     40
     41#ifdef CONFIG_TSB
     42#include <arch/mm/tsb.h>
     43#endif
    3944
    4045/** Architecture dependent address space init. */
     
    4550}
    4651
     52/** Perform sparc64-specific tasks when an address space becomes active on the processor.
     53 *
     54 * Install ASID and map TSBs.
     55 *
     56 * @param as Address space.
     57 */
    4758void as_install_arch(as_t *as)
    4859{
    4960        tlb_context_reg_t ctx;
     61       
     62        /*
     63         * Note that we don't lock the address space.
     64         * That's correct - we can afford it here
     65         * because we only read members that are
     66         * currently read-only.
     67         */
    5068       
    5169        /*
     
    5977        ctx.context = as->asid;
    6078        mmu_secondary_context_write(ctx.v);
     79
     80#ifdef CONFIG_TSB       
     81        if (as != AS_KERNEL) {
     82                uintptr_t base = ALIGN_DOWN(config.base, 1 << KERNEL_PAGE_WIDTH);
     83
     84                ASSERT(as->arch.itsb && as->arch.dtsb);
     85
     86                uintptr_t tsb = as->arch.itsb;
     87               
     88                if (!overlaps(tsb, 8*PAGE_SIZE, base, 1 << KERNEL_PAGE_WIDTH)) {
     89                        /*
     90                         * TSBs were allocated from memory not covered
     91                         * by the locked 4M kernel DTLB entry. We need
     92                         * to map both TSBs explicitly.
     93                         */
     94                        dtlb_demap(TLB_DEMAP_PAGE, TLB_DEMAP_NUCLEUS, tsb);
     95                        dtlb_insert_mapping(tsb, KA2PA(tsb), PAGESIZE_64K, true, true);
     96                }
     97               
     98                /*
     99                 * Setup TSB Base registers.
     100                 */
     101                tsb_base_reg_t tsb_base;
     102               
     103                tsb_base.value = 0;
     104                tsb_base.size = TSB_SIZE;
     105                tsb_base.split = 0;
     106
     107                tsb_base.base = as->arch.itsb >> PAGE_WIDTH;
     108                itsb_base_write(tsb_base.value);
     109                tsb_base.base = as->arch.dtsb >> PAGE_WIDTH;
     110                dtsb_base_write(tsb_base.value);
     111        }
     112#endif
     113}
     114
     115/** Perform sparc64-specific tasks when an address space is removed from the processor.
     116 *
     117 * Demap TSBs.
     118 *
     119 * @param as Address space.
     120 */
     121void as_deinstall_arch(as_t *as)
     122{
     123
     124        /*
     125         * Note that we don't lock the address space.
     126         * That's correct - we can afford it here
     127         * because we only read members that are
     128         * currently read-only.
     129         */
     130
     131#ifdef CONFIG_TSB
     132        if (as != AS_KERNEL) {
     133                uintptr_t base = ALIGN_DOWN(config.base, 1 << KERNEL_PAGE_WIDTH);
     134
     135                ASSERT(as->arch.itsb && as->arch.dtsb);
     136
     137                uintptr_t tsb = as->arch.itsb;
     138               
     139                if (!overlaps(tsb, 8*PAGE_SIZE, base, 1 << KERNEL_PAGE_WIDTH)) {
     140                        /*
     141                         * TSBs were allocated from memory not covered
     142                         * by the locked 4M kernel DTLB entry. We need
     143                         * to demap the entry installed by as_install_arch().
     144                         */
     145                        dtlb_demap(TLB_DEMAP_PAGE, TLB_DEMAP_NUCLEUS, tsb);
     146                }
     147               
     148        }
     149#endif
    61150}
    62151
  • kernel/arch/sparc64/src/proc/scheduler.c

    rf1d1f5d3 r57da95c  
    121121        if ((THREAD->flags & THREAD_FLAG_USPACE)) {
    122122                /*
    123                  * If this thread executes also in userspace, we have to force all
    124                  * its still-active userspace windows into the userspace window buffer
    125                  * and demap the buffer from DTLB.
     123                 * If this thread executes also in userspace, we have to
     124                 * demap the userspace window buffer from DTLB.
    126125                 */
    127126                ASSERT(THREAD->arch.uspace_window_buffer);
Note: See TracChangeset for help on using the changeset viewer.