Changeset e3f41b6 in mainline
- Timestamp:
- 2005-06-06T20:01:57Z (20 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- b0bf501
- Parents:
- d47f0e1
- Files:
-
- 17 edited
- 3 moved
Legend:
- Unmodified
- Added
- Removed
-
arch/ia32/Makefile.inc
rd47f0e1 re3f41b6 31 31 arch/smp/mps.c \ 32 32 arch/smp/smp.c \ 33 arch/ smp/atomic.S \33 arch/atomic.S \ 34 34 arch/smp/ipi.c \ 35 35 arch/ia32.c \ -
arch/ia32/include/atomic.h
rd47f0e1 re3f41b6 32 32 #include <arch/types.h> 33 33 34 extern void atomic_inc( int *val);35 extern void atomic_dec( int *val);34 extern void atomic_inc(volatile int *val); 35 extern void atomic_dec(volatile int *val); 36 36 37 37 extern int test_and_set(int *val); -
arch/ia32/src/atomic.S
rd47f0e1 re3f41b6 33 33 pushl %ebx 34 34 movl 8(%esp),%ebx 35 #ifdef __SMP__ 35 36 lock incl (%ebx) 37 #else 38 incl (%ebx) 39 #endif 36 40 popl %ebx 37 41 ret … … 41 45 pushl %ebx 42 46 movl 8(%esp),%ebx 47 #ifdef __SMP__ 43 48 lock decl (%ebx) 49 #else 50 decl (%ebx) 51 #endif 44 52 popl %ebx 45 53 ret -
arch/mips/_link.ld
rd47f0e1 re3f41b6 8 8 9 9 OUTPUT_FORMAT(binary) 10 ENTRY(kernel_image_start) 10 ENTRY(kernel_image_start) 11 11 12 12 SECTIONS { -
arch/mips/include/atomic.h
rd47f0e1 re3f41b6 30 30 #define __MIPS_ATOMIC_H__ 31 31 32 #define atomic_inc(x) ((*x)++) 33 #define atomic_dec(x) ((*x)--) 32 #define atomic_inc(x) (a_add(x,1)) 33 #define atomic_dec(x) (a_sub(x,1)) 34 35 /* 36 * Atomic addition 37 * 38 * This case is harder, and we have to use the special LL and SC operations 39 * to achieve atomicity. The instructions are similar to LW (load) and SW 40 * (store), except that the LL (load-linked) instruction loads the address 41 * of the variable to a special register and if another process writes to 42 * the same location, the SC (store-conditional) instruction fails. 43 */ 44 static inline int a_add( volatile int *val, int i) 45 { 46 int tmp, tmp2; 47 48 asm volatile ( 49 " .set push\n" 50 " .set noreorder\n" 51 " nop\n" 52 "1:\n" 53 " ll %0, %1\n" 54 " addu %0, %0, %2\n" 55 " move %3, %0\n" 56 " sc %0, %1\n" 57 " beq %0, 0x0, 1b\n" 58 " move %0, %3\n" 59 " .set pop\n" 60 : "=&r" (tmp), "=o" (*val) 61 : "r" (i), "r" (tmp2) 62 ); 63 return tmp; 64 } 65 66 67 /* 68 * Atomic subtraction 69 * 70 * Implemented in the same manner as a_add, except we substract the value. 71 */ 72 static inline int a_sub( volatile int *val, int i) 73 74 { 75 int tmp, tmp2; 76 77 asm volatile ( 78 " .set push\n" 79 " .set noreorder\n" 80 " nop\n" 81 "1:\n" 82 " ll %0, %1\n" 83 " subu %0, %0, %2\n" 84 " move %3, %0\n" 85 " sc %0, %1\n" 86 " beq %0, 0x0, 1b\n" 87 " move %0, %3\n" 88 " .set pop\n" 89 : "=&r" (tmp), "=o" (*val) 90 : "r" (i), "r" (tmp2) 91 ); 92 return tmp; 93 } 94 34 95 35 96 #endif -
include/proc/scheduler.h
rd47f0e1 re3f41b6 44 44 }; 45 45 46 extern spinlock_t nrdylock;47 46 extern volatile int nrdy; 48 47 -
src/Makefile
rd47f0e1 re3f41b6 71 71 72 72 kernel.bin: $(arch_objects) $(objects) $(test_objects) 73 $(LD) $(LFLAGS) $(arch_objects) $(objects) $(test_objects) -o $@ >kernel.map73 $(LD) $(LFLAGS) $(arch_objects) $(objects) $(test_objects) -o $@ -Map kernel.map 74 74 75 75 %.s: %.S -
src/mm/tlb.c
rd47f0e1 re3f41b6 31 31 #include <synch/spinlock.h> 32 32 #include <typedefs.h> 33 #include <arch/ smp/atomic.h>33 #include <arch/atomic.h> 34 34 #include <arch/interrupt.h> 35 35 #include <config.h> -
src/proc/scheduler.c
rd47f0e1 re3f41b6 43 43 #include <synch/spinlock.h> 44 44 #include <arch/faddr.h> 45 46 #ifdef __SMP__ 47 #include <arch/smp/atomic.h> 48 #endif /* __SMP__ */ 45 #include <arch/atomic.h> 49 46 50 47 /* … … 54 51 */ 55 52 56 spinlock_t nrdylock;57 53 volatile int nrdy; 58 54 … … 78 74 void scheduler_init(void) 79 75 { 80 spinlock_initialize(&nrdylock);81 76 } 82 77 … … 141 136 } 142 137 143 spinlock_lock(&nrdylock); 144 nrdy--; 145 spinlock_unlock(&nrdylock); 138 atomic_dec(&nrdy); 146 139 147 140 spinlock_lock(&CPU->lock); … … 499 492 spinlock_unlock(&cpu->lock); 500 493 501 spinlock_lock(&nrdylock); 502 nrdy--; 503 spinlock_unlock(&nrdylock); 494 atomic_dec(&nrdy); 504 495 505 496 r->n--; -
src/proc/thread.c
rd47f0e1 re3f41b6 50 50 #include <smp/ipi.h> 51 51 #include <arch/faddr.h> 52 #include <arch/atomic.h> 52 53 53 54 char *thread_states[] = {"Invalid", "Running", "Sleeping", "Ready", "Entering", "Exiting"}; /**< Thread states */ … … 135 136 spinlock_unlock(&r->lock); 136 137 137 spinlock_lock(&nrdylock); 138 avg = ++nrdy / config.cpu_active; 139 spinlock_unlock(&nrdylock); 138 atomic_inc(&nrdy); 139 avg = nrdy / config.cpu_active; 140 140 141 141 spinlock_lock(&cpu->lock); -
src/synch/spinlock.c
rd47f0e1 re3f41b6 29 29 #include <arch.h> 30 30 31 #ifdef __SMP__ 32 #include <arch/smp/atomic.h> 33 #endif 34 31 #include <arch/atomic.h> 35 32 #include <synch/spinlock.h> 36 33 -
src/time/clock.c
rd47f0e1 re3f41b6 39 39 #include <arch.h> 40 40 #include <list.h> 41 42 #ifdef __SMP__ 43 #include <arch/smp/atomic.h> 44 #endif 41 #include <arch/atomic.h> 45 42 46 43 /** Clock routine -
test/fpu/fpu1/test.c
rd47f0e1 re3f41b6 33 33 34 34 #include <test.h> 35 #include <arch/ smp/atomic.h>35 #include <arch/atomic.h> 36 36 #include <proc/thread.h> 37 37 -
test/synch/rwlock1/test.c
rd47f0e1 re3f41b6 29 29 #include <test.h> 30 30 #include <arch.h> 31 #include <arch/ smp/atomic.h>31 #include <arch/atomic.h> 32 32 #include <print.h> 33 33 #include <proc/thread.h> -
test/synch/rwlock2/test.c
rd47f0e1 re3f41b6 29 29 #include <test.h> 30 30 #include <arch.h> 31 #include <arch/ smp/atomic.h>31 #include <arch/atomic.h> 32 32 #include <print.h> 33 33 #include <proc/thread.h> -
test/synch/rwlock3/test.c
rd47f0e1 re3f41b6 29 29 #include <test.h> 30 30 #include <arch.h> 31 #include <arch/ smp/atomic.h>31 #include <arch/atomic.h> 32 32 #include <print.h> 33 33 #include <proc/thread.h> -
test/synch/rwlock4/test.c
rd47f0e1 re3f41b6 29 29 #include <test.h> 30 30 #include <arch.h> 31 #include <arch/ smp/atomic.h>31 #include <arch/atomic.h> 32 32 #include <print.h> 33 33 #include <proc/thread.h> -
test/synch/rwlock5/test.c
rd47f0e1 re3f41b6 29 29 #include <test.h> 30 30 #include <arch.h> 31 #include <arch/ smp/atomic.h>31 #include <arch/atomic.h> 32 32 #include <print.h> 33 33 #include <proc/thread.h> -
test/synch/semaphore1/test.c
rd47f0e1 re3f41b6 29 29 #include <test.h> 30 30 #include <arch.h> 31 #include <arch/ smp/atomic.h>31 #include <arch/atomic.h> 32 32 #include <print.h> 33 33 #include <proc/thread.h> -
test/synch/semaphore2/test.c
rd47f0e1 re3f41b6 29 29 #include <test.h> 30 30 #include <arch.h> 31 #include <arch/ smp/atomic.h>31 #include <arch/atomic.h> 32 32 #include <print.h> 33 33 #include <proc/thread.h>
Note:
See TracChangeset
for help on using the changeset viewer.