Module Name:    src
Committed By:   yamaguchi
Date:           Thu Dec 23 02:07:21 UTC 2021

Modified Files:
        src/sys/arch/amd64/amd64: db_interface.c
        src/sys/arch/i386/i386: db_interface.c
        src/sys/arch/x86/x86: idt.c intr.c

Log Message:
x86: improve error handling related to idt_vec_alloc()


To generate a diff of this commit:
cvs rdiff -u -r1.39 -r1.40 src/sys/arch/amd64/amd64/db_interface.c
cvs rdiff -u -r1.86 -r1.87 src/sys/arch/i386/i386/db_interface.c
cvs rdiff -u -r1.14 -r1.15 src/sys/arch/x86/x86/idt.c
cvs rdiff -u -r1.156 -r1.157 src/sys/arch/x86/x86/intr.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/amd64/amd64/db_interface.c
diff -u src/sys/arch/amd64/amd64/db_interface.c:1.39 src/sys/arch/amd64/amd64/db_interface.c:1.40
--- src/sys/arch/amd64/amd64/db_interface.c:1.39	Tue Feb 23 07:13:51 2021
+++ src/sys/arch/amd64/amd64/db_interface.c	Thu Dec 23 02:07:21 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: db_interface.c,v 1.39 2021/02/23 07:13:51 mrg Exp $	*/
+/*	$NetBSD: db_interface.c,v 1.40 2021/12/23 02:07:21 yamaguchi Exp $	*/
 
 /*
  * Mach Operating System
@@ -33,7 +33,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: db_interface.c,v 1.39 2021/02/23 07:13:51 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: db_interface.c,v 1.40 2021/12/23 02:07:21 yamaguchi Exp $");
 
 #include "opt_ddb.h"
 #include "opt_multiprocessor.h"
@@ -119,6 +119,7 @@ db_machine_init(void)
 		handler = &Xintr_x2apic_ddbipi;
 #endif
 	ddb_vec = idt_vec_alloc(iv, 0xf0, 0xff);
+	KASSERT(ddb_vec > 0);
 	set_idtgate(&idt[ddb_vec], handler, 1, SDT_SYS386IGT, SEL_KPL,
 	    GSEL(GCODE_SEL, SEL_KPL));
 #else

Index: src/sys/arch/i386/i386/db_interface.c
diff -u src/sys/arch/i386/i386/db_interface.c:1.86 src/sys/arch/i386/i386/db_interface.c:1.87
--- src/sys/arch/i386/i386/db_interface.c:1.86	Tue Feb 23 07:13:52 2021
+++ src/sys/arch/i386/i386/db_interface.c	Thu Dec 23 02:07:21 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: db_interface.c,v 1.86 2021/02/23 07:13:52 mrg Exp $	*/
+/*	$NetBSD: db_interface.c,v 1.87 2021/12/23 02:07:21 yamaguchi Exp $	*/
 
 /*
  * Mach Operating System
@@ -33,7 +33,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: db_interface.c,v 1.86 2021/02/23 07:13:52 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: db_interface.c,v 1.87 2021/12/23 02:07:21 yamaguchi Exp $");
 
 #include "opt_ddb.h"
 #include "opt_multiprocessor.h"
@@ -122,6 +122,7 @@ db_machine_init(void)
 		handler = &Xintr_x2apic_ddbipi;
 #endif
 	ddb_vec = idt_vec_alloc(iv, 0xf0, 0xff);
+	KASSERT(ddb_vec > 0);
 	idt_vec_set(iv, ddb_vec, handler);
 #else
 	/* Initialised as part of xen_ipi_init() */

Index: src/sys/arch/x86/x86/idt.c
diff -u src/sys/arch/x86/x86/idt.c:1.14 src/sys/arch/x86/x86/idt.c:1.15
--- src/sys/arch/x86/x86/idt.c:1.14	Tue Jul 14 15:59:21 2020
+++ src/sys/arch/x86/x86/idt.c	Thu Dec 23 02:07:21 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: idt.c,v 1.14 2020/07/14 15:59:21 para Exp $	*/
+/*	$NetBSD: idt.c,v 1.15 2021/12/23 02:07:21 yamaguchi Exp $	*/
 
 /*-
  * Copyright (c) 1996, 1997, 1998, 2000, 2009 The NetBSD Foundation, Inc.
@@ -65,7 +65,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: idt.c,v 1.14 2020/07/14 15:59:21 para Exp $");
+__KERNEL_RCSID(0, "$NetBSD: idt.c,v 1.15 2021/12/23 02:07:21 yamaguchi Exp $");
 
 #include "opt_pcpu_idt.h"
 
@@ -170,6 +170,9 @@ idt_vec_alloc(struct idt_vec *iv, int lo
 
 	KASSERT(mutex_owned(&cpu_lock) || !mp_online);
 
+	if (low < 0 || high >= __arraycount(iv->iv_allocmap))
+		return -1;
+
 	for (vec = low; vec <= high; vec++) {
 		if (idt_allocmap[vec] == 0) {
 			/* idt_vec_free() can be unlocked, so membar. */
@@ -178,7 +181,8 @@ idt_vec_alloc(struct idt_vec *iv, int lo
 			return vec;
 		}
 	}
-	return 0;
+
+	return -1;
 }
 
 void
@@ -189,7 +193,7 @@ idt_vec_reserve(struct idt_vec *iv, int 
 	KASSERT(mutex_owned(&cpu_lock) || !mp_online);
 
 	result = idt_vec_alloc(iv, vec, vec);
-	if (result != vec) {
+	if (result < 0) {
 		panic("%s: failed to reserve vec %d", __func__, vec);
 	}
 }
@@ -201,6 +205,7 @@ idt_vec_set(struct idt_vec *iv, int vec,
 	char *idt_allocmap __diagused = iv->iv_allocmap;
 
 	KASSERT(idt_allocmap[vec] == 1);
+
 	idt = iv->iv_idt;
 	set_idtgate(&idt[vec], function, 0, SDT_SYS386IGT, SEL_KPL,
 	       GSEL(GCODE_SEL, SEL_KPL));
@@ -215,6 +220,8 @@ idt_vec_free(struct idt_vec *iv, int vec
 	idt_descriptor_t *idt;
 	char *idt_allocmap = iv->iv_allocmap;
 
+	KASSERT(idt_allocmap[vec] == 1);
+
 	idt = iv->iv_idt;
 	unset_idtgate(&idt[vec]);
 	idt_allocmap[vec] = 0;

Index: src/sys/arch/x86/x86/intr.c
diff -u src/sys/arch/x86/x86/intr.c:1.156 src/sys/arch/x86/x86/intr.c:1.157
--- src/sys/arch/x86/x86/intr.c:1.156	Thu Oct  7 12:52:27 2021
+++ src/sys/arch/x86/x86/intr.c	Thu Dec 23 02:07:21 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: intr.c,v 1.156 2021/10/07 12:52:27 msaitoh Exp $	*/
+/*	$NetBSD: intr.c,v 1.157 2021/12/23 02:07:21 yamaguchi Exp $	*/
 
 /*
  * Copyright (c) 2007, 2008, 2009, 2019 The NetBSD Foundation, Inc.
@@ -133,7 +133,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.156 2021/10/07 12:52:27 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.157 2021/12/23 02:07:21 yamaguchi Exp $");
 
 #include "opt_intrdebug.h"
 #include "opt_multiprocessor.h"
@@ -609,7 +609,7 @@ intr_allocate_slot(struct pic *pic, int 
 		iv = idt_vec_ref(&ci->ci_idtvec);
 		idtvec = idt_vec_alloc(iv, APIC_LEVEL(level), IDT_INTR_HIGH);
 	}
-	if (idtvec == 0) {
+	if (idtvec < 0) {
 		evcnt_detach(&ci->ci_isources[slot]->is_evcnt);
 		ci->ci_isources[slot]->is_evname[0] = '\0';
 		ci->ci_isources[slot] = NULL;
@@ -1799,7 +1799,7 @@ intr_deactivate_xcall(void *arg1, void *
 
 	x86_intr_calculatemasks(ci);
 
-	if (idt_vec > 0 && idt_vec_is_pcpu()) {
+	if (idt_vec_is_pcpu()) {
 		idt_vec_free(&ci->ci_idtvec, idt_vec);
 	} else  {
 		/*
@@ -1898,7 +1898,7 @@ intr_set_affinity(struct intrsource *isp
 
 	old_idtvec = isp->is_idtvec;
 
-	if (isp->is_idtvec > 0 && idt_vec_is_pcpu()) {
+	if (idt_vec_is_pcpu()) {
 		new_idtvec = idt_vec_alloc(&newci->ci_idtvec,
 		    APIC_LEVEL(ih->ih_level), IDT_INTR_HIGH);
 		if (new_idtvec == 0)

Reply via email to