diff options
| author | Jeff Garzik <jgarzik@pobox.com> | 2005-10-29 17:49:12 -0400 | 
|---|---|---|
| committer | Jeff Garzik <jgarzik@pobox.com> | 2005-10-29 17:49:12 -0400 | 
| commit | b0c4e148bd591629749d02a8fbc8d81c26d548cf (patch) | |
| tree | 3e2142635f3dc2ceeae870ead2dceab7b9c6def1 /arch/mips/kernel/gdb-stub.c | |
| parent | 5615ca7906aefbdc3318604c89db5931d0a25910 (diff) | |
| parent | be15cd72d256e5eb3261a781b8507fac83ab33f6 (diff) | |
Merge branch 'master'
Diffstat (limited to 'arch/mips/kernel/gdb-stub.c')
| -rw-r--r-- | arch/mips/kernel/gdb-stub.c | 23 | 
1 files changed, 14 insertions, 9 deletions
diff --git a/arch/mips/kernel/gdb-stub.c b/arch/mips/kernel/gdb-stub.c index d3fd1ab14274..96d18c43dca0 100644 --- a/arch/mips/kernel/gdb-stub.c +++ b/arch/mips/kernel/gdb-stub.c  | |||
| @@ -176,8 +176,10 @@ int kgdb_enabled; | |||
| 176 | /* | 176 | /* | 
| 177 | * spin locks for smp case | 177 | * spin locks for smp case | 
| 178 | */ | 178 | */ | 
| 179 | static spinlock_t kgdb_lock = SPIN_LOCK_UNLOCKED; | 179 | static DEFINE_SPINLOCK(kgdb_lock); | 
| 180 | static spinlock_t kgdb_cpulock[NR_CPUS] = { [0 ... NR_CPUS-1] = SPIN_LOCK_UNLOCKED}; | 180 | static raw_spinlock_t kgdb_cpulock[NR_CPUS] = { | 
| 181 | [0 ... NR_CPUS-1] = __RAW_SPIN_LOCK_UNLOCKED; | ||
| 182 | }; | ||
| 181 | 183 | ||
| 182 | /* | 184 | /* | 
| 183 | * BUFMAX defines the maximum number of characters in inbound/outbound buffers | 185 | * BUFMAX defines the maximum number of characters in inbound/outbound buffers | 
| @@ -637,29 +639,32 @@ static struct gdb_bp_save async_bp; | |||
| 637 | * and only one can be active at a time. | 639 | * and only one can be active at a time. | 
| 638 | */ | 640 | */ | 
| 639 | extern spinlock_t smp_call_lock; | 641 | extern spinlock_t smp_call_lock; | 
| 642 | |||
| 640 | void set_async_breakpoint(unsigned long *epc) | 643 | void set_async_breakpoint(unsigned long *epc) | 
| 641 | { | 644 | { | 
| 642 | /* skip breaking into userland */ | 645 | /* skip breaking into userland */ | 
| 643 | if ((*epc & 0x80000000) == 0) | 646 | if ((*epc & 0x80000000) == 0) | 
| 644 | return; | 647 | return; | 
| 645 | 648 | ||
| 649 | #ifdef CONFIG_SMP | ||
| 646 | /* avoid deadlock if someone is make IPC */ | 650 | /* avoid deadlock if someone is make IPC */ | 
| 647 | if (spin_is_locked(&smp_call_lock)) | 651 | if (spin_is_locked(&smp_call_lock)) | 
| 648 | return; | 652 | return; | 
| 653 | #endif | ||
| 649 | 654 | ||
| 650 | async_bp.addr = *epc; | 655 | async_bp.addr = *epc; | 
| 651 | *epc = (unsigned long)async_breakpoint; | 656 | *epc = (unsigned long)async_breakpoint; | 
| 652 | } | 657 | } | 
| 653 | 658 | ||
| 654 | void kgdb_wait(void *arg) | 659 | static void kgdb_wait(void *arg) | 
| 655 | { | 660 | { | 
| 656 | unsigned flags; | 661 | unsigned flags; | 
| 657 | int cpu = smp_processor_id(); | 662 | int cpu = smp_processor_id(); | 
| 658 | 663 | ||
| 659 | local_irq_save(flags); | 664 | local_irq_save(flags); | 
| 660 | 665 | ||
| 661 | spin_lock(&kgdb_cpulock[cpu]); | 666 | __raw_spin_lock(&kgdb_cpulock[cpu]); | 
| 662 | spin_unlock(&kgdb_cpulock[cpu]); | 667 | __raw_spin_unlock(&kgdb_cpulock[cpu]); | 
| 663 | 668 | ||
| 664 | local_irq_restore(flags); | 669 | local_irq_restore(flags); | 
| 665 | } | 670 | } | 
| @@ -707,7 +712,7 @@ void handle_exception (struct gdb_regs *regs) | |||
| 707 | * acquire the CPU spinlocks | 712 | * acquire the CPU spinlocks | 
| 708 | */ | 713 | */ | 
| 709 | for (i = num_online_cpus()-1; i >= 0; i--) | 714 | for (i = num_online_cpus()-1; i >= 0; i--) | 
| 710 | if (spin_trylock(&kgdb_cpulock[i]) == 0) | 715 | if (__raw_spin_trylock(&kgdb_cpulock[i]) == 0) | 
| 711 | panic("kgdb: couldn't get cpulock %d\n", i); | 716 | panic("kgdb: couldn't get cpulock %d\n", i); | 
| 712 | 717 | ||
| 713 | /* | 718 | /* | 
| @@ -982,7 +987,7 @@ finish_kgdb: | |||
| 982 | exit_kgdb_exception: | 987 | exit_kgdb_exception: | 
| 983 | /* release locks so other CPUs can go */ | 988 | /* release locks so other CPUs can go */ | 
| 984 | for (i = num_online_cpus()-1; i >= 0; i--) | 989 | for (i = num_online_cpus()-1; i >= 0; i--) | 
| 985 | spin_unlock(&kgdb_cpulock[i]); | 990 | __raw_spin_unlock(&kgdb_cpulock[i]); | 
| 986 | spin_unlock(&kgdb_lock); | 991 | spin_unlock(&kgdb_lock); | 
| 987 | 992 | ||
| 988 | __flush_cache_all(); | 993 | __flush_cache_all(); | 
| @@ -1036,12 +1041,12 @@ void adel(void) | |||
| 1036 | * malloc is needed by gdb client in "call func()", even a private one | 1041 | * malloc is needed by gdb client in "call func()", even a private one | 
| 1037 | * will make gdb happy | 1042 | * will make gdb happy | 
| 1038 | */ | 1043 | */ | 
| 1039 | static void *malloc(size_t size) | 1044 | static void * __attribute_used__ malloc(size_t size) | 
| 1040 | { | 1045 | { | 
| 1041 | return kmalloc(size, GFP_ATOMIC); | 1046 | return kmalloc(size, GFP_ATOMIC); | 
| 1042 | } | 1047 | } | 
| 1043 | 1048 | ||
| 1044 | static void free(void *where) | 1049 | static void __attribute_used__ free (void *where) | 
| 1045 | { | 1050 | { | 
| 1046 | kfree(where); | 1051 | kfree(where); | 
| 1047 | } | 1052 | } | 
