~ubuntu-branches/ubuntu/vivid/makedumpfile/vivid

« back to all changes in this revision

Viewing changes to makedumpfile.h

  • Committer: Package Import Robot
  • Author(s): Louis Bouchard
  • Date: 2013-02-05 09:55:43 UTC
  • mfrom: (1.1.9) (7.1.9 sid)
  • Revision ID: package-import@ubuntu.com-20130205095543-039wxgtczfls5j9y
* Merge of new upstream version 1.5.1
* Add --dmesg-fix from upstream 1.5.2 for kernels 3.5
  and above
* Add creation of /var/crash/dmesg.{timestamp} by kdump-config

Show diffs side-by-side

added added

removed removed

Lines of Context:
34
34
#ifdef USELZO
35
35
#include <lzo/lzo1x.h>
36
36
#endif
 
37
#ifdef USESNAPPY
 
38
#include <snappy-c.h>
 
39
#endif
37
40
#include "common.h"
38
41
#include "dwarf_info.h"
39
42
#include "diskdump_mod.h"
68
71
 * The following values are for linux-2.6.25 or former.
69
72
 */
70
73
#define PG_lru_ORIGINAL         (5)
 
74
#define PG_slab_ORIGINAL        (7)
71
75
#define PG_private_ORIGINAL     (11)    /* Has something at ->private */
72
76
#define PG_swapcache_ORIGINAL   (15)    /* Swap page: swp_entry_t in private */
73
77
 
 
78
#define PAGE_BUDDY_MAPCOUNT_VALUE_v2_6_38       (-2)
 
79
#define PAGE_BUDDY_MAPCOUNT_VALUE_v2_6_39_to_latest_version     (-128)
 
80
 
 
81
#define PAGE_FLAGS_SIZE_v2_6_27_to_latest_version       (4)
 
82
 
74
83
#define PAGE_MAPPING_ANON       (1)
75
84
 
76
85
#define LSEEKED_BITMAP  (1)
78
87
#define LSEEKED_PDATA   (3)
79
88
 
80
89
/*
 
90
 * Xen page flags
 
91
 */
 
92
#define BITS_PER_LONG (BITPERBYTE * sizeof(long))
 
93
#define PG_shift(idx)   (BITS_PER_LONG - (idx))
 
94
#define PG_mask(x, idx) (x ## UL << PG_shift(idx))
 
95
 /* Cleared when the owning guest 'frees' this page. */
 
96
#define PGC_allocated       PG_mask(1, 1)
 
97
 /* Page is Xen heap? */
 
98
#define PGC_xen_heap        PG_mask(1, 2)
 
99
 /* Page is broken? */
 
100
#define PGC_broken          PG_mask(1, 7)
 
101
 /* Mutually-exclusive page states: { inuse, offlining, offlined, free }. */
 
102
#define PGC_state           PG_mask(3, 9)
 
103
#define PGC_state_inuse     PG_mask(0, 9)
 
104
#define PGC_state_offlining PG_mask(1, 9)
 
105
#define PGC_state_offlined  PG_mask(2, 9)
 
106
#define PGC_state_free      PG_mask(3, 9)
 
107
#define page_state_is(ci, st) (((ci)&PGC_state) == PGC_state_##st)
 
108
 
 
109
 /* Count of references to this frame. */
 
110
#define PGC_count_width   PG_shift(9)
 
111
#define PGC_count_mask    ((1UL<<PGC_count_width)-1)
 
112
 
 
113
/*
81
114
 * Memory flags
82
115
 */
83
116
#define MEMORY_PAGETABLE_4L     (1 << 0)
118
151
#define PAGESHIFT()             (info->page_shift)
119
152
#define PAGEOFFSET(X)           (((unsigned long)(X)) & (PAGESIZE() - 1))
120
153
#define PAGEBASE(X)             (((unsigned long)(X)) & ~(PAGESIZE() - 1))
121
 
#define _2MB_PAGE_MASK          (~((2*1048576)-1))
122
154
 
123
155
/*
124
156
 * for SPARSEMEM
172
204
#define FILENAME_BITMAP         "kdump_bitmapXXXXXX"
173
205
#define FILENAME_STDOUT         "STDOUT"
174
206
 
175
 
/*
176
 
 * For cyclic processing
177
 
 */
178
 
#define DEFAULT_BUFSIZE_CYCLIC         (1024 * 1024)
179
207
 
180
208
/*
181
209
 * Minimam vmcore has 2 ProgramHeaderTables(PT_NOTE and PT_LOAD).
192
220
#define USHORT(ADDR)    *((unsigned short *)(ADDR))
193
221
#define UINT(ADDR)      *((unsigned int *)(ADDR))
194
222
#define ULONG(ADDR)     *((unsigned long *)(ADDR))
 
223
#define ULONGLONG(ADDR) *((unsigned long long *)(ADDR))
 
224
 
195
225
 
196
226
/*
197
227
 * for symbol
230
260
#define ARRAY_LENGTH(X)         (array_table.X)
231
261
#define SIZE_INIT(X, Y) \
232
262
do { \
233
 
        if ((SIZE(X) = get_structure_size(Y, 0)) == FAILED_DWARFINFO) \
 
263
        if ((SIZE(X) = get_structure_size(Y, DWARF_INFO_GET_STRUCT_SIZE))       \
 
264
                == FAILED_DWARFINFO) \
234
265
                return FALSE; \
235
266
} while (0)
236
267
#define TYPEDEF_SIZE_INIT(X, Y) \
237
268
do { \
238
 
        if ((SIZE(X) = get_structure_size(Y, 1)) == FAILED_DWARFINFO) \
 
269
        if ((SIZE(X) = get_structure_size(Y, DWARF_INFO_GET_TYPEDEF_SIZE)) \
 
270
                == FAILED_DWARFINFO) \
239
271
                return FALSE; \
240
272
} while (0)
 
273
#define ENUM_TYPE_SIZE_INIT(X, Y) \
 
274
do { \
 
275
        if ((SIZE(X) = get_structure_size(Y,    \
 
276
                DWARF_INFO_GET_ENUMERATION_TYPE_SIZE))  \
 
277
                        == FAILED_DWARFINFO)                            \
 
278
        return FALSE; \
 
279
} while (0)
241
280
#define OFFSET_INIT(X, Y, Z) \
242
281
do { \
243
282
        if ((OFFSET(X) = get_member_offset(Y, Z, DWARF_INFO_GET_MEMBER_OFFSET)) \
382
421
#define KVER_MIN_SHIFT 16
383
422
#define KERNEL_VERSION(x,y,z) (((x) << KVER_MAJ_SHIFT) | ((y) << KVER_MIN_SHIFT) | (z))
384
423
#define OLDEST_VERSION          KERNEL_VERSION(2, 6, 15)/* linux-2.6.15 */
385
 
#define LATEST_VERSION          KERNEL_VERSION(3, 4, 8)/* linux-3.4.8 */
 
424
#define LATEST_VERSION          KERNEL_VERSION(3, 6, 7)/* linux-3.6.7 */
386
425
 
387
426
/*
388
427
 * vmcoreinfo in /proc/vmcore
415
454
#define SIZE_BUF_STDIN  (4096)
416
455
#define STRLEN_OSRELEASE (65)   /* same length as diskdump.h */
417
456
 
418
 
#define SIZE_XEN_CRASH_INFO_V2  (sizeof(unsigned long) * 10)
419
 
 
420
457
/*
421
458
 * The value of dependence on machine
422
459
 */
470
507
#define _PAGE_PRESENT           (0x001)
471
508
#define _PAGE_PSE               (0x080)
472
509
 
473
 
#define ENTRY_MASK              (~0x8000000000000fffULL)
 
510
/* Physical addresses are up to 52 bits (AMD64).
 
511
 * Mask off bits 52-62 (reserved) and bit 63 (NX).
 
512
 */
 
513
#define ENTRY_MASK              (~0xfff0000000000fffULL)
474
514
 
475
515
#endif /* x86 */
476
516
 
503
543
#define PML4_SHIFT              (39)
504
544
#define PTRS_PER_PML4           (512)
505
545
#define PGDIR_SHIFT             (30)
 
546
#define PGDIR_SIZE              (1UL << PGDIR_SHIFT)
 
547
#define PGDIR_MASK              (~(PGDIR_SIZE - 1))
506
548
#define PTRS_PER_PGD            (512)
507
549
#define PMD_SHIFT               (21)
 
550
#define PMD_SIZE                (1UL << PMD_SHIFT)
 
551
#define PMD_MASK                (~(PMD_SIZE - 1))
508
552
#define PTRS_PER_PMD            (512)
509
553
#define PTRS_PER_PTE            (512)
510
554
#define PTE_SHIFT               (12)
515
559
#define pte_index(address)  (((address) >> PTE_SHIFT) & (PTRS_PER_PTE - 1))
516
560
 
517
561
#define _PAGE_PRESENT           (0x001)
518
 
#define _PAGE_PSE               (0x080)    /* 2MB page */
519
 
 
520
 
#define __PHYSICAL_MASK_SHIFT   (40)
521
 
#define __PHYSICAL_MASK         ((1UL << __PHYSICAL_MASK_SHIFT) - 1)
522
 
#define PHYSICAL_PAGE_MASK      (~(PAGESIZE()-1) & (__PHYSICAL_MASK << PAGESHIFT()))
 
562
#define _PAGE_PSE               (0x080)    /* 2MB or 1GB page */
523
563
 
524
564
#endif /* x86_64 */
525
565
 
563
603
#define _REGION_ENTRY_TYPE_MASK 0x0c    /* region table type mask */
564
604
#define _REGION_ENTRY_INVALID   0x20    /* invalid region table entry */
565
605
#define _REGION_ENTRY_LENGTH    0x03    /* region table length */
 
606
#define _REGION_ENTRY_LARGE     0x400
566
607
#define _REGION_OFFSET_MASK     0x7ffUL /* region/segment table offset mask */
567
608
 
568
609
#define RSG_TABLE_LEVEL(x)      (((x) & _REGION_ENTRY_TYPE_MASK) >> 2)
718
759
#define pfn_to_paddr(X) \
719
760
        (((unsigned long long)(X) + ARCH_PFN_OFFSET) << PAGESHIFT())
720
761
 
 
762
/* Format of Xen crash info ELF note */
 
763
typedef struct {
 
764
        unsigned long xen_major_version;
 
765
        unsigned long xen_minor_version;
 
766
        unsigned long xen_extra_version;
 
767
        unsigned long xen_changeset;
 
768
        unsigned long xen_compiler;
 
769
        unsigned long xen_compile_date;
 
770
        unsigned long xen_compile_time;
 
771
        unsigned long tainted;
 
772
} xen_crash_info_com_t;
 
773
 
 
774
typedef struct {
 
775
        xen_crash_info_com_t com;
 
776
#if defined(__x86__) || defined(__x86_64__)
 
777
        /* added by changeset 2b43fb3afb3e: */
 
778
        unsigned long dom0_pfn_to_mfn_frame_list_list;
 
779
#endif
 
780
#if defined(__ia64__)
 
781
        /* added by changeset d7c3b12014b3: */
 
782
        unsigned long dom0_mm_pgd_mfn;
 
783
#endif
 
784
} xen_crash_info_t;
 
785
 
 
786
/* changeset 439a3e9459f2 added xen_phys_start
 
787
 * to the middle of the struct... */
 
788
typedef struct {
 
789
        xen_crash_info_com_t com;
 
790
#if defined(__x86__) || defined(__x86_64__)
 
791
        unsigned long xen_phys_start;
 
792
        unsigned long dom0_pfn_to_mfn_frame_list_list;
 
793
#endif
 
794
#if defined(__ia64__)
 
795
        unsigned long dom0_mm_pgd_mfn;
 
796
#endif
 
797
} xen_crash_info_v2_t;
 
798
 
721
799
struct mem_map_data {
722
800
        unsigned long long      pfn_start;
723
801
        unsigned long long      pfn_end;
740
818
        size_t  cache_size;
741
819
        off_t   offset;
742
820
};
 
821
typedef unsigned long int ulong;
 
822
typedef unsigned long long int ulonglong;
743
823
 
744
824
/*
745
825
 * makedumpfile header
902
982
        /*
903
983
         * for Xen extraction
904
984
         */
 
985
        union {                         /* Both versions of Xen crash info: */
 
986
                xen_crash_info_com_t *com;   /* common fields */
 
987
                xen_crash_info_t *v1;        /* without xen_phys_start */
 
988
                xen_crash_info_v2_t *v2;     /* changeset 439a3e9459f2 */
 
989
        } xen_crash_info;
 
990
        int xen_crash_info_v;           /* Xen crash info version:
 
991
                                         *   0 .. xen_crash_info_com_t
 
992
                                         *   1 .. xen_crash_info_t
 
993
                                         *   2 .. xen_crash_info_v2_t */
 
994
 
905
995
        unsigned long long      dom0_mapnr;  /* The number of page in domain-0.
906
996
                                              * Different from max_mapnr.
907
997
                                              * max_mapnr is the number of page
917
1007
        unsigned long *p2m_mfn_frame_list;
918
1008
        int     num_domain;
919
1009
        struct domain_list *domain_list;
 
1010
#if defined(__x86_64__)
 
1011
        unsigned long xen_virt_start;
 
1012
        unsigned long directmap_virt_end;
 
1013
#endif
920
1014
 
921
1015
        /*
922
1016
         * for splitting
940
1034
         */
941
1035
        int flag_sadump_diskset;
942
1036
        enum sadump_format_type flag_sadump;         /* sadump format type */
 
1037
        /*
 
1038
         * for filtering free pages managed by buddy system:
 
1039
         */
 
1040
        int (*page_is_buddy)(unsigned long flags, unsigned int _mapcount,
 
1041
                             unsigned long private, unsigned int _count);
943
1042
};
944
1043
extern struct DumpInfo          *info;
945
1044
 
996
1095
        unsigned long long      log_buf;
997
1096
        unsigned long long      log_buf_len;
998
1097
        unsigned long long      log_end;
 
1098
        unsigned long long      log_first_idx;
 
1099
        unsigned long long      log_next_idx;
999
1100
        unsigned long long      max_pfn;
1000
1101
        unsigned long long      node_remap_start_vaddr;
1001
1102
        unsigned long long      node_remap_end_vaddr;
1075
1176
        long    cpumask_t;
1076
1177
        long    kexec_segment;
1077
1178
        long    elf64_hdr;
 
1179
        long    log;
 
1180
 
 
1181
        long    pageflags;
1078
1182
};
1079
1183
 
1080
1184
struct offset_table {
1083
1187
                long    _count;
1084
1188
                long    mapping;
1085
1189
                long    lru;
 
1190
                long    _mapcount;
 
1191
                long    private;
1086
1192
        } page;
1087
1193
        struct mem_section {
1088
1194
                long    section_mem_map;
1204
1310
                long    p_paddr;
1205
1311
                long    p_memsz;
1206
1312
        } elf64_phdr;
 
1313
 
 
1314
        struct log_s {
 
1315
                long ts_nsec;
 
1316
                long len;
 
1317
                long text_len;
 
1318
        } log;
 
1319
 
1207
1320
};
1208
1321
 
1209
1322
/*
1244
1357
        long    PG_lru;
1245
1358
        long    PG_private;
1246
1359
        long    PG_swapcache;
 
1360
        long    PG_buddy;
 
1361
        long    PG_slab;
 
1362
 
 
1363
        long    PAGE_BUDDY_MAPCOUNT_VALUE;
1247
1364
};
1248
1365
 
1249
1366
struct srcfile_table {
1287
1404
 
1288
1405
#ifdef __arm__
1289
1406
#define kvtop_xen(X)    FALSE
 
1407
#define get_xen_basic_info_arch(X) FALSE
1290
1408
#define get_xen_info_arch(X) FALSE
1291
1409
#endif  /* arm */
1292
1410
 
1296
1414
#define HYPERVISOR_VIRT_END             (0xFFFFFFFFUL)
1297
1415
#define DIRECTMAP_VIRT_START            (0xFF000000UL)
1298
1416
#define DIRECTMAP_VIRT_END              (0xFFC00000UL)
 
1417
#define FRAMETABLE_VIRT_START           (0xF6800000UL)
1299
1418
 
1300
1419
#define is_xen_vaddr(x) \
1301
1420
        ((x) >= HYPERVISOR_VIRT_START_PAE && (x) < HYPERVISOR_VIRT_END)
1305
1424
unsigned long long kvtop_xen_x86(unsigned long kvaddr);
1306
1425
#define kvtop_xen(X)    kvtop_xen_x86(X)
1307
1426
 
 
1427
int get_xen_basic_info_x86(void);
 
1428
#define get_xen_basic_info_arch(X) get_xen_basic_info_x86(X)
1308
1429
int get_xen_info_x86(void);
1309
1430
#define get_xen_info_arch(X) get_xen_info_x86(X)
1310
1431
 
1312
1433
 
1313
1434
#ifdef __x86_64__
1314
1435
 
1315
 
#define ENTRY_MASK              (~0x8000000000000fffULL)
 
1436
/* The architectural limit for physical addresses is 52 bits.
 
1437
 * Mask off bits 52-62 (available for OS use) and bit 63 (NX).
 
1438
 */
 
1439
#define ENTRY_MASK              (~0xfff0000000000fffULL)
1316
1440
#define MAX_X86_64_FRAMES       (info->page_size / sizeof(unsigned long))
1317
1441
 
1318
1442
#define PAGE_OFFSET_XEN_DOM0  (0xffff880000000000) /* different from linux */
1319
1443
#define HYPERVISOR_VIRT_START (0xffff800000000000)
1320
1444
#define HYPERVISOR_VIRT_END   (0xffff880000000000)
1321
1445
#define DIRECTMAP_VIRT_START  (0xffff830000000000)
1322
 
#define DIRECTMAP_VIRT_END    (0xffff840000000000)
1323
 
#define XEN_VIRT_START        (0xffff828c80000000)
 
1446
#define DIRECTMAP_VIRT_END_V3 (0xffff840000000000)
 
1447
#define DIRECTMAP_VIRT_END_V4 (0xffff880000000000)
 
1448
#define DIRECTMAP_VIRT_END    (info->directmap_virt_end)
 
1449
#define XEN_VIRT_START_V3     (0xffff828c80000000)
 
1450
#define XEN_VIRT_START_V4     (0xffff82c480000000)
 
1451
#define XEN_VIRT_START        (info->xen_virt_start)
 
1452
#define XEN_VIRT_END          (XEN_VIRT_START + (1UL << 30))
 
1453
#define FRAMETABLE_VIRT_START 0xffff82f600000000
1324
1454
 
1325
1455
#define is_xen_vaddr(x) \
1326
1456
        ((x) >= HYPERVISOR_VIRT_START && (x) < HYPERVISOR_VIRT_END)
1327
1457
#define is_direct(x) \
1328
1458
        ((x) >= DIRECTMAP_VIRT_START && (x) < DIRECTMAP_VIRT_END)
1329
1459
#define is_xen_text(x) \
1330
 
        ((x) >= XEN_VIRT_START && (x) < DIRECTMAP_VIRT_START)
 
1460
        ((x) >= XEN_VIRT_START && (x) < XEN_VIRT_END)
1331
1461
 
1332
1462
unsigned long long kvtop_xen_x86_64(unsigned long kvaddr);
1333
1463
#define kvtop_xen(X)    kvtop_xen_x86_64(X)
1334
1464
 
 
1465
int get_xen_basic_info_x86_64(void);
 
1466
#define get_xen_basic_info_arch(X) get_xen_basic_info_x86_64(X)
1335
1467
int get_xen_info_x86_64(void);
1336
1468
#define get_xen_info_arch(X) get_xen_info_x86_64(X)
1337
1469
 
1367
1499
unsigned long long kvtop_xen_ia64(unsigned long kvaddr);
1368
1500
#define kvtop_xen(X)    kvtop_xen_ia64(X)
1369
1501
 
 
1502
int get_xen_basic_info_ia64(void);
 
1503
#define get_xen_basic_info_arch(X) get_xen_basic_info_ia64(X)
1370
1504
int get_xen_info_ia64(void);
1371
1505
#define get_xen_info_arch(X) get_xen_info_ia64(X)
1372
1506
 
1374
1508
 
1375
1509
#if defined(__powerpc64__) || defined(__powerpc32__) /* powerpcXX */
1376
1510
#define kvtop_xen(X)    FALSE
 
1511
#define get_xen_basic_info_arch(X) FALSE
1377
1512
#define get_xen_info_arch(X) FALSE
1378
1513
#endif  /* powerpcXX */
1379
1514
 
1380
1515
#ifdef __s390x__ /* s390x */
1381
1516
#define kvtop_xen(X)    FALSE
 
1517
#define get_xen_basic_info_arch(X) FALSE
1382
1518
#define get_xen_info_arch(X) FALSE
1383
1519
#endif  /* s390x */
1384
1520
 
1512
1648
 */
1513
1649
unsigned long long get_num_dumpable_cyclic(void);
1514
1650
int get_loads_dumpfile_cyclic(void);
1515
 
 
 
1651
int initial_xen(void);
 
1652
unsigned long long get_free_memory_size(void);
 
1653
int calculate_cyclic_buffer_size(void);
1516
1654
 
1517
1655
#endif /* MAKEDUMPFILE_H */