x86, microcode, AMD: Add a vendor-specific exit function
authorBorislav Petkov <borislav.petkov@amd.com>
Fri, 2 Dec 2011 15:50:04 +0000 (16:50 +0100)
committerBorislav Petkov <bp@amd64.org>
Wed, 14 Dec 2011 11:46:47 +0000 (12:46 +0100)
This will be used to do cleanup work before the driver exits.

Signed-off-by: Borislav Petkov <borislav.petkov@amd.com>
arch/x86/include/asm/microcode.h
arch/x86/kernel/microcode_amd.c
arch/x86/kernel/microcode_core.c

index 24215072d0e1e5894d4643634bfe1ef9786eef55..4ebe157bf73db184b4e73df8f391db399fd874a7 100644 (file)
@@ -48,6 +48,7 @@ static inline struct microcode_ops * __init init_intel_microcode(void)
 
 #ifdef CONFIG_MICROCODE_AMD
 extern struct microcode_ops * __init init_amd_microcode(void);
+extern void __exit exit_amd_microcode(void);
 
 static inline void get_ucode_data(void *to, const u8 *from, size_t n)
 {
@@ -59,6 +60,7 @@ static inline struct microcode_ops * __init init_amd_microcode(void)
 {
        return NULL;
 }
+static inline void __exit exit_amd_microcode(void) {}
 #endif
 
 #endif /* _ASM_X86_MICROCODE_H */
index d494799aafcd46b7e444940557321a42fce07175..e8a68c2a4364b35c2b3277a688e08dd8b9a87475 100644 (file)
@@ -353,3 +353,7 @@ struct microcode_ops * __init init_amd_microcode(void)
 {
        return &microcode_amd_ops;
 }
+
+void __exit exit_amd_microcode(void)
+{
+}
index 9d46f5e43b51f0dd2b02ad0575c1e90470df862a..9302e2d0eb4b5dcf5175976553486d50767aa0a8 100644 (file)
@@ -563,6 +563,8 @@ module_init(microcode_init);
 
 static void __exit microcode_exit(void)
 {
+       struct cpuinfo_x86 *c = &cpu_data(0);
+
        microcode_dev_exit();
 
        unregister_hotcpu_notifier(&mc_cpu_notifier);
@@ -580,6 +582,9 @@ static void __exit microcode_exit(void)
 
        microcode_ops = NULL;
 
+       if (c->x86_vendor == X86_VENDOR_AMD)
+               exit_amd_microcode();
+
        pr_info("Microcode Update Driver: v" MICROCODE_VERSION " removed.\n");
 }
 module_exit(microcode_exit);