diff options
Diffstat (limited to 'arch/mips/kernel/gdb-stub.c')
-rw-r--r-- | arch/mips/kernel/gdb-stub.c | 26 |
1 files changed, 13 insertions, 13 deletions
diff --git a/arch/mips/kernel/gdb-stub.c b/arch/mips/kernel/gdb-stub.c index cb5623aad552..3191afa29ad8 100644 --- a/arch/mips/kernel/gdb-stub.c +++ b/arch/mips/kernel/gdb-stub.c | |||
@@ -676,15 +676,18 @@ static void kgdb_wait(void *arg) | |||
676 | static int kgdb_smp_call_kgdb_wait(void) | 676 | static int kgdb_smp_call_kgdb_wait(void) |
677 | { | 677 | { |
678 | #ifdef CONFIG_SMP | 678 | #ifdef CONFIG_SMP |
679 | cpumask_t mask = cpu_online_map; | ||
679 | struct call_data_struct data; | 680 | struct call_data_struct data; |
680 | int i, cpus = num_online_cpus() - 1; | ||
681 | int cpu = smp_processor_id(); | 681 | int cpu = smp_processor_id(); |
682 | int cpus; | ||
682 | 683 | ||
683 | /* | 684 | /* |
684 | * Can die spectacularly if this CPU isn't yet marked online | 685 | * Can die spectacularly if this CPU isn't yet marked online |
685 | */ | 686 | */ |
686 | BUG_ON(!cpu_online(cpu)); | 687 | BUG_ON(!cpu_online(cpu)); |
687 | 688 | ||
689 | cpu_clear(cpu, mask); | ||
690 | cpus = cpus_weight(mask); | ||
688 | if (!cpus) | 691 | if (!cpus) |
689 | return 0; | 692 | return 0; |
690 | 693 | ||
@@ -711,10 +714,7 @@ static int kgdb_smp_call_kgdb_wait(void) | |||
711 | call_data = &data; | 714 | call_data = &data; |
712 | mb(); | 715 | mb(); |
713 | 716 | ||
714 | /* Send a message to all other CPUs and wait for them to respond */ | 717 | core_send_ipi_mask(mask, SMP_CALL_FUNCTION); |
715 | for (i = 0; i < NR_CPUS; i++) | ||
716 | if (cpu_online(i) && i != cpu) | ||
717 | core_send_ipi(i, SMP_CALL_FUNCTION); | ||
718 | 718 | ||
719 | /* Wait for response */ | 719 | /* Wait for response */ |
720 | /* FIXME: lock-up detection, backtrace on lock-up */ | 720 | /* FIXME: lock-up detection, backtrace on lock-up */ |
@@ -733,7 +733,7 @@ static int kgdb_smp_call_kgdb_wait(void) | |||
733 | * returns 1 if you should skip the instruction at the trap address, 0 | 733 | * returns 1 if you should skip the instruction at the trap address, 0 |
734 | * otherwise. | 734 | * otherwise. |
735 | */ | 735 | */ |
736 | void handle_exception (struct gdb_regs *regs) | 736 | void handle_exception(struct gdb_regs *regs) |
737 | { | 737 | { |
738 | int trap; /* Trap type */ | 738 | int trap; /* Trap type */ |
739 | int sigval; | 739 | int sigval; |
@@ -769,7 +769,7 @@ void handle_exception (struct gdb_regs *regs) | |||
769 | /* | 769 | /* |
770 | * acquire the CPU spinlocks | 770 | * acquire the CPU spinlocks |
771 | */ | 771 | */ |
772 | for (i = num_online_cpus()-1; i >= 0; i--) | 772 | for_each_online_cpu(i) |
773 | if (__raw_spin_trylock(&kgdb_cpulock[i]) == 0) | 773 | if (__raw_spin_trylock(&kgdb_cpulock[i]) == 0) |
774 | panic("kgdb: couldn't get cpulock %d\n", i); | 774 | panic("kgdb: couldn't get cpulock %d\n", i); |
775 | 775 | ||
@@ -902,7 +902,7 @@ void handle_exception (struct gdb_regs *regs) | |||
902 | hex2mem(ptr, (char *)®s->frame_ptr, 2*sizeof(long), 0, 0); | 902 | hex2mem(ptr, (char *)®s->frame_ptr, 2*sizeof(long), 0, 0); |
903 | ptr += 2*(2*sizeof(long)); | 903 | ptr += 2*(2*sizeof(long)); |
904 | hex2mem(ptr, (char *)®s->cp0_index, 16*sizeof(long), 0, 0); | 904 | hex2mem(ptr, (char *)®s->cp0_index, 16*sizeof(long), 0, 0); |
905 | strcpy(output_buffer,"OK"); | 905 | strcpy(output_buffer, "OK"); |
906 | } | 906 | } |
907 | break; | 907 | break; |
908 | 908 | ||
@@ -917,9 +917,9 @@ void handle_exception (struct gdb_regs *regs) | |||
917 | && hexToInt(&ptr, &length)) { | 917 | && hexToInt(&ptr, &length)) { |
918 | if (mem2hex((char *)addr, output_buffer, length, 1)) | 918 | if (mem2hex((char *)addr, output_buffer, length, 1)) |
919 | break; | 919 | break; |
920 | strcpy (output_buffer, "E03"); | 920 | strcpy(output_buffer, "E03"); |
921 | } else | 921 | } else |
922 | strcpy(output_buffer,"E01"); | 922 | strcpy(output_buffer, "E01"); |
923 | break; | 923 | break; |
924 | 924 | ||
925 | /* | 925 | /* |
@@ -996,7 +996,7 @@ void handle_exception (struct gdb_regs *regs) | |||
996 | ptr = &input_buffer[1]; | 996 | ptr = &input_buffer[1]; |
997 | if (!hexToInt(&ptr, &baudrate)) | 997 | if (!hexToInt(&ptr, &baudrate)) |
998 | { | 998 | { |
999 | strcpy(output_buffer,"B01"); | 999 | strcpy(output_buffer, "B01"); |
1000 | break; | 1000 | break; |
1001 | } | 1001 | } |
1002 | 1002 | ||
@@ -1015,7 +1015,7 @@ void handle_exception (struct gdb_regs *regs) | |||
1015 | break; | 1015 | break; |
1016 | default: | 1016 | default: |
1017 | baudrate = 0; | 1017 | baudrate = 0; |
1018 | strcpy(output_buffer,"B02"); | 1018 | strcpy(output_buffer, "B02"); |
1019 | goto x1; | 1019 | goto x1; |
1020 | } | 1020 | } |
1021 | 1021 | ||
@@ -1044,7 +1044,7 @@ finish_kgdb: | |||
1044 | 1044 | ||
1045 | exit_kgdb_exception: | 1045 | exit_kgdb_exception: |
1046 | /* release locks so other CPUs can go */ | 1046 | /* release locks so other CPUs can go */ |
1047 | for (i = num_online_cpus()-1; i >= 0; i--) | 1047 | for_each_online_cpu(i) |
1048 | __raw_spin_unlock(&kgdb_cpulock[i]); | 1048 | __raw_spin_unlock(&kgdb_cpulock[i]); |
1049 | spin_unlock(&kgdb_lock); | 1049 | spin_unlock(&kgdb_lock); |
1050 | 1050 | ||