Changeset 169587a in mainline


Ignore:
Timestamp:
2005-02-21T21:47:22Z (20 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
b109ebb
Parents:
0ded477
Message:

TLB shootdown.

Files:
11 edited

Legend:

Unmodified
Added
Removed
  • arch/ia32/include/apic.h

    r0ded477 r169587a  
    4040#define IPI_STARTUP     0
    4141
     42#define DLVRMODE_FIXED  (0<<8)
    4243#define DLVRMODE_INIT   (5<<8)
    4344#define DLVRMODE_STUP   (6<<8)
     
    5758#define ICRlo           (0x300/sizeof(__u32))
    5859#define ICRhi           (0x310/sizeof(__u32))
    59 #define ICRloClear      ((0xff<<0)|(1<<13)|(3<<16)|(0xfff<<20))
     60#define ICRloClear      ((1<<13)|(3<<16)|(0xfff<<20))
    6061#define ICRhiClear      (0xffffff<<0)
    6162
     
    116117extern void l_apic_init(void);
    117118extern void l_apic_eoi(void);
     119extern int l_apic_broadcast_custom_ipi(__u8 vector);
    118120extern int l_apic_send_init_ipi(__u8 apicid);
    119121extern void l_apic_debug(void);
  • arch/ia32/include/interrupt.h

    r0ded477 r169587a  
    6060
    6161#define VECTOR_SYSCALL          (IVT_FREEBASE+0)
     62#define VECTOR_TLB_SHUTDOWN     (IVT_FREEBASE+1)
    6263
    6364typedef void (* iroutine)(__u8 n, __u32 stack[]);
     
    7778extern void page_fault(__u8 n, __u32 stack[]);
    7879extern void syscall(__u8 n, __u32 stack[]);
     80extern void tlb_shutdown_ipi(__u8 n, __u32 stack[]);
    7981
    8082extern void trap_virtual_enable_irqs(__u16 irqmask);
  • arch/ia32/src/ia32.c

    r0ded477 r169587a  
    5757               
    5858                trap_register(VECTOR_SYSCALL, syscall);
     59               
     60                #ifdef __SMP__
     61                trap_register(VECTOR_TLB_SHUTDOWN, tlb_shutdown_ipi);
     62                #endif /* __SMP__ */
    5963        }
    6064}
  • arch/ia32/src/interrupt.c

    r0ded477 r169587a  
    3434#include <cpu.h>
    3535#include <arch/asm.h>
     36#include <mm/tlb.h>
    3637
    3738/*
     
    9495}
    9596
     97void tlb_shutdown_ipi(__u8 n, __u32 stack[])
     98{
     99        trap_virtual_eoi();
     100        tlb_shutdown_ipi_recv();
     101}
     102
    96103void trap_virtual_enable_irqs(__u16 irqmask)
    97104{
  • arch/ia32/src/mm/page.c

    r0ded477 r169587a  
    135135        pt[pte].uaccessible = (flags & PAGE_USER) != 0;
    136136        pt[pte].writeable = (flags & PAGE_WRITE) != 0; 
    137        
    138         tlb_invalidate(0);
    139137}
  • arch/ia32/src/mm/tlb.c

    r0ded477 r169587a  
    3030#include <arch/asm.h>
    3131
     32#ifdef __SMP__
     33#include <arch/apic.h>
     34#include <arch/interrupt.h>
     35#endif /* __SMP__ */
     36
    3237void tlb_invalidate(int asid)
    3338{
    3439        cpu_write_dba(cpu_read_dba());
    3540}
     41
     42#ifdef __SMP__
     43void tlb_shutdown_ipi_send(void)
     44{
     45        (void) l_apic_broadcast_custom_ipi(VECTOR_TLB_SHUTDOWN);
     46}
     47#endif /* __SMP__ */
  • arch/ia32/src/smp/apic.c

    r0ded477 r169587a  
    143143
    144144/*
     145 * Send all CPUs excluding the->cpu IPI vector.
     146 */
     147int l_apic_broadcast_custom_ipi(__u8 vector)
     148{
     149        __u32 lo;
     150
     151        /*
     152         * Read the ICR register in and zero all non-reserved fields.
     153         */
     154        lo = l_apic[ICRlo] & ICRloClear;
     155
     156        lo |= DLVRMODE_FIXED | DESTMODE_LOGIC | LEVEL_ASSERT | SHORTHAND_EXCL | TRGRMODE_LEVEL | vector;
     157       
     158        l_apic[ICRlo] = lo;
     159
     160        lo = l_apic[ICRlo] & ICRloClear;
     161        if (lo & SEND_PENDING)
     162                printf("IPI is pending.\n");
     163
     164        return apic_poll_errors();
     165}
     166
     167/*
    145168 * Universal Start-up Algorithm for bringing up the AP processors.
    146169 */
  • include/mm/tlb.h

    r0ded477 r169587a  
    3030#define __TLB_H__
    3131
    32 extern void tlb_shutdown(void);
     32#ifdef __SMP__
     33extern void tlb_init(void);
     34extern void tlb_shutdown_start(void);
     35extern void tlb_shutdown_finalize(void);
     36extern void tlb_shutdown_ipi_recv(void);
     37#else
     38
     39#define tlb_init()              ;
     40#define tlb_shutdown_start()    ;
     41#define tlb_shutdown_finalize() ;
     42#define tlb_shutdown_ipi_recv() ;
     43
     44#endif /* __SMP__ */
     45
     46/* Export TLB interface that each architecture must implement. */
    3347extern void tlb_invalidate(int asid);
     48extern void tlb_shutdown_ipi_send(void);
    3449
    3550#endif
  • src/main/main.c

    r0ded477 r169587a  
    4747#include <mm/frame.h>
    4848#include <mm/page.h>
     49#include <mm/tlb.h>
    4950#include <synch/waitq.h>
    5051
     
    111112        frame_init();
    112113        page_init();
     114        tlb_init();
    113115
    114116        #ifdef __SMP__
  • src/mm/tlb.c

    r0ded477 r169587a  
    2828
    2929#include <mm/tlb.h>
     30#include <synch/spinlock.h>
     31#include <typedefs.h>
     32#include <arch/atomic.h>
     33#include <config.h>
    3034
    31 void tlb_shutdown(void)
     35#ifdef __SMP__
     36static spinlock_t tlblock;
     37static volatile int tlb_shutdown_cnt;
     38
     39void tlb_init(void)
    3240{
    33         /* TODO: implement tlb_shutdown */
     41        spinlock_initialize(&tlblock);
     42        tlb_shutdown_cnt = 0;
    3443}
     44
     45/* must be called with interrupts disabled */
     46void tlb_shutdown_start(void)
     47{
     48        spinlock_lock(&tlblock);
     49        tlb_shutdown_ipi_send();
     50       
     51        while (tlb_shutdown_cnt < config.cpu_active - 1)
     52                ;
     53               
     54        tlb_shutdown_cnt = 0;
     55}
     56
     57void tlb_shutdown_finalize(void)
     58{
     59        spinlock_unlock(&tlblock);
     60}
     61
     62void tlb_shutdown_ipi_recv(void)
     63{
     64        atomic_inc((int *) &tlb_shutdown_cnt);
     65        spinlock_lock(&tlblock);
     66        spinlock_unlock(&tlblock);
     67        tlb_invalidate(0);      /* TODO: use valid ASID */
     68}
     69#endif /* __SMP__ */
  • src/mm/vm.c

    r0ded477 r169587a  
    3030#include <mm/page.h>
    3131#include <mm/frame.h>
     32#include <mm/tlb.h>
    3233#include <arch/mm/page.h>
    3334#include <arch/types.h>
     
    143144        for (i=0; i<a->size; i++)               
    144145                map_page_to_frame(a->address + i*PAGE_SIZE, 0, PAGE_NOT_PRESENT, 0);
    145                
     146       
    146147        spinlock_unlock(&a->lock);
    147148        cpu_priority_restore(pri);
     
    169170       
    170171        pri = cpu_priority_high();
     172
     173        tlb_shutdown_start();
     174
    171175        spinlock_lock(&m->lock);
    172176
     
    175179
    176180        spinlock_unlock(&m->lock);
     181
     182        tlb_invalidate(0);
     183        tlb_shutdown_finalize();
     184
    177185        cpu_priority_restore(pri);
    178186}
Note: See TracChangeset for help on using the changeset viewer.