Subject: Re: Initial diffs to make arm32 kernel core dumps work with savecore and gdb
To: Chris Gilbert <chris@dokein.co.uk>
From: Matt Thomas <matt@3am-software.com>
List: port-arm
Date: 12/14/2007 21:26:33
On Dec 14, 2007, at 5:03 PM, Chris Gilbert wrote:
> Hi,
>
> Following on from making cats actually be capable of dumping kernel
> cores I've updated the kernel code and libkvm code to support
> dumping the extra headers etc needed for savecore to work. With
> some help from Nick (skrll@) I've added support to gdb to
> understand kernel core dumps. Nick did the mknative work for gdb.
>
> The updates to dumpsys and kcore.h were taken from similar code in
> i386.
>
> The asm dumpsys and dodumpsys were inspired by amd64's method of
> dumping core, as it makes sure that the stack has a switchframe
> containing the registers, something savectx didn't get right.
>
> These change remove the last active reference to savectx (which
> didn't work for dumpsys because the switchframe it placed on the
> stack is trashed by the dumpsys C code before the stack is saved to
> disk)
>
> I've broken the diffs down into bite sized chunks:
> kernel.diff - changes to the kernel to support dumping the extra
> info for savecore. Adds kcore.h.
> pkg_list.diff - adds kcore.h to the arm comp set.
> libkvm.diff - adds support to libkvm to provide the functions it
> needs to save the core dump (room for optimisation as the L1 table
> could be cached in memory)
> gdb_mknative.diff - Nick's run of mknative to provide a kvm target
> for gdb on arm
> gdb_pcb.diff - Adding the processing of the dumppcb structure from
> the kernel core dump to gdb
>
> The main item to highlight is the cpu_kcore_hdr structure in sys/
> arch/arm/include/kcore.h, as it's a new kernel->userland ABI for
> arm, I'd like to get it right first time if possible. Currently
> I've defined it as:
> typedef struct cpu_kcore_hdr {
> uint32_t version; /* structure version */
> uint32_t isArm26; /* indicates arm26 dump */
> uint32_t PAKernelL1Table; /* PA of PMAP_kernel L1 table */
ARMv6 will need two. Add a PAUserL1Table please.
Also add a UserL1TableSize variable. If 0, everything is KernelL1Table,
otherwise and any address < UserL1TableSize << 17 is looked up in
UserL1Table.
Also, we need a flags work for determining whether we are using the
compat or native armv6 page table (since that will effect decoding of
PTEs).
uint16_t UserL1TableSize;
uint16_t flags;
#define KCORE_ARM_APX 0x0001
> uint32_t nmemsegs; /* Number of RAM segments */
> #if 0
> phys_ram_seg_t memsegs[]; /* RAM segments */
> #endif
> } cpu_kcore_hdr_t;
>