Added args to lock() and unlock() to tell them apart, for use
when lock timing is enabled in minix/config.h. Added phys_zero() routine to klib386.s that zeroes a range of memory, and added corresponding system call.
This commit is contained in:
parent
b4335679cb
commit
c977bd8709
|
@ -33,6 +33,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "kernel.h"
|
#include "kernel.h"
|
||||||
|
#include "debug.h"
|
||||||
#include "proc.h"
|
#include "proc.h"
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <minix/com.h>
|
#include <minix/com.h>
|
||||||
|
@ -107,10 +108,10 @@ PUBLIC void clock_task()
|
||||||
receive(ANY, &m);
|
receive(ANY, &m);
|
||||||
|
|
||||||
/* Transfer ticks seen by the low level handler. */
|
/* Transfer ticks seen by the low level handler. */
|
||||||
lock();
|
lock(8, "realtime");
|
||||||
realtime += pending_ticks;
|
realtime += pending_ticks;
|
||||||
pending_ticks = 0;
|
pending_ticks = 0;
|
||||||
unlock();
|
unlock(8);
|
||||||
|
|
||||||
/* Handle the request. */
|
/* Handle the request. */
|
||||||
switch (m.m_type) {
|
switch (m.m_type) {
|
||||||
|
@ -267,9 +268,9 @@ PUBLIC clock_t get_uptime()
|
||||||
*/
|
*/
|
||||||
clock_t uptime;
|
clock_t uptime;
|
||||||
|
|
||||||
lock();
|
lock(9, "get_uptime");
|
||||||
uptime = realtime + pending_ticks;
|
uptime = realtime + pending_ticks;
|
||||||
unlock();
|
unlock(9);
|
||||||
return(uptime);
|
return(uptime);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -348,11 +349,11 @@ PUBLIC unsigned long read_clock()
|
||||||
*/
|
*/
|
||||||
unsigned count;
|
unsigned count;
|
||||||
|
|
||||||
lock();
|
lock(10, "read_clock");
|
||||||
outb(TIMER_MODE, LATCH_COUNT);
|
outb(TIMER_MODE, LATCH_COUNT);
|
||||||
count = inb(TIMER0);
|
count = inb(TIMER0);
|
||||||
count |= (inb(TIMER0) << 8);
|
count |= (inb(TIMER0) << 8);
|
||||||
unlock();
|
unlock(10);
|
||||||
|
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#include <ibm/interrupt.h> /* interrupt numbers and hardware vectors */
|
#include <ibm/interrupt.h> /* interrupt numbers and hardware vectors */
|
||||||
#include <ibm/ports.h> /* port addresses and magic numbers */
|
#include <ibm/ports.h> /* port addresses and magic numbers */
|
||||||
#include <ibm/bios.h> /* BIOS addresses, sizes and magic numbers */
|
#include <ibm/bios.h> /* BIOS addresses, sizes and magic numbers */
|
||||||
|
#include <minix/config.h>
|
||||||
|
|
||||||
/* To translate an address in kernel space to a physical address. This is
|
/* To translate an address in kernel space to a physical address. This is
|
||||||
* the same as umap_local(proc_ptr, D, vir, sizeof(*vir)), but less costly.
|
* the same as umap_local(proc_ptr, D, vir, sizeof(*vir)), but less costly.
|
||||||
|
@ -61,9 +62,17 @@
|
||||||
#define IF_MASK 0x00000200
|
#define IF_MASK 0x00000200
|
||||||
#define IOPL_MASK 0x003000
|
#define IOPL_MASK 0x003000
|
||||||
|
|
||||||
|
#if ENABLE_LOCK_TIMING
|
||||||
|
#define locktimestart(c, v) timer_start(c, v)
|
||||||
|
#define locktimeend(c) timer_end(c)
|
||||||
|
#else
|
||||||
|
#define locktimestart(c, v)
|
||||||
|
#define locktimeend(c)
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Disable/Enable hardware interrupts. */
|
/* Disable/Enable hardware interrupts. */
|
||||||
#define lock() intr_disable()
|
#define lock(c, v) do { intr_disable(); locktimestart(c, v); } while(0);
|
||||||
#define unlock() intr_enable()
|
#define unlock(c) do { locktimeend(c); intr_enable(); } while(0);
|
||||||
|
|
||||||
/* Sizes of memory tables. The boot monitor distinguishes three memory areas,
|
/* Sizes of memory tables. The boot monitor distinguishes three memory areas,
|
||||||
* namely low mem below 1M, 1M-16M, and mem after 16M. More chunks are needed
|
* namely low mem below 1M, 1M-16M, and mem after 16M. More chunks are needed
|
||||||
|
@ -77,3 +86,7 @@
|
||||||
/* M68000 specific constants go here. */
|
/* M68000 specific constants go here. */
|
||||||
#endif /* (CHIP == M68000) */
|
#endif /* (CHIP == M68000) */
|
||||||
|
|
||||||
|
#if ENABLE_INT_TIMING
|
||||||
|
#define INT_TIMING_BITS 12
|
||||||
|
#define INT_TIMING_ELEMENTS (1L << 12)
|
||||||
|
#endif
|
||||||
|
|
16
kernel/debug.h
Normal file
16
kernel/debug.h
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
|
||||||
|
#ifndef DEBUG_H
|
||||||
|
#define DEBUG_H
|
||||||
|
|
||||||
|
#include <minix/config.h>
|
||||||
|
|
||||||
|
#if ENABLE_LOCK_TIMING
|
||||||
|
_PROTOTYPE( void timer_start, (int cat, char *name) );
|
||||||
|
_PROTOTYPE( void timer_end, (int cat) );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if ENABLE_K_DEBUGGING /* debugging */
|
||||||
|
_PROTOTYPE( void check_runqueues, (char *when) );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* DEBUG_H */
|
|
@ -9,6 +9,7 @@
|
||||||
#include "kernel.h"
|
#include "kernel.h"
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include "proc.h"
|
#include "proc.h"
|
||||||
|
#include "debug.h"
|
||||||
|
|
||||||
/*==========================================================================*
|
/*==========================================================================*
|
||||||
* exception *
|
* exception *
|
||||||
|
@ -56,7 +57,7 @@ unsigned vec_nr;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (k_reenter == 0 && ! istaskp(saved_proc)) {
|
if (k_reenter == 0 && ! istaskp(saved_proc)) {
|
||||||
unlock(); /* this is protected like sys_call() */
|
unlock(7); /* this is protected like sys_call() */
|
||||||
cause_sig(proc_nr(saved_proc), ep->signum);
|
cause_sig(proc_nr(saved_proc), ep->signum);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,9 @@
|
||||||
#define EXTERN
|
#define EXTERN
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "const.h"
|
||||||
|
#include <minix/config.h>
|
||||||
|
|
||||||
/* MINIX' shutdown sequence uses watchdog timers to stop system services. The
|
/* MINIX' shutdown sequence uses watchdog timers to stop system services. The
|
||||||
* flag shutting_down must be initialized to FALSE. We rely on the compiler's
|
* flag shutting_down must be initialized to FALSE. We rely on the compiler's
|
||||||
* default initialization (0) of global variables here.
|
* default initialization (0) of global variables here.
|
||||||
|
@ -42,6 +45,11 @@ EXTERN irq_hook_t *irq_handlers[NR_IRQ_VECTORS];/* list of IRQ handlers */
|
||||||
EXTERN int irq_actids[NR_IRQ_VECTORS]; /* IRQ ID bits active */
|
EXTERN int irq_actids[NR_IRQ_VECTORS]; /* IRQ ID bits active */
|
||||||
EXTERN int irq_use; /* bit map of all in-use irq's */
|
EXTERN int irq_use; /* bit map of all in-use irq's */
|
||||||
|
|
||||||
|
/* lock() timing data. */
|
||||||
|
#if ENABLE_LOCK_TIMING
|
||||||
|
EXTERN struct lock_timedata timingdata[TIMING_CATEGORIES];
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Miscellaneous. */
|
/* Miscellaneous. */
|
||||||
EXTERN reg_t mon_ss, mon_sp; /* monitor stack */
|
EXTERN reg_t mon_ss, mon_sp; /* monitor stack */
|
||||||
EXTERN int mon_return; /* true if return to the monitor possible */
|
EXTERN int mon_return; /* true if return to the monitor possible */
|
||||||
|
@ -58,4 +66,3 @@ EXTERN _PROTOTYPE( void (*level0_func), (void) );
|
||||||
/* M68000 specific variables go here. */
|
/* M68000 specific variables go here. */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
|
|
||||||
#include "kernel.h"
|
#include "kernel.h"
|
||||||
#include "proc.h"
|
#include "proc.h"
|
||||||
|
#include "debug.h"
|
||||||
#include <minix/com.h>
|
#include <minix/com.h>
|
||||||
|
|
||||||
#define ICW1_AT 0x11 /* edge triggered, cascade, need ICW4 */
|
#define ICW1_AT 0x11 /* edge triggered, cascade, need ICW4 */
|
||||||
|
@ -48,7 +49,7 @@ int mine;
|
||||||
*/
|
*/
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
lock();
|
lock(6, "intr_init");
|
||||||
if (machine.protected) {
|
if (machine.protected) {
|
||||||
/* The AT and newer PS/2 have two interrupt controllers, one master,
|
/* The AT and newer PS/2 have two interrupt controllers, one master,
|
||||||
* one slaved at IRQ 2. (We don't have to deal with the PC that
|
* one slaved at IRQ 2. (We don't have to deal with the PC that
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
.define _enable_irq ! enable an irq at the 8259 controller
|
.define _enable_irq ! enable an irq at the 8259 controller
|
||||||
.define _disable_irq ! disable an irq
|
.define _disable_irq ! disable an irq
|
||||||
.define _phys_copy ! copy data from anywhere to anywhere in memory
|
.define _phys_copy ! copy data from anywhere to anywhere in memory
|
||||||
|
.define _phys_zero ! zero data anywhere in memory
|
||||||
.define _mem_rdw ! copy one word from [segment:offset]
|
.define _mem_rdw ! copy one word from [segment:offset]
|
||||||
.define _reset ! reset the system
|
.define _reset ! reset the system
|
||||||
.define _idle_task ! task executed when there is no work
|
.define _idle_task ! task executed when there is no work
|
||||||
|
@ -437,6 +438,36 @@ pc_small:
|
||||||
pop esi
|
pop esi
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
!*===========================================================================*
|
||||||
|
!* phys_zero *
|
||||||
|
!*===========================================================================*
|
||||||
|
! PUBLIC void phys_zero(phys_bytes source, phys_bytes bytecount);
|
||||||
|
! Zero a block of physical memory.
|
||||||
|
|
||||||
|
.align 16
|
||||||
|
|
||||||
|
_phys_zero:
|
||||||
|
push ebp
|
||||||
|
mov ebp, esp
|
||||||
|
push esi
|
||||||
|
push ebx
|
||||||
|
push ds
|
||||||
|
mov esi, 8(ebp)
|
||||||
|
mov eax, 12(ebp)
|
||||||
|
mov ebx, FLAT_DS_SELECTOR
|
||||||
|
mov ds, bx
|
||||||
|
shr eax, 2
|
||||||
|
zero_start:
|
||||||
|
mov (esi), 0
|
||||||
|
add esi, 4
|
||||||
|
dec eax
|
||||||
|
jnz zero_start
|
||||||
|
zero_done:
|
||||||
|
pop ds
|
||||||
|
pop ebx
|
||||||
|
pop esi
|
||||||
|
pop ebp
|
||||||
|
ret
|
||||||
|
|
||||||
!*===========================================================================*
|
!*===========================================================================*
|
||||||
!* mem_rdw *
|
!* mem_rdw *
|
||||||
|
@ -501,7 +532,7 @@ _level0:
|
||||||
!*===========================================================================*
|
!*===========================================================================*
|
||||||
!* read_tsc *
|
!* read_tsc *
|
||||||
!*===========================================================================*
|
!*===========================================================================*
|
||||||
! PUBLIC void read_tsc(unsigned long *low, unsigned long *high);
|
! PUBLIC void read_tsc(unsigned long *high, unsigned long *low);
|
||||||
! Read the cycle counter of the CPU. Pentium and up.
|
! Read the cycle counter of the CPU. Pentium and up.
|
||||||
.align 16
|
.align 16
|
||||||
_read_tsc:
|
_read_tsc:
|
||||||
|
|
|
@ -46,6 +46,7 @@
|
||||||
#include <minix/callnr.h>
|
#include <minix/callnr.h>
|
||||||
#include <minix/com.h>
|
#include <minix/com.h>
|
||||||
#include "proc.h"
|
#include "proc.h"
|
||||||
|
#include "debug.h"
|
||||||
#include "ipc.h"
|
#include "ipc.h"
|
||||||
#include "sendmask.h"
|
#include "sendmask.h"
|
||||||
|
|
||||||
|
@ -440,11 +441,11 @@ message *m_ptr; /* pointer to message buffer */
|
||||||
int result;
|
int result;
|
||||||
struct proc *caller_ptr;
|
struct proc *caller_ptr;
|
||||||
|
|
||||||
lock();
|
lock(0, "notify");
|
||||||
kinfo.lock_notify ++;
|
kinfo.lock_notify ++;
|
||||||
caller_ptr = (k_reenter >= 0) ? proc_addr(HARDWARE) : proc_ptr;
|
caller_ptr = (k_reenter >= 0) ? proc_addr(HARDWARE) : proc_ptr;
|
||||||
result = mini_notify(caller_ptr, dst, m_ptr);
|
result = mini_notify(caller_ptr, dst, m_ptr);
|
||||||
unlock();
|
unlock(0);
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -637,9 +638,9 @@ int queue;
|
||||||
PUBLIC void lock_pick_proc()
|
PUBLIC void lock_pick_proc()
|
||||||
{
|
{
|
||||||
/* Safe gateway to pick_proc() for tasks. */
|
/* Safe gateway to pick_proc() for tasks. */
|
||||||
lock();
|
lock(1, "pick_proc");
|
||||||
pick_proc();
|
pick_proc();
|
||||||
unlock();
|
unlock(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -652,10 +653,10 @@ message *m_ptr; /* pointer to message buffer */
|
||||||
{
|
{
|
||||||
/* Safe gateway to mini_send() for tasks. */
|
/* Safe gateway to mini_send() for tasks. */
|
||||||
int result;
|
int result;
|
||||||
lock();
|
lock(2, "send");
|
||||||
kinfo.lock_send ++;
|
kinfo.lock_send ++;
|
||||||
result = mini_send(proc_ptr, dst, m_ptr, NON_BLOCKING);
|
result = mini_send(proc_ptr, dst, m_ptr, NON_BLOCKING);
|
||||||
unlock();
|
unlock(2);
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -667,9 +668,9 @@ PUBLIC void lock_ready(rp)
|
||||||
struct proc *rp; /* this process is now runnable */
|
struct proc *rp; /* this process is now runnable */
|
||||||
{
|
{
|
||||||
/* Safe gateway to ready() for tasks. */
|
/* Safe gateway to ready() for tasks. */
|
||||||
lock();
|
lock(3, "ready");
|
||||||
ready(rp);
|
ready(rp);
|
||||||
unlock();
|
unlock(3);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*==========================================================================*
|
/*==========================================================================*
|
||||||
|
@ -679,9 +680,9 @@ PUBLIC void lock_unready(rp)
|
||||||
struct proc *rp; /* this process is no longer runnable */
|
struct proc *rp; /* this process is no longer runnable */
|
||||||
{
|
{
|
||||||
/* Safe gateway to unready() for tasks. */
|
/* Safe gateway to unready() for tasks. */
|
||||||
lock();
|
lock(4, "unready");
|
||||||
unready(rp);
|
unready(rp);
|
||||||
unlock();
|
unlock(4);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*==========================================================================*
|
/*==========================================================================*
|
||||||
|
@ -691,8 +692,8 @@ PUBLIC void lock_sched(queue)
|
||||||
int queue;
|
int queue;
|
||||||
{
|
{
|
||||||
/* Safe gateway to sched() for tasks. */
|
/* Safe gateway to sched() for tasks. */
|
||||||
lock();
|
lock(5, "sched");
|
||||||
sched(queue);
|
sched(queue);
|
||||||
unlock();
|
unlock(5);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -93,6 +93,7 @@ _PROTOTYPE( int disable_irq, (irq_hook_t *hook) );
|
||||||
_PROTOTYPE( u16_t mem_rdw, (U16_t segm, vir_bytes offset) );
|
_PROTOTYPE( u16_t mem_rdw, (U16_t segm, vir_bytes offset) );
|
||||||
_PROTOTYPE( void phys_copy, (phys_bytes source, phys_bytes dest,
|
_PROTOTYPE( void phys_copy, (phys_bytes source, phys_bytes dest,
|
||||||
phys_bytes count) );
|
phys_bytes count) );
|
||||||
|
_PROTOTYPE( void phys_zero, (phys_bytes source, phys_bytes count) );
|
||||||
_PROTOTYPE( void phys_insb, (U16_t port, phys_bytes buf, size_t count) );
|
_PROTOTYPE( void phys_insb, (U16_t port, phys_bytes buf, size_t count) );
|
||||||
_PROTOTYPE( void phys_insw, (U16_t port, phys_bytes buf, size_t count) );
|
_PROTOTYPE( void phys_insw, (U16_t port, phys_bytes buf, size_t count) );
|
||||||
_PROTOTYPE( void phys_outsb, (U16_t port, phys_bytes buf, size_t count));
|
_PROTOTYPE( void phys_outsb, (U16_t port, phys_bytes buf, size_t count));
|
||||||
|
@ -100,7 +101,7 @@ _PROTOTYPE( void phys_outsw, (U16_t port, phys_bytes buf, size_t count));
|
||||||
_PROTOTYPE( void reset, (void) );
|
_PROTOTYPE( void reset, (void) );
|
||||||
_PROTOTYPE( void level0, (void (*func)(void)) );
|
_PROTOTYPE( void level0, (void (*func)(void)) );
|
||||||
_PROTOTYPE( void monitor, (void) );
|
_PROTOTYPE( void monitor, (void) );
|
||||||
_PROTOTYPE( void read_tsc, (unsigned long *low, unsigned long *high) );
|
_PROTOTYPE( void read_tsc, (unsigned long *high, unsigned long *low) );
|
||||||
|
|
||||||
/* mpx*.s */
|
/* mpx*.s */
|
||||||
_PROTOTYPE( void idle_task, (void) );
|
_PROTOTYPE( void idle_task, (void) );
|
||||||
|
|
|
@ -162,6 +162,7 @@ PRIVATE void initialize(void)
|
||||||
map(SYS_UMAP, do_umap); /* map virtual to physical address */
|
map(SYS_UMAP, do_umap); /* map virtual to physical address */
|
||||||
map(SYS_VIRCOPY, do_vircopy); /* use pure virtual addressing */
|
map(SYS_VIRCOPY, do_vircopy); /* use pure virtual addressing */
|
||||||
map(SYS_PHYSCOPY, do_physcopy); /* use physical addressing */
|
map(SYS_PHYSCOPY, do_physcopy); /* use physical addressing */
|
||||||
|
map(SYS_PHYSZERO, do_physzero); /* zero physical memory region */
|
||||||
map(SYS_VIRVCOPY, do_virvcopy); /* vector with copy requests */
|
map(SYS_VIRVCOPY, do_virvcopy); /* vector with copy requests */
|
||||||
map(SYS_PHYSVCOPY, do_physvcopy); /* vector with copy requests */
|
map(SYS_PHYSVCOPY, do_physvcopy); /* vector with copy requests */
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
|
|
||||||
/* Common includes for the system library. */
|
/* Common includes for the system library. */
|
||||||
#include <minix/com.h>
|
#include <minix/com.h>
|
||||||
|
#include <minix/config.h>
|
||||||
#include "proc.h"
|
#include "proc.h"
|
||||||
#include "assert.h"
|
#include "assert.h"
|
||||||
|
|
||||||
|
@ -61,12 +62,9 @@ _PROTOTYPE( int do_trace, (message *m_ptr) ); /* process tracing */
|
||||||
#define do_trace do_unused
|
#define do_trace do_unused
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ENABLE_K_DEBUGGING /* debugging */
|
|
||||||
_PROTOTYPE( void check_runqueues, (char *when) );
|
|
||||||
#endif
|
|
||||||
|
|
||||||
_PROTOTYPE( int do_vircopy, (message *m_ptr) );
|
_PROTOTYPE( int do_vircopy, (message *m_ptr) );
|
||||||
_PROTOTYPE( int do_physcopy, (message *m_ptr) );
|
_PROTOTYPE( int do_physcopy, (message *m_ptr) );
|
||||||
|
_PROTOTYPE( int do_physzero, (message *m_ptr) );
|
||||||
_PROTOTYPE( int do_biosio, (message *m_ptr) );
|
_PROTOTYPE( int do_biosio, (message *m_ptr) );
|
||||||
|
|
||||||
#endif /* SYSTEM_H */
|
#endif /* SYSTEM_H */
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
|
|
||||||
#include "../kernel.h"
|
#include "../kernel.h"
|
||||||
#include "../system.h"
|
#include "../system.h"
|
||||||
|
#include "../debug.h"
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
|
||||||
/*===========================================================================*
|
/*===========================================================================*
|
||||||
|
@ -27,11 +28,10 @@ register message *m_ptr; /* pointer to request message */
|
||||||
proc_nr = (m_ptr->T_PROC_NR == SELF) ? m_ptr->m_source : m_ptr->T_PROC_NR;
|
proc_nr = (m_ptr->T_PROC_NR == SELF) ? m_ptr->m_source : m_ptr->T_PROC_NR;
|
||||||
if (isokprocn(proc_nr)) {
|
if (isokprocn(proc_nr)) {
|
||||||
rp = proc_addr(m_ptr->T_PROC_NR);
|
rp = proc_addr(m_ptr->T_PROC_NR);
|
||||||
|
lock(11, "do_times"); /* halt the volatile time counters in rp */
|
||||||
lock(); /* halt the volatile time counters in rp */
|
|
||||||
m_ptr->T_USER_TIME = rp->p_user_time;
|
m_ptr->T_USER_TIME = rp->p_user_time;
|
||||||
m_ptr->T_SYSTEM_TIME = rp->p_sys_time;
|
m_ptr->T_SYSTEM_TIME = rp->p_sys_time;
|
||||||
unlock();
|
unlock(11);
|
||||||
}
|
}
|
||||||
m_ptr->T_BOOT_TICKS = get_uptime();
|
m_ptr->T_BOOT_TICKS = get_uptime();
|
||||||
return(OK);
|
return(OK);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* The system call implemented in this file:
|
/* The system call implemented in this file:
|
||||||
* m_type: SYS_VIRCOPY, SYS_PHYSCOPY
|
* m_type: SYS_VIRCOPY, SYS_PHYSCOPY, SYS_PHYSZERO
|
||||||
*
|
*
|
||||||
* The parameters for this system call are:
|
* The parameters for this system call are:
|
||||||
* m5_c1: CP_SRC_SPACE
|
* m5_c1: CP_SRC_SPACE
|
||||||
|
@ -114,6 +114,17 @@ register message *m_ptr; /* pointer to request message */
|
||||||
return(OK);
|
return(OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*===========================================================================*
|
||||||
|
* do_physzero *
|
||||||
|
*===========================================================================*/
|
||||||
|
PUBLIC int do_physzero(m_ptr)
|
||||||
|
register message *m_ptr;
|
||||||
|
{
|
||||||
|
/* Handle sys_physzero(). */
|
||||||
|
phys_zero((phys_bytes) m_ptr->PZ_MEM_PTR, (phys_bytes) m_ptr->PZ_COUNT);
|
||||||
|
return(OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* The system call implemented in this file:
|
/* The system call implemented in this file:
|
||||||
* m_type: SYS_UMAP
|
* m_type: SYS_UMAP
|
||||||
|
|
|
@ -7,6 +7,102 @@
|
||||||
#include "../kernel.h"
|
#include "../kernel.h"
|
||||||
#include "../system.h"
|
#include "../system.h"
|
||||||
#include "../proc.h"
|
#include "../proc.h"
|
||||||
|
#include "../glo.h"
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
#if ENABLE_LOCK_TIMING
|
||||||
|
|
||||||
|
static unsigned long starttimes[TIMING_CATEGORIES][2];
|
||||||
|
|
||||||
|
#define HIGHCOUNT 0
|
||||||
|
#define LOWCOUNT 1
|
||||||
|
|
||||||
|
void timer_start(int cat, char *name)
|
||||||
|
{
|
||||||
|
static int init = 0;
|
||||||
|
unsigned long h, l;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if(cat < 0 || cat >= TIMING_CATEGORIES) return;
|
||||||
|
|
||||||
|
for(i = 0; i < sizeof(timingdata[0].names) && *name; i++)
|
||||||
|
timingdata[cat].names[i] = *name++;
|
||||||
|
timingdata[0].names[sizeof(timingdata[0].names)-1] = '\0';
|
||||||
|
|
||||||
|
if(starttimes[cat][HIGHCOUNT]) { return; }
|
||||||
|
|
||||||
|
if(!init) {
|
||||||
|
int t, f;
|
||||||
|
init = 1;
|
||||||
|
for(t = 0; t < TIMING_CATEGORIES; t++) {
|
||||||
|
timingdata[t].lock_timings_range[0] = 0;
|
||||||
|
timingdata[t].resets = timingdata[t].misses =
|
||||||
|
timingdata[t].measurements = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
read_tsc(&starttimes[cat][HIGHCOUNT], &starttimes[cat][LOWCOUNT]);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void timer_end(int cat)
|
||||||
|
{
|
||||||
|
unsigned long h, l, d = 0, binsize;
|
||||||
|
int bin;
|
||||||
|
|
||||||
|
read_tsc(&h, &l);
|
||||||
|
if(cat < 0 || cat >= TIMING_CATEGORIES) return;
|
||||||
|
if(!starttimes[cat][HIGHCOUNT]) {
|
||||||
|
timingdata[cat].misses++;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(starttimes[cat][HIGHCOUNT] == h) {
|
||||||
|
d = (l - starttimes[cat][1]);
|
||||||
|
} else if(starttimes[cat][HIGHCOUNT] == h-1 &&
|
||||||
|
starttimes[cat][LOWCOUNT] > l) {
|
||||||
|
d = ((ULONG_MAX - starttimes[cat][LOWCOUNT]) + l);
|
||||||
|
} else {
|
||||||
|
timingdata[cat].misses++;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
starttimes[cat][HIGHCOUNT] = 0;
|
||||||
|
if(!timingdata[cat].lock_timings_range[0] ||
|
||||||
|
d < timingdata[cat].lock_timings_range[0] ||
|
||||||
|
d > timingdata[cat].lock_timings_range[1]) {
|
||||||
|
int t;
|
||||||
|
if(!timingdata[cat].lock_timings_range[0] ||
|
||||||
|
d < timingdata[cat].lock_timings_range[0])
|
||||||
|
timingdata[cat].lock_timings_range[0] = d;
|
||||||
|
if(!timingdata[cat].lock_timings_range[1] ||
|
||||||
|
d > timingdata[cat].lock_timings_range[1])
|
||||||
|
timingdata[cat].lock_timings_range[1] = d;
|
||||||
|
for(t = 0; t < TIMING_POINTS; t++)
|
||||||
|
timingdata[cat].lock_timings[t] = 0;
|
||||||
|
timingdata[cat].binsize =
|
||||||
|
(timingdata[cat].lock_timings_range[1] -
|
||||||
|
timingdata[cat].lock_timings_range[0])/(TIMING_POINTS+1);
|
||||||
|
if(timingdata[cat].binsize < 1)
|
||||||
|
timingdata[cat].binsize = 1;
|
||||||
|
timingdata[cat].resets++;
|
||||||
|
}
|
||||||
|
bin = (d-timingdata[cat].lock_timings_range[0]) /
|
||||||
|
timingdata[cat].binsize;
|
||||||
|
if(bin < 0 || bin >= TIMING_POINTS) {
|
||||||
|
int t;
|
||||||
|
/* this indicates a bug, but isn't really serious */
|
||||||
|
for(t = 0; t < TIMING_POINTS; t++)
|
||||||
|
timingdata[cat].lock_timings[t] = 0;
|
||||||
|
timingdata[cat].misses++;
|
||||||
|
} else {
|
||||||
|
timingdata[cat].lock_timings[bin]++;
|
||||||
|
timingdata[cat].measurements++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#if ENABLE_K_DEBUGGING /* only include code if enabled */
|
#if ENABLE_K_DEBUGGING /* only include code if enabled */
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
|
|
||||||
#include "../kernel.h"
|
#include "../kernel.h"
|
||||||
#include "../system.h"
|
#include "../system.h"
|
||||||
|
#include "../debug.h"
|
||||||
#include <minix/devio.h>
|
#include <minix/devio.h>
|
||||||
|
|
||||||
/*===========================================================================*
|
/*===========================================================================*
|
||||||
|
@ -171,7 +172,7 @@ register message *m_ptr; /* pointer to request message */
|
||||||
* batch from being interrupted. It may be cleaner to do this just around
|
* batch from being interrupted. It may be cleaner to do this just around
|
||||||
* the for loops, but this results in rather lenghty code.
|
* the for loops, but this results in rather lenghty code.
|
||||||
*/
|
*/
|
||||||
lock();
|
lock(13, "do_vdevio");
|
||||||
switch (m_ptr->DIO_TYPE) {
|
switch (m_ptr->DIO_TYPE) {
|
||||||
case DIO_BYTE: /* byte values */
|
case DIO_BYTE: /* byte values */
|
||||||
pvb_pairs = (pvb_pair_t *) vdevio_pv_buf;
|
pvb_pairs = (pvb_pair_t *) vdevio_pv_buf;
|
||||||
|
@ -204,7 +205,7 @@ register message *m_ptr; /* pointer to request message */
|
||||||
outl(pvb_pairs[i].port, pvl_pairs[i].value);
|
outl(pvb_pairs[i].port, pvl_pairs[i].value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
unlock();
|
unlock(13);
|
||||||
|
|
||||||
/* Almost done, copy back results for input requests. */
|
/* Almost done, copy back results for input requests. */
|
||||||
if (DIO_INPUT == m_ptr->REQUEST)
|
if (DIO_INPUT == m_ptr->REQUEST)
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#include "../kernel.h"
|
#include "../kernel.h"
|
||||||
#include "../system.h"
|
#include "../system.h"
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <minix/config.h>
|
||||||
INIT_ASSERT
|
INIT_ASSERT
|
||||||
|
|
||||||
|
|
||||||
|
@ -187,6 +188,13 @@ register message *m_ptr; /* pointer to request message */
|
||||||
src_phys = vir2phys(&kmess);
|
src_phys = vir2phys(&kmess);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
#if ENABLE_LOCK_TIMING
|
||||||
|
case GET_LOCKTIMING: {
|
||||||
|
length = sizeof(timingdata);
|
||||||
|
src_phys = vir2phys(timingdata);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
default:
|
default:
|
||||||
return(EINVAL);
|
return(EINVAL);
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
#if (CHIP == INTEL)
|
#if (CHIP == INTEL)
|
||||||
#include "../protect.h"
|
#include "../protect.h"
|
||||||
#endif
|
#endif
|
||||||
|
#include "../debug.h"
|
||||||
|
|
||||||
INIT_ASSERT
|
INIT_ASSERT
|
||||||
|
|
||||||
|
@ -200,6 +201,19 @@ message *m_ptr; /* pointer to request message */
|
||||||
if (! isokprocn(exit_proc_nr)) return(EINVAL);
|
if (! isokprocn(exit_proc_nr)) return(EINVAL);
|
||||||
rc = proc_addr(exit_proc_nr);
|
rc = proc_addr(exit_proc_nr);
|
||||||
|
|
||||||
|
#if DEAD_CODE
|
||||||
|
/* If this is a user process and the PM passed in a valid parent process,
|
||||||
|
* accumulate the child times at the parent.
|
||||||
|
*/
|
||||||
|
if (isuserp(rc) && isokprocn(m_ptr->PR_PPROC_NR)) {
|
||||||
|
rp = proc_addr(m_ptr->PR_PPROC_NR);
|
||||||
|
lock(15, "do_xit");
|
||||||
|
rp->child_utime += rc->user_time + rc->child_utime;
|
||||||
|
rp->child_stime += rc->sys_time + rc->child_stime;
|
||||||
|
unlock(15);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Now call the routine to clean up of the process table slot. This cancels
|
/* Now call the routine to clean up of the process table slot. This cancels
|
||||||
* outstanding timers, possibly removes the process from the message queues,
|
* outstanding timers, possibly removes the process from the message queues,
|
||||||
* and resets important process table fields.
|
* and resets important process table fields.
|
||||||
|
|
Loading…
Reference in a new issue