Deleted Added
full compact
mp_x86.c (234208) mp_x86.c (235622)
1/*-
2 * Copyright (c) 1996, by Steve Passe
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 10 unchanged lines hidden (view full) ---

19 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23 * SUCH DAMAGE.
24 */
25
26#include <sys/cdefs.h>
1/*-
2 * Copyright (c) 1996, by Steve Passe
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 10 unchanged lines hidden (view full) ---

19 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23 * SUCH DAMAGE.
24 */
25
26#include <sys/cdefs.h>
27__FBSDID("$FreeBSD: head/sys/i386/i386/mp_machdep.c 234208 2012-04-13 07:18:19Z avg $");
27__FBSDID("$FreeBSD: head/sys/i386/i386/mp_machdep.c 235622 2012-05-18 18:55:58Z iwasaki $");
28
29#include "opt_apic.h"
30#include "opt_cpu.h"
31#include "opt_kstack_pages.h"
32#include "opt_pmap.h"
33#include "opt_sched.h"
34#include "opt_smp.h"
35

--- 105 unchanged lines hidden (view full) ---

141char *bootSTK;
142static int bootAP;
143
144/* Free these after use */
145void *bootstacks[MAXCPU];
146static void *dpcpu;
147
148struct pcb stoppcbs[MAXCPU];
28
29#include "opt_apic.h"
30#include "opt_cpu.h"
31#include "opt_kstack_pages.h"
32#include "opt_pmap.h"
33#include "opt_sched.h"
34#include "opt_smp.h"
35

--- 105 unchanged lines hidden (view full) ---

141char *bootSTK;
142static int bootAP;
143
144/* Free these after use */
145void *bootstacks[MAXCPU];
146static void *dpcpu;
147
148struct pcb stoppcbs[MAXCPU];
149struct pcb **susppcbs = NULL;
149
150/* Variables needed for SMP tlb shootdown. */
151vm_offset_t smp_tlb_addr1;
152vm_offset_t smp_tlb_addr2;
153volatile int smp_tlb_wait;
154
155#ifdef COUNT_IPIS
156/* Interrupt counts. */

--- 425 unchanged lines hidden (view full) ---

582 /* Install generic inter-CPU IPI handler */
583 setidt(IPI_BITMAP_VECTOR, IDTVEC(ipi_intr_bitmap_handler),
584 SDT_SYS386IGT, SEL_KPL, GSEL(GCODE_SEL, SEL_KPL));
585
586 /* Install an inter-CPU IPI for CPU stop/restart */
587 setidt(IPI_STOP, IDTVEC(cpustop),
588 SDT_SYS386IGT, SEL_KPL, GSEL(GCODE_SEL, SEL_KPL));
589
150
151/* Variables needed for SMP tlb shootdown. */
152vm_offset_t smp_tlb_addr1;
153vm_offset_t smp_tlb_addr2;
154volatile int smp_tlb_wait;
155
156#ifdef COUNT_IPIS
157/* Interrupt counts. */

--- 425 unchanged lines hidden (view full) ---

583 /* Install generic inter-CPU IPI handler */
584 setidt(IPI_BITMAP_VECTOR, IDTVEC(ipi_intr_bitmap_handler),
585 SDT_SYS386IGT, SEL_KPL, GSEL(GCODE_SEL, SEL_KPL));
586
587 /* Install an inter-CPU IPI for CPU stop/restart */
588 setidt(IPI_STOP, IDTVEC(cpustop),
589 SDT_SYS386IGT, SEL_KPL, GSEL(GCODE_SEL, SEL_KPL));
590
591 /* Install an inter-CPU IPI for CPU suspend/resume */
592 setidt(IPI_SUSPEND, IDTVEC(cpususpend),
593 SDT_SYS386IGT, SEL_KPL, GSEL(GCODE_SEL, SEL_KPL));
590
591 /* Set boot_cpu_id if needed. */
592 if (boot_cpu_id == -1) {
593 boot_cpu_id = PCPU_GET(apic_id);
594 cpu_info[boot_cpu_id].cpu_bsp = 1;
595 } else
596 KASSERT(boot_cpu_id == PCPU_GET(apic_id),
597 ("BSP's APIC ID doesn't match boot_cpu_id"));

--- 895 unchanged lines hidden (view full) ---

1493
1494 if (cpu == 0 && cpustop_restartfunc != NULL) {
1495 cpustop_restartfunc();
1496 cpustop_restartfunc = NULL;
1497 }
1498}
1499
1500/*
594
595 /* Set boot_cpu_id if needed. */
596 if (boot_cpu_id == -1) {
597 boot_cpu_id = PCPU_GET(apic_id);
598 cpu_info[boot_cpu_id].cpu_bsp = 1;
599 } else
600 KASSERT(boot_cpu_id == PCPU_GET(apic_id),
601 ("BSP's APIC ID doesn't match boot_cpu_id"));

--- 895 unchanged lines hidden (view full) ---

1497
1498 if (cpu == 0 && cpustop_restartfunc != NULL) {
1499 cpustop_restartfunc();
1500 cpustop_restartfunc = NULL;
1501 }
1502}
1503
1504/*
1505 * Handle an IPI_SUSPEND by saving our current context and spinning until we
1506 * are resumed.
1507 */
1508void
1509cpususpend_handler(void)
1510{
1511 u_int cpu;
1512
1513 cpu = PCPU_GET(cpuid);
1514
1515 if (suspendctx(susppcbs[cpu])) {
1516 wbinvd();
1517 CPU_SET_ATOMIC(cpu, &stopped_cpus);
1518 } else {
1519 pmap_init_pat();
1520 PCPU_SET(switchtime, 0);
1521 PCPU_SET(switchticks, ticks);
1522 susppcbs[cpu]->pcb_eip = 0;
1523 }
1524
1525 /* Wait for resume */
1526 while (!CPU_ISSET(cpu, &started_cpus))
1527 ia32_pause();
1528
1529 CPU_CLR_ATOMIC(cpu, &started_cpus);
1530 CPU_CLR_ATOMIC(cpu, &stopped_cpus);
1531
1532 /* Resume MCA and local APIC */
1533 mca_resume();
1534 lapic_setup(0);
1535}
1536/*
1501 * This is called once the rest of the system is up and running and we're
1502 * ready to let the AP's out of the pen.
1503 */
1504static void
1505release_aps(void *dummy __unused)
1506{
1507
1508 if (mp_ncpus == 1)

--- 40 unchanged lines hidden ---
1537 * This is called once the rest of the system is up and running and we're
1538 * ready to let the AP's out of the pen.
1539 */
1540static void
1541release_aps(void *dummy __unused)
1542{
1543
1544 if (mp_ncpus == 1)

--- 40 unchanged lines hidden ---