Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 4 → Rev 5

/SPARTAN/trunk/arch/ia32/include/interrupt.h
59,6 → 59,7
#define VECTOR_KBD (IVT_IRQBASE+IRQ_KBD)
 
#define VECTOR_SYSCALL (IVT_FREEBASE+0)
#define VECTOR_TLB_SHUTDOWN (IVT_FREEBASE+1)
 
typedef void (* iroutine)(__u8 n, __u32 stack[]);
 
76,6 → 77,7
extern void gp_fault(__u8 n, __u32 stack[]);
extern void page_fault(__u8 n, __u32 stack[]);
extern void syscall(__u8 n, __u32 stack[]);
extern void tlb_shutdown_ipi(__u8 n, __u32 stack[]);
 
extern void trap_virtual_enable_irqs(__u16 irqmask);
extern void trap_virtual_disable_irqs(__u16 irqmask);
/SPARTAN/trunk/arch/ia32/include/apic.h
39,6 → 39,7
#define IPI_INIT 0
#define IPI_STARTUP 0
 
#define DLVRMODE_FIXED (0<<8)
#define DLVRMODE_INIT (5<<8)
#define DLVRMODE_STUP (6<<8)
#define DESTMODE_PHYS (0<<11)
56,7 → 57,7
/* Interrupt Command Register */
#define ICRlo (0x300/sizeof(__u32))
#define ICRhi (0x310/sizeof(__u32))
#define ICRloClear ((0xff<<0)|(1<<13)|(3<<16)|(0xfff<<20))
#define ICRloClear ((1<<13)|(3<<16)|(0xfff<<20))
#define ICRhiClear (0xffffff<<0)
 
/* End Of Interrupt */
115,6 → 116,7
 
extern void l_apic_init(void);
extern void l_apic_eoi(void);
extern int l_apic_broadcast_custom_ipi(__u8 vector);
extern int l_apic_send_init_ipi(__u8 apicid);
extern void l_apic_debug(void);
extern void l_apic_timer_interrupt(__u8 n, __u32 stack[]);
/SPARTAN/trunk/arch/ia32/src/ia32.c
56,6 → 56,10
i8254_init(); /* hard clock */
trap_register(VECTOR_SYSCALL, syscall);
#ifdef __SMP__
trap_register(VECTOR_TLB_SHUTDOWN, tlb_shutdown_ipi);
#endif /* __SMP__ */
}
}
 
/SPARTAN/trunk/arch/ia32/src/smp/apic.c
142,6 → 142,29
}
 
/*
* Send all CPUs excluding the->cpu IPI vector.
*/
int l_apic_broadcast_custom_ipi(__u8 vector)
{
__u32 lo;
 
/*
* Read the ICR register in and zero all non-reserved fields.
*/
lo = l_apic[ICRlo] & ICRloClear;
 
lo |= DLVRMODE_FIXED | DESTMODE_LOGIC | LEVEL_ASSERT | SHORTHAND_EXCL | TRGRMODE_LEVEL | vector;
l_apic[ICRlo] = lo;
 
lo = l_apic[ICRlo] & ICRloClear;
if (lo & SEND_PENDING)
printf("IPI is pending.\n");
 
return apic_poll_errors();
}
 
/*
* Universal Start-up Algorithm for bringing up the AP processors.
*/
int l_apic_send_init_ipi(__u8 apicid)
/SPARTAN/trunk/arch/ia32/src/mm/tlb.c
29,7 → 29,19
#include <mm/tlb.h>
#include <arch/asm.h>
 
#ifdef __SMP__
#include <arch/apic.h>
#include <arch/interrupt.h>
#endif /* __SMP__ */
 
void tlb_invalidate(int asid)
{
cpu_write_dba(cpu_read_dba());
}
 
#ifdef __SMP__
void tlb_shutdown_ipi_send(void)
{
(void) l_apic_broadcast_custom_ipi(VECTOR_TLB_SHUTDOWN);
}
#endif /* __SMP__ */
/SPARTAN/trunk/arch/ia32/src/mm/page.c
134,6 → 134,4
pt[pte].page_cache_disable = !(flags & PAGE_CACHEABLE);
pt[pte].uaccessible = (flags & PAGE_USER) != 0;
pt[pte].writeable = (flags & PAGE_WRITE) != 0;
tlb_invalidate(0);
}
/SPARTAN/trunk/arch/ia32/src/interrupt.c
33,6 → 33,7
#include <func.h>
#include <cpu.h>
#include <arch/asm.h>
#include <mm/tlb.h>
 
/*
* Interrupt and exception dispatching.
93,6 → 94,12
thread_sleep(1);
}
 
void tlb_shutdown_ipi(__u8 n, __u32 stack[])
{
trap_virtual_eoi();
tlb_shutdown_ipi_recv();
}
 
void trap_virtual_enable_irqs(__u16 irqmask)
{
if (enable_irqs_function)