Hello community,
here is the log from the commit of package lkcdutils
checked in at Mon Apr 24 16:13:21 CEST 2006.
--------
--- lkcdutils/lkcdutils.changes 2006-04-10 10:38:54.000000000 +0200
+++ STABLE/lkcdutils/lkcdutils.changes 2006-04-24 10:08:10.000000000 +0200
@@ -1,0 +2,7 @@
+Mon Apr 24 09:04:09 CEST 2006 - hare@suse.de
+
+- Fixed script name in /etc/init.d/boot.lkcd (#164964)
+- Fix 4-Level Pagetable dumps (#166312)
+- Install /etc/sysconfig/dump correctly (#164966)
+
+-------------------------------------------------------------------
New:
----
lkcdutils-4level-pgtable.patch
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ lkcdutils.spec ++++++
--- /var/tmp/diff_new_pack.hsPhuE/_old 2006-04-24 16:09:20.000000000 +0200
+++ /var/tmp/diff_new_pack.hsPhuE/_new 2006-04-24 16:09:20.000000000 +0200
@@ -14,7 +14,7 @@
BuildRequires: glib2-devel libelf popt-devel
Summary: Linux Kernel Crash Dump (LKCD) Utilities
Version: 7.0.1
-Release: 12
+Release: 15
License: GPL
Group: System/Kernel
# Original source is from Sourceforge CVS:
@@ -40,6 +40,7 @@
Patch14: lkcdutils-save-kerntypes.patch
Patch15: lkcdutils-handle-version-9.patch
Patch16: lkcdutils-s390-args-crash
+Patch17: lkcdutils-4level-pgtable.patch
Patch20: lkcdutils-ia64-fujitsu.patch
Patch71: lkcdutils-netdump-secure_mode.patch
Patch75: lkcdutils-netdump-doc.patch
@@ -88,6 +89,7 @@
%patch14 -p3
%patch15 -p3
%patch16 -p1
+%patch17 -p0
cp %{S:4} PATCHES
%build
@@ -119,7 +121,7 @@
fi
%post
-%{fillup_and_insserv -f}
+%{fillup_only -n dump}
%postun
%{insserv_cleanup}
@@ -129,7 +131,7 @@
/usr/sbin/useradd -c "LKCD Netdump Server" -r -o -g dump -s /bin/bash -d /var/lib/netdump netdump 2> /dev/null || :
%post netdump-server
-%{fillup_and_insserv -f}
+%{fillup_and_insserv}
%postun netdump-server
%{insserv_cleanup}
@@ -169,6 +171,10 @@
#/usr/sbin/netdump-login-client
%changelog -n lkcdutils
+* Mon Apr 24 2006 - hare@suse.de
+- Fixed script name in /etc/init.d/boot.lkcd (#164964)
+- Fix 4-Level Pagetable dumps (#166312)
+- Install /etc/sysconfig/dump correctly (#164966)
* Mon Apr 10 2006 - hare@suse.de
- Fix crash when started with args (#163769 - LTC22923)
* Wed Mar 29 2006 - hare@suse.de
++++++ lkcdutils-4level-pgtable.patch ++++++
Subject: [PATCH 1/1] ia64: lcrash support for 4-level page tables
From: Cliff Wickman
The kernel may be built with CONFIG_PGTABLE_3 or CONFIG_PGTABLE_4
for 3-level or 4-level page tables.
This patch allows lcrash to detect the difference and translate
virtual addresses to physical addresses accordingly.
Method:
The kernel page table (swapper_pg_dir) is tested by attempting to
map the gate page (GATE_ADDR -- 0xa000000000000000) both through
a 4-level page table and a 3-level table.
Diffed against version 7.X.X
Apply: cd ...../7.X.X/lkcdutils
patch -p0 < this_patch
Signed-off-by: Cliff Wickman
---
Also includes a resiliency fix to sial_setupidx().
Without the fix lcrash can die from a divide by zero on multi-dimension
arrays with a dimension of [1].
--- lib/libklib/kl_mem.c 2005-03-22 10:24:20 -06:00
+++ lib/libklib/kl_mem.c.orig 2006-04-12 15:02:28 -05:00
@@ -223,7 +223,9 @@ kl_get_block(kaddr_t addr, unsigned size
if ( KL_VIRTOP(vaddr, mmap, &paddr) ) {
return(KL_ERROR);
}
- kl_readmem(paddr, s, bp);
+ if (kl_readmem(paddr, s, bp)) {
+ return(KL_ERROR);
+ }
}
vaddr = tmp;
size=size - s;
--- lib/libklib/kl_kern_ia64.c 2006-01-06 13:56:49 -06:00
+++ lib/libklib/kl_kern_ia64.c.orig 2006-04-12 15:05:55 -05:00
@@ -30,10 +30,12 @@ kaddr_t HIGH_MEMORY_ADDR = 0;
extern kaddr_t MODULE_LIST_ADDR;
kaddr_t swapper_pg_dir = 0;
+int is_four_level = 0;
/* Function declarations
*/
static int _init_high_memory_ia64(void);
+int kl_test_page_tables(void);
/* The variables below are for the base address of the per node and
* global memory virtual addresses. We will check at startup to see if
@@ -1029,6 +1031,107 @@ kl_init_virtop_ia64(void)
*/
kl_vtop_ia64(SWAPPER_PG_DIR_ADDR, &swapper_pg_dir);
+ is_four_level = kl_test_page_tables();
+
return(0);
}
+/*
+ * Name: kl_test_page_tables()
+ * Func: Tests whether the kernel page table is 3-level
+ * or 4-level
+ *
+ * returns 1 for 4-level, 0 for 3-level
+ */
+int
+kl_test_page_tables(void)
+{
+ int lev4=1, lev3=1;
+ kaddr_t vaddr, pgtable;
+ kaddr_t pgd_off, pud_off, pmd_off, pte_off;
+ kaddr_t pgd_entryp, pud_entryp, pmd_entryp, pte_entryp;
+ kaddr_t pud_base, pmd_base, pte_base, pte;
+#define PTE_VALID 1 /* bit 0 */
+#define PTE_PLEVEL 0x180 /* bits 8-7 */
+#define PTE_PLSHIFT 7
+#define PTE_ACCESS 0x0e00 /* bits 11-9 */
+#define PTE_ASHIFT 9
+
+ vaddr = 0xa000000000000000; /* see GATE_ADDR, system.h */
+ /* GATE_ADDR should be a valid pte, user level, but with
+ no RWX permissions */
+ pgtable = swapper_pg_dir;
+
+ /* first try to map the GATE_ADDR assuming a 4-level page table */
+ pgd_off = ((vaddr >> KL_PGDIR4_SHIFT_IA64)
+ & (KL_PTRS_PER_PGD_IA64 - 1)) * KL_NBPW;
+ pgd_entryp = pgtable + pgd_off;
+ pud_base = KL_READ_PTR(pgd_entryp);
+ if (pud_base) {
+ pud_off = ((vaddr >> KL_PUD_SHIFT_IA64)
+ & (KL_PTRS_PER_PUD_IA64 - 1)) * KL_NBPW;
+ pud_entryp = pud_base + pud_off;
+ pmd_base = KL_READ_PTR(pud_entryp);
+ if (pmd_base) {
+ pmd_off = ((vaddr >> KL_PMD_SHIFT_IA64)
+ & (KL_PTRS_PER_PMD_IA64 - 1)) * KL_NBPW;
+ pmd_entryp = pmd_base + pmd_off;
+ pte_base = KL_READ_PTR(pmd_entryp);
+ if (pte_base) {
+ /* kludge for compiler bug:
+ must keep a print here or else the 4-level
+ test comes out true for 3 levels*/
+ fprintf (KL_ERRORFP,".");
+ pte_off = ((vaddr >> KL_PAGE_SHIFT_IA64)
+ & (KL_PTRS_PER_PTE_IA64 - 1)) * KL_NBPW;
+ pte_entryp = pte_base + pte_off;
+ pte = KL_READ_PTR(pte_entryp);
+ if ((pte & PTE_VALID) == 0) {
+ lev4 = 0;
+ }
+ if (((pte & PTE_PLEVEL)>>PTE_PLSHIFT) != 3) {
+ lev4 = 0;
+ }
+ if (((pte & PTE_ACCESS)>>PTE_ASHIFT) != 0) {
+ lev4 = 0;
+ }
+ if (lev4) {
+ fprintf (KL_ERRORFP,
+ ".page.table.is.4-level.");
+ return 1;
+ }
+ }
+ }
+ }
+ /* was not 4-level; do a sanity check for 3-level */
+ pgd_off = ((vaddr >> KL_PGDIR_SHIFT_IA64)
+ & (KL_PTRS_PER_PGD_IA64 - 1)) * KL_NBPW;
+ pgd_entryp = pgtable + pgd_off;
+ pmd_base = KL_READ_PTR(pgd_entryp);
+ if (pmd_base) {
+ pmd_off = ((vaddr >> KL_PMD_SHIFT_IA64)
+ & (KL_PTRS_PER_PMD_IA64 - 1)) * KL_NBPW;
+ pmd_entryp = pmd_base + pmd_off;
+ pte_base = KL_READ_PTR(pmd_entryp);
+ if (pte_base) {
+ pte_off = ((vaddr >> KL_PAGE_SHIFT_IA64)
+ & (KL_PTRS_PER_PTE_IA64 - 1)) * KL_NBPW;
+ pte_entryp = pte_base + pte_off;
+ pte = KL_READ_PTR(pte_entryp);
+ if ((pte & PTE_VALID) == 0) {
+ lev3 = 0;
+ }
+ if (((pte & PTE_PLEVEL)>>PTE_PLSHIFT) != 3) {
+ lev3 = 0;
+ }
+ if (((pte & PTE_ACCESS)>>PTE_ASHIFT) != 0) {
+ lev3 = 0;
+ }
+ if (lev3) {
+ return 0;
+ }
+ }
+ }
+ fprintf (KL_ERRORFP, " page table format is not recognized\n");
+ exit(1);
+}
--- lib/libklib/kl_page_ia64.c 2005-09-10 02:59:57 -05:00
+++ lib/libklib/kl_page_ia64.c.orig 2006-04-12 15:05:06 -05:00
@@ -62,15 +62,34 @@
* Bits 44-60 are sign extention of bit 47.
*
* PGD is indexed by bits [46,45,44,43,42,..,36].
+ *
+ * With 4-level page tables:
+ *
+ * 63 6158 47 36 25 14 0
+ * +---+-+-------+--------+--------+--------+-----------+
+ * 0x5 pgd-idx pud_idx pmd_idx pte_idx pte_offset
+ *
+ * The figure above explains structure of virtual address.
+ * Bits 63-61 represent region number of kernel virtual space. [5]
+ * Bits 0 -13 represent page offset.
+ * Bits 14-24 represent PTE index.
+ * Bits 25-35 represent PMD index.
+ * Bits 36-46 represent PUD index.
+ * Bits 47-57 represent PGD index.
+ * Bits 58-60 are sign extention of bit 57.
+ *
+ * PGD is indexed by bits [57,56,55,54,53,..,47].
*/
/*
* macro definitions
* (VMALLOC_START is defined in )
+ * (VMALLOC_START_IA64 0xa000000200000000)
*/
extern kaddr_t VMALLOC_START;
extern kaddr_t SWAPPER_PG_DIR_ADDR;
+extern int is_four_level;
#define IS_KERNEL_VADDR_IA64(vaddr) (vaddr > VMALLOC_START && vaddr < 0xafffffffffffffff)
#define PGDIR_REGBIT_SHIFT_IA64 (KL_PAGE_SHIFT_IA64 - 6)
@@ -108,23 +127,43 @@ static kaddr_t _kl_pte_offset_ia64(
static kaddr_t
_kl_pgd_offset_ia64(kaddr_t pgd_base, kaddr_t vaddr)
{
- kaddr_t pgd_off, pgd_entry, pmd_base;
+ kaddr_t pgd_off, pud_off, pgd_entry, pud_entry, pud_base, pmd_base;
if (IS_KERNEL_VADDR_IA64(vaddr)) {
- pgd_off = ((vaddr >> KL_PGDIR_SHIFT_IA64)
+ if (is_four_level) {
+ pgd_off = ((vaddr >> KL_PGDIR4_SHIFT_IA64)
+ & (KL_PTRS_PER_PGD_IA64 - 1)) * KL_NBPW;
+ } else {
+ pgd_off = ((vaddr >> KL_PGDIR_SHIFT_IA64)
& (KL_PTRS_PER_PGD_IA64 - 1)) * KL_NBPW;
+ }
} else {
uint64_t pgdir_index, region;
- pgdir_index = vaddr >> KL_PGDIR_SHIFT_IA64;
+ if (is_four_level) {
+ pgdir_index = vaddr >> KL_PGDIR4_SHIFT_IA64;
+ } else {
+ pgdir_index = vaddr >> KL_PGDIR_SHIFT_IA64;
+ }
region = vaddr >> 61;
pgd_off = ( (region << PGDIR_REGBIT_SHIFT_IA64)
| ( pgdir_index & ((1 << PGDIR_REGBIT_SHIFT_IA64)-1)) )
- * KL_NBPW;
+ * KL_NBPW;
+ }
+ if (is_four_level) {
+ kl_vtop_ia64((pgd_base + pgd_off), &pgd_entry);
+ pud_base = KL_READ_PTR(pgd_entry);
+
+ pud_off = ((vaddr >> KL_PUD_SHIFT_IA64)
+ & (KL_PTRS_PER_PUD_IA64 - 1)) * KL_NBPW;
+
+ kl_vtop_ia64((pud_base + pud_off), &pud_entry);
+ pmd_base = KL_READ_PTR(pud_entry);
+ } else {
+ kl_vtop_ia64((pgd_base + pgd_off), &pgd_entry);
+ pmd_base = KL_READ_PTR(pgd_entry);
}
- kl_vtop_ia64((pgd_base + pgd_off), &pgd_entry);
- pmd_base = KL_READ_PTR(pgd_entry);
return pmd_base;
}
@@ -211,6 +250,7 @@ kl_mmap_virtop_ia64(kaddr_t vaddr, void
/* vaddr points to user space */
pgd_base = kl_kaddr(mmp, "mm_struct", "pgd");
}
+ /* _kl_pgd_offset_ia64 will handle the 4-level case */
/* Search for PMD */
pmd_base = _kl_pgd_offset_ia64(pgd_base, vaddr);
--- lib/libklib/include/kl_mem_ia64.h 2005-11-16 15:33:23 -06:00
+++ lib/libklib/include/kl_mem_ia64.h.orig 2006-04-12 15:05:06 -05:00
@@ -67,14 +67,25 @@
#define KL_PAGE_SIZE_IA64 (1ULL << KL_PAGE_SHIFT_IA64)
#define KL_PAGE_MASK_IA64 (~(KL_PAGE_SIZE_IA64-1))
+/* for 3-level page tables: */
#define KL_PGDIR_SHIFT_IA64 (KL_PAGE_SHIFT_IA64+(KL_PAGE_SHIFT_IA64-3)*2)
#define KL_PGDIR_SIZE_IA64 (1ULL</dev/null 2>&1
if [ "$DUMP_COMPRESS" = "1" ]; then
@@ -84,7 +84,7 @@
rc_status -v
;;
*)
- echo "Usage: /etc/init.d/dumputils {start|stop|reload|force-reload|restart}"
+ echo "Usage: $0 {start|stop|reload|force-reload|restart}"
exit 1
;;
esac
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Remember to have fun...