efi_selftest: test ReinstallProtocolInterface

Add a test for ReinstallProtocolInterface to the controller selftest.

As ReinstallProtocolInterface has to connect controllers to the new
interface is does not fit to the manage protocols selftest.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Signed-off-by: Alexander Graf <agraf@suse.de>
diff --git a/lib/efi_selftest/efi_selftest_controllers.c b/lib/efi_selftest/efi_selftest_controllers.c
index e30c11b..ceefa03 100644
--- a/lib/efi_selftest/efi_selftest_controllers.c
+++ b/lib/efi_selftest/efi_selftest_controllers.c
@@ -6,7 +6,7 @@
  *
  * This unit test checks the following protocol services:
  * ConnectController, DisconnectController,
- * InstallProtocol, UninstallProtocol,
+ * InstallProtocol, ReinstallProtocol, UninstallProtocol,
  * OpenProtocol, CloseProtcol, OpenProtocolInformation
  */
 
@@ -14,6 +14,8 @@
 
 #define NUMBER_OF_CHILD_CONTROLLERS 4
 
+static int interface1 = 1;
+static int interface2 = 2;
 static struct efi_boot_services *boottime;
 const efi_guid_t guid_driver_binding_protocol =
 			EFI_DRIVER_BINDING_PROTOCOL_GUID;
@@ -271,7 +273,7 @@
 	/* Create controller handle */
 	ret = boottime->install_protocol_interface(
 			&handle_controller, &guid_controller,
-			EFI_NATIVE_INTERFACE, NULL);
+			EFI_NATIVE_INTERFACE, &interface1);
 	if (ret != EFI_SUCCESS) {
 		efi_st_error("InstallProtocolInterface failed\n");
 		return EFI_ST_FAILURE;
@@ -299,6 +301,7 @@
  * Disconnect and destroy the remaining child controllers.
  *
  * Connect a controller to a driver.
+ * Reinstall the driver protocol on the controller.
  * Uninstall the driver protocol from the controller.
  */
 static int execute(void)
@@ -361,9 +364,35 @@
 		efi_st_error("Number of children %u != %u\n",
 			     (unsigned int)count, NUMBER_OF_CHILD_CONTROLLERS);
 	}
+	/* Try to uninstall controller protocol using the wrong interface */
+	ret = boottime->uninstall_protocol_interface(handle_controller,
+						     &guid_controller,
+						     &interface2);
+	if (ret == EFI_SUCCESS) {
+		efi_st_error(
+			"Interface not checked when uninstalling protocol\n");
+		return EFI_ST_FAILURE;
+	}
+	/* Reinstall controller protocol */
+	ret = boottime->reinstall_protocol_interface(handle_controller,
+						     &guid_controller,
+						     &interface1,
+						     &interface2);
+	if (ret != EFI_SUCCESS) {
+		efi_st_error("Failed to reinstall protocols\n");
+		return EFI_ST_FAILURE;
+	}
+	/* Check number of child controllers */
+	ret = count_child_controllers(handle_controller, &guid_controller,
+				      &count);
+	if (ret != EFI_SUCCESS || count != NUMBER_OF_CHILD_CONTROLLERS) {
+		efi_st_error("Number of children %u != %u\n",
+			     (unsigned int)count, NUMBER_OF_CHILD_CONTROLLERS);
+	}
 	/* Uninstall controller protocol */
 	ret = boottime->uninstall_protocol_interface(handle_controller,
-						     &guid_controller, NULL);
+						     &guid_controller,
+						     &interface2);
 	if (ret != EFI_SUCCESS) {
 		efi_st_error("Failed to uninstall protocols\n");
 		return EFI_ST_FAILURE;