drivers: power: report battery voltage in AOSP compatible format
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / kernel / kexec.c
index ffd4e111fd67e7d7b29199b6206957f6c458a350..1f8d9382dbac7b6422eb1ea7e722ed867b1b61be 100644 (file)
@@ -47,6 +47,9 @@ u32 vmcoreinfo_note[VMCOREINFO_NOTE_SIZE/4];
 size_t vmcoreinfo_size;
 size_t vmcoreinfo_max_size = sizeof(vmcoreinfo_data);
 
+/* Flag to indicate we are going to kexec a new kernel */
+bool kexec_in_progress = false;
+
 /* Location of the reserved area for the crash kernel */
 struct resource crashk_res = {
        .name  = "Crash kernel",
@@ -786,7 +789,7 @@ static int kimage_load_normal_segment(struct kimage *image,
                                         struct kexec_segment *segment)
 {
        unsigned long maddr;
-       unsigned long ubytes, mbytes;
+       size_t ubytes, mbytes;
        int result;
        unsigned char __user *buf;
 
@@ -819,13 +822,9 @@ static int kimage_load_normal_segment(struct kimage *image,
                /* Start with a clear page */
                clear_page(ptr);
                ptr += maddr & ~PAGE_MASK;
-               mchunk = PAGE_SIZE - (maddr & ~PAGE_MASK);
-               if (mchunk > mbytes)
-                       mchunk = mbytes;
-
-               uchunk = mchunk;
-               if (uchunk > ubytes)
-                       uchunk = ubytes;
+               mchunk = min_t(size_t, mbytes,
+                               PAGE_SIZE - (maddr & ~PAGE_MASK));
+               uchunk = min(ubytes, mchunk);
 
                result = copy_from_user(ptr, buf, uchunk);
                kunmap(page);
@@ -850,7 +849,7 @@ static int kimage_load_crash_segment(struct kimage *image,
         * We do things a page at a time for the sake of kmap.
         */
        unsigned long maddr;
-       unsigned long ubytes, mbytes;
+       size_t ubytes, mbytes;
        int result;
        unsigned char __user *buf;
 
@@ -871,13 +870,10 @@ static int kimage_load_crash_segment(struct kimage *image,
                }
                ptr = kmap(page);
                ptr += maddr & ~PAGE_MASK;
-               mchunk = PAGE_SIZE - (maddr & ~PAGE_MASK);
-               if (mchunk > mbytes)
-                       mchunk = mbytes;
-
-               uchunk = mchunk;
-               if (uchunk > ubytes) {
-                       uchunk = ubytes;
+               mchunk = min_t(size_t, mbytes,
+                               PAGE_SIZE - (maddr & ~PAGE_MASK));
+               uchunk = min(ubytes, mchunk);
+               if (mchunk > uchunk) {
                        /* Zero the trailing part of the page */
                        memset(ptr + uchunk, 0, mchunk - uchunk);
                }
@@ -1118,12 +1114,8 @@ void __weak crash_free_reserved_phys_range(unsigned long begin,
 {
        unsigned long addr;
 
-       for (addr = begin; addr < end; addr += PAGE_SIZE) {
-               ClearPageReserved(pfn_to_page(addr >> PAGE_SHIFT));
-               init_page_count(pfn_to_page(addr >> PAGE_SHIFT));
-               free_page((unsigned long)__va(addr));
-               totalram_pages++;
-       }
+       for (addr = begin; addr < end; addr += PAGE_SIZE)
+               free_reserved_page(pfn_to_page(addr >> PAGE_SHIFT));
 }
 
 int crash_shrink_memory(unsigned long new_size)
@@ -1544,14 +1536,13 @@ void vmcoreinfo_append_str(const char *fmt, ...)
 {
        va_list args;
        char buf[0x50];
-       int r;
+       size_t r;
 
        va_start(args, fmt);
        r = vsnprintf(buf, sizeof(buf), fmt, args);
        va_end(args);
 
-       if (r + vmcoreinfo_size > vmcoreinfo_max_size)
-               r = vmcoreinfo_max_size - vmcoreinfo_size;
+       r = min(r, vmcoreinfo_max_size - vmcoreinfo_size);
 
        memcpy(&vmcoreinfo_data[vmcoreinfo_size], buf, r);
 
@@ -1581,7 +1572,7 @@ static int __init crash_save_vmcoreinfo_init(void)
        VMCOREINFO_SYMBOL(swapper_pg_dir);
 #endif
        VMCOREINFO_SYMBOL(_stext);
-       VMCOREINFO_SYMBOL(vmlist);
+       VMCOREINFO_SYMBOL(vmap_area_list);
 
 #ifndef CONFIG_NEED_MULTIPLE_NODES
        VMCOREINFO_SYMBOL(mem_map);
@@ -1619,7 +1610,8 @@ static int __init crash_save_vmcoreinfo_init(void)
        VMCOREINFO_OFFSET(free_area, free_list);
        VMCOREINFO_OFFSET(list_head, next);
        VMCOREINFO_OFFSET(list_head, prev);
-       VMCOREINFO_OFFSET(vm_struct, addr);
+       VMCOREINFO_OFFSET(vmap_area, va_start);
+       VMCOREINFO_OFFSET(vmap_area, list);
        VMCOREINFO_LENGTH(zone.free_area, MAX_ORDER);
        log_buf_kexec_setup();
        VMCOREINFO_LENGTH(free_area.free_list, MIGRATE_TYPES);
@@ -1689,6 +1681,7 @@ int kernel_kexec(void)
        } else
 #endif
        {
+               kexec_in_progress = true;
                kernel_restart_prepare(NULL);
                printk(KERN_EMERG "Starting new kernel\n");
                machine_shutdown();