summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHeiko Carstens <heiko.carstens@de.ibm.com>2019-07-25 03:23:39 -0400
committerVasily Gorbik <gor@linux.ibm.com>2019-08-21 06:41:43 -0400
commitf62f7dcbf023160ca47eb4bc7228ece8207f8a8e (patch)
tree2d661e3a7fc877bedcd4d17588721fbf79e30f26
parent8c72e0c85212df4e7c77fca55556e423fe17e801 (diff)
Documentation/s390: remove outdated debugging390 documentation
This file would need a lot of work to make sense again. Thomas Huth started working on that four years ago, but that wasn't finished. Therefore remove this. Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
-rw-r--r--Documentation/s390/debugging390.rst2613
-rw-r--r--Documentation/s390/index.rst1
2 files changed, 0 insertions, 2614 deletions
diff --git a/Documentation/s390/debugging390.rst b/Documentation/s390/debugging390.rst
deleted file mode 100644
index 73ad0b06c666..000000000000
--- a/Documentation/s390/debugging390.rst
+++ /dev/null
@@ -1,2613 +0,0 @@
1=============================================
2Debugging on Linux for s/390 & z/Architecture
3=============================================
4
5Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
6
7Copyright (C) 2000-2001 IBM Deutschland Entwicklung GmbH, IBM Corporation
8
9.. Best viewed with fixed width fonts
10
11Overview of Document:
12=====================
13This document is intended to give a good overview of how to debug Linux for
14s/390 and z/Architecture. It is not intended as a complete reference and not a
15tutorial on the fundamentals of C & assembly. It doesn't go into
16390 IO in any detail. It is intended to complement the documents in the
17reference section below & any other worthwhile references you get.
18
19It is intended like the Enterprise Systems Architecture/390 Reference Summary
20to be printed out & used as a quick cheat sheet self help style reference when
21problems occur.
22
23.. Contents
24 ========
25 Register Set
26 Address Spaces on Intel Linux
27 Address Spaces on Linux for s/390 & z/Architecture
28 The Linux for s/390 & z/Architecture Kernel Task Structure
29 Register Usage & Stackframes on Linux for s/390 & z/Architecture
30 A sample program with comments
31 Compiling programs for debugging on Linux for s/390 & z/Architecture
32 Debugging under VM
33 s/390 & z/Architecture IO Overview
34 Debugging IO on s/390 & z/Architecture under VM
35 GDB on s/390 & z/Architecture
36 Stack chaining in gdb by hand
37 Examining core dumps
38 ldd
39 Debugging modules
40 The proc file system
41 SysRq
42 References
43 Special Thanks
44
45Register Set
46============
47The current architectures have the following registers.
48
4916 General propose registers, 32 bit on s/390 and 64 bit on z/Architecture,
50r0-r15 (or gpr0-gpr15), used for arithmetic and addressing.
51
5216 Control registers, 32 bit on s/390 and 64 bit on z/Architecture, cr0-cr15,
53kernel usage only, used for memory management, interrupt control, debugging
54control etc.
55
5616 Access registers (ar0-ar15), 32 bit on both s/390 and z/Architecture,
57normally not used by normal programs but potentially could be used as
58temporary storage. These registers have a 1:1 association with general
59purpose registers and are designed to be used in the so-called access
60register mode to select different address spaces.
61Access register 0 (and access register 1 on z/Architecture, which needs a
6264 bit pointer) is currently used by the pthread library as a pointer to
63the current running threads private area.
64
6516 64-bit floating point registers (fp0-fp15 ) IEEE & HFP floating
66point format compliant on G5 upwards & a Floating point control reg (FPC)
67
684 64-bit registers (fp0,fp2,fp4 & fp6) HFP only on older machines.
69
70Note:
71 Linux (currently) always uses IEEE & emulates G5 IEEE format on older
72 machines, ( provided the kernel is configured for this ).
73
74
75The PSW is the most important register on the machine it
76is 64 bit on s/390 & 128 bit on z/Architecture & serves the roles of
77a program counter (pc), condition code register,memory space designator.
78In IBM standard notation I am counting bit 0 as the MSB.
79It has several advantages over a normal program counter
80in that you can change address translation & program counter
81in a single instruction. To change address translation,
82e.g. switching address translation off requires that you
83have a logical=physical mapping for the address you are
84currently running at.
85
86+-------------------------+-------------------------------------------------+
87| Bit | |
88+--------+----------------+ Value |
89| s/390 | z/Architecture | |
90+========+================+=================================================+
91| 0 | 0 | Reserved (must be 0) otherwise specification |
92| | | exception occurs. |
93+--------+----------------+-------------------------------------------------+
94| 1 | 1 | Program Event Recording 1 PER enabled, |
95| | | PER is used to facilitate debugging e.g. |
96| | | single stepping. |
97+--------+----------------+-------------------------------------------------+
98| 2-4 | 2-4 | Reserved (must be 0). |
99+--------+----------------+-------------------------------------------------+
100| 5 | 5 | Dynamic address translation 1=DAT on. |
101+--------+----------------+-------------------------------------------------+
102| 6 | 6 | Input/Output interrupt Mask |
103+--------+----------------+-------------------------------------------------+
104| 7 | 7 | External interrupt Mask used primarily for |
105| | | interprocessor signalling and clock interrupts. |
106+--------+----------------+-------------------------------------------------+
107| 8-11 | 8-11 | PSW Key used for complex memory protection |
108| | | mechanism (not used under linux) |
109+--------+----------------+-------------------------------------------------+
110| 12 | 12 | 1 on s/390 0 on z/Architecture |
111+--------+----------------+-------------------------------------------------+
112| 13 | 13 | Machine Check Mask 1=enable machine check |
113| | | interrupts |
114+--------+----------------+-------------------------------------------------+
115| 14 | 14 | Wait State. Set this to 1 to stop the processor |
116| | | except for interrupts and give time to other |
117| | | LPARS. Used in CPU idle in the kernel to |
118| | | increase overall usage of processor resources. |
119+--------+----------------+-------------------------------------------------+
120| 15 | 15 | Problem state (if set to 1 certain instructions |
121| | | are disabled). All linux user programs run with |
122| | | this bit 1 (useful info for debugging under VM).|
123+--------+----------------+-------------------------------------------------+
124| 16-17 | 16-17 | Address Space Control |
125| | | |
126| | | 00 Primary Space Mode: |
127| | | |
128| | | The register CR1 contains the primary |
129| | | address-space control element (PASCE), which |
130| | | points to the primary space region/segment |
131| | | table origin. |
132| | | |
133| | | 01 Access register mode |
134| | | |
135| | | 10 Secondary Space Mode: |
136| | | |
137| | | The register CR7 contains the secondary |
138| | | address-space control element (SASCE), which |
139| | | points to the secondary space region or |
140| | | segment table origin. |
141| | | |
142| | | 11 Home Space Mode: |
143| | | |
144| | | The register CR13 contains the home space |
145| | | address-space control element (HASCE), which |
146| | | points to the home space region/segment |
147| | | table origin. |
148| | | |
149| | | See "Address Spaces on Linux for s/390 & |
150| | | z/Architecture" below for more information |
151| | | about address space usage in Linux. |
152+--------+----------------+-------------------------------------------------+
153| 18-19 | 18-19 | Condition codes (CC) |
154+--------+----------------+-------------------------------------------------+
155| 20 | 20 | Fixed point overflow mask if 1=FPU exceptions |
156| | | for this event occur (normally 0) |
157+--------+----------------+-------------------------------------------------+
158| 21 | 21 | Decimal overflow mask if 1=FPU exceptions for |
159| | | this event occur (normally 0) |
160+--------+----------------+-------------------------------------------------+
161| 22 | 22 | Exponent underflow mask if 1=FPU exceptions |
162| | | for this event occur (normally 0) |
163+--------+----------------+-------------------------------------------------+
164| 23 | 23 | Significance Mask if 1=FPU exceptions for this |
165| | | event occur (normally 0) |
166+--------+----------------+-------------------------------------------------+
167| 24-31 | 24-30 | Reserved Must be 0. |
168| +----------------+-------------------------------------------------+
169| | 31 | Extended Addressing Mode |
170| +----------------+-------------------------------------------------+
171| | 32 | Basic Addressing Mode |
172| | | |
173| | | Used to set addressing mode:: |
174| | | |
175| | | +---------+----------+----------+ |
176| | | | PSW 31 | PSW 32 | | |
177| | | +---------+----------+----------+ |
178| | | | 0 | 0 | 24 bit | |
179| | | +---------+----------+----------+ |
180| | | | 0 | 1 | 31 bit | |
181| | | +---------+----------+----------+ |
182| | | | 1 | 1 | 64 bit | |
183| | | +---------+----------+----------+ |
184+--------+----------------+-------------------------------------------------+
185| 32 | | 1=31 bit addressing mode 0=24 bit addressing |
186| | | mode (for backward compatibility), linux |
187| | | always runs with this bit set to 1 |
188+--------+----------------+-------------------------------------------------+
189| 33-64 | | Instruction address. |
190| +----------------+-------------------------------------------------+
191| | 33-63 | Reserved must be 0 |
192| +----------------+-------------------------------------------------+
193| | 64-127 | Address |
194| | | |
195| | | - In 24 bits mode bits 64-103=0 bits 104-127 |
196| | | Address |
197| | | - In 31 bits mode bits 64-96=0 bits 97-127 |
198| | | Address |
199| | | |
200| | | Note: |
201| | | unlike 31 bit mode on s/390 bit 96 must be |
202| | | zero when loading the address with LPSWE |
203| | | otherwise a specification exception occurs, |
204| | | LPSW is fully backward compatible. |
205+--------+----------------+-------------------------------------------------+
206
207Prefix Page(s)
208--------------
209This per cpu memory area is too intimately tied to the processor not to mention.
210It exists between the real addresses 0-4096 on s/390 and between 0-8192 on
211z/Architecture and is exchanged with one page on s/390 or two pages on
212z/Architecture in absolute storage by the set prefix instruction during Linux
213startup.
214
215This page is mapped to a different prefix for each processor in an SMP
216configuration (assuming the OS designer is sane of course).
217
218Bytes 0-512 (200 hex) on s/390 and 0-512, 4096-4544, 4604-5119 currently on
219z/Architecture are used by the processor itself for holding such information
220as exception indications and entry points for exceptions.
221
222Bytes after 0xc00 hex are used by linux for per processor globals on s/390 and
223z/Architecture (there is a gap on z/Architecture currently between 0xc00 and
2240x1000, too, which is used by Linux).
225
226The closest thing to this on traditional architectures is the interrupt
227vector table. This is a good thing & does simplify some of the kernel coding
228however it means that we now cannot catch stray NULL pointers in the
229kernel without hard coded checks.
230
231
232
233Address Spaces on Intel Linux
234=============================
235
236The traditional Intel Linux is approximately mapped as follows forgive
237the ascii art::
238
239 0xFFFFFFFF 4GB Himem *****************
240 * *
241 * Kernel Space *
242 * *
243 ***************** ****************
244 User Space Himem * User Stack * * *
245 (typically 0xC0000000 3GB ) ***************** * *
246 * Shared Libs * * Next Process *
247 ***************** * to *
248 * * <== * Run * <==
249 * User Program * * *
250 * Data BSS * * *
251 * Text * * *
252 * Sections * * *
253 0x00000000 ***************** ****************
254
255Now it is easy to see that on Intel it is quite easy to recognise a kernel
256address as being one greater than user space himem (in this case 0xC0000000),
257and addresses of less than this are the ones in the current running program on
258this processor (if an smp box).
259
260If using the virtual machine ( VM ) as a debugger it is quite difficult to
261know which user process is running as the address space you are looking at
262could be from any process in the run queue.
263
264The limitation of Intels addressing technique is that the linux
265kernel uses a very simple real address to virtual addressing technique
266of Real Address=Virtual Address-User Space Himem.
267This means that on Intel the kernel linux can typically only address
268Himem=0xFFFFFFFF-0xC0000000=1GB & this is all the RAM these machines
269can typically use.
270
271They can lower User Himem to 2GB or lower & thus be
272able to use 2GB of RAM however this shrinks the maximum size
273of User Space from 3GB to 2GB they have a no win limit of 4GB unless
274they go to 64 Bit.
275
276
277On 390 our limitations & strengths make us slightly different.
278For backward compatibility we are only allowed use 31 bits (2GB)
279of our 32 bit addresses, however, we use entirely separate address
280spaces for the user & kernel.
281
282This means we can support 2GB of non Extended RAM on s/390, & more
283with the Extended memory management swap device &
284currently 4TB of physical memory currently on z/Architecture.
285
286
287Address Spaces on Linux for s/390 & z/Architecture
288==================================================
289
290Our addressing scheme is basically as follows::
291
292 Primary Space Home Space
293 Himem 0x7fffffff 2GB on s/390 ***************** ****************
294 currently 0x3ffffffffff (2^42)-1 * User Stack * * *
295 on z/Architecture. ***************** * *
296 * Shared Libs * * *
297 ***************** * *
298 * * * Kernel *
299 * User Program * * *
300 * Data BSS * * *
301 * Text * * *
302 * Sections * * *
303 0x00000000 ***************** ****************
304
305This also means that we need to look at the PSW problem state bit and the
306addressing mode to decide whether we are looking at user or kernel space.
307
308User space runs in primary address mode (or access register mode within
309the vdso code).
310
311The kernel usually also runs in home space mode, however when accessing
312user space the kernel switches to primary or secondary address mode if
313the mvcos instruction is not available or if a compare-and-swap (futex)
314instruction on a user space address is performed.
315
316When also looking at the ASCE control registers, this means:
317
318User space:
319
320- runs in primary or access register mode
321- cr1 contains the user asce
322- cr7 contains the user asce
323- cr13 contains the kernel asce
324
325Kernel space:
326
327- runs in home space mode
328- cr1 contains the user or kernel asce
329
330 - the kernel asce is loaded when a uaccess requires primary or
331 secondary address mode
332
333- cr7 contains the user or kernel asce, (changed with set_fs())
334- cr13 contains the kernel asce
335
336In case of uaccess the kernel changes to:
337
338- primary space mode in case of a uaccess (copy_to_user) and uses
339 e.g. the mvcp instruction to access user space. However the kernel
340 will stay in home space mode if the mvcos instruction is available
341- secondary space mode in case of futex atomic operations, so that the
342 instructions come from primary address space and data from secondary
343 space
344
345In case of KVM, the kernel runs in home space mode, but cr1 gets switched
346to contain the gmap asce before the SIE instruction gets executed. When
347the SIE instruction is finished, cr1 will be switched back to contain the
348user asce.
349
350
351Virtual Addresses on s/390 & z/Architecture
352===========================================
353
354A virtual address on s/390 is made up of 3 parts
355The SX (segment index, roughly corresponding to the PGD & PMD in Linux
356terminology) being bits 1-11.
357
358The PX (page index, corresponding to the page table entry (pte) in Linux
359terminology) being bits 12-19.
360
361The remaining bits BX (the byte index are the offset in the page )
362i.e. bits 20 to 31.
363
364On z/Architecture in linux we currently make up an address from 4 parts.
365
366- The region index bits (RX) 0-32 we currently use bits 22-32
367- The segment index (SX) being bits 33-43
368- The page index (PX) being bits 44-51
369- The byte index (BX) being bits 52-63
370
371Notes:
372 1) s/390 has no PMD so the PMD is really the PGD also.
373 A lot of this stuff is defined in pgtable.h.
374
375 2) Also seeing as s/390's page indexes are only 1k in size
376 (bits 12-19 x 4 bytes per pte ) we use 1 ( page 4k )
377 to make the best use of memory by updating 4 segment indices
378 entries each time we mess with a PMD & use offsets
379 0,1024,2048 & 3072 in this page as for our segment indexes.
380 On z/Architecture our page indexes are now 2k in size
381 ( bits 12-19 x 8 bytes per pte ) we do a similar trick
382 but only mess with 2 segment indices each time we mess with
383 a PMD.
384
385 3) As z/Architecture supports up to a massive 5-level page table lookup we
386 can only use 3 currently on Linux ( as this is all the generic kernel
387 currently supports ) however this may change in future
388 this allows us to access ( according to my sums )
389 4TB of virtual storage per process i.e.
390 4096*512(PTES)*1024(PMDS)*2048(PGD) = 4398046511104 bytes,
391 enough for another 2 or 3 of years I think :-).
392 to do this we use a region-third-table designation type in
393 our address space control registers.
394
395
396The Linux for s/390 & z/Architecture Kernel Task Structure
397==========================================================
398Each process/thread under Linux for S390 has its own kernel task_struct
399defined in linux/include/linux/sched.h
400The S390 on initialisation & resuming of a process on a cpu sets
401the __LC_KERNEL_STACK variable in the spare prefix area for this cpu
402(which we use for per-processor globals).
403
404The kernel stack pointer is intimately tied with the task structure for
405each processor as follows::
406
407 s/390
408 ************************
409 * 1 page kernel stack *
410 * ( 4K ) *
411 ************************
412 * 1 page task_struct *
413 * ( 4K ) *
414 8K aligned ************************
415
416 z/Architecture
417 ************************
418 * 2 page kernel stack *
419 * ( 8K ) *
420 ************************
421 * 2 page task_struct *
422 * ( 8K ) *
423 16K aligned ************************
424
425What this means is that we don't need to dedicate any register or global
426variable to point to the current running process & can retrieve it with the
427following very simple construct for s/390 & one very similar for
428z/Architecture::
429
430 static inline struct task_struct * get_current(void)
431 {
432 struct task_struct *current;
433 __asm__("lhi %0,-8192\n\t"
434 "nr %0,15"
435 : "=r" (current) );
436 return current;
437 }
438
439i.e. just anding the current kernel stack pointer with the mask -8192.
440Thankfully because Linux doesn't have support for nested IO interrupts
441& our devices have large buffers can survive interrupts being shut for
442short amounts of time we don't need a separate stack for interrupts.
443
444
445
446
447Register Usage & Stackframes on Linux for s/390 & z/Architecture
448=================================================================
449Overview:
450---------
451This is the code that gcc produces at the top & the bottom of
452each function. It usually is fairly consistent & similar from
453function to function & if you know its layout you can probably
454make some headway in finding the ultimate cause of a problem
455after a crash without a source level debugger.
456
457Note: To follow stackframes requires a knowledge of C or Pascal &
458limited knowledge of one assembly language.
459
460It should be noted that there are some differences between the
461s/390 and z/Architecture stack layouts as the z/Architecture stack layout
462didn't have to maintain compatibility with older linkage formats.
463
464Glossary:
465---------
466alloca:
467 This is a built in compiler function for runtime allocation
468 of extra space on the callers stack which is obviously freed
469 up on function exit ( e.g. the caller may choose to allocate nothing
470 of a buffer of 4k if required for temporary purposes ), it generates
471 very efficient code ( a few cycles ) when compared to alternatives
472 like malloc.
473
474automatics:
475 These are local variables on the stack, i.e they aren't in registers &
476 they aren't static.
477
478back-chain:
479 This is a pointer to the stack pointer before entering a
480 framed functions ( see frameless function ) prologue got by
481 dereferencing the address of the current stack pointer,
482 i.e. got by accessing the 32 bit value at the stack pointers
483 current location.
484
485base-pointer:
486 This is a pointer to the back of the literal pool which
487 is an area just behind each procedure used to store constants
488 in each function.
489
490call-clobbered:
491 The caller probably needs to save these registers if there
492 is something of value in them, on the stack or elsewhere before making a
493 call to another procedure so that it can restore it later.
494
495epilogue:
496 The code generated by the compiler to return to the caller.
497
498frameless-function:
499 A frameless function in Linux for s390 & z/Architecture is one which doesn't
500 need more than the register save area (96 bytes on s/390, 160 on z/Architecture)
501 given to it by the caller.
502
503 A frameless function never:
504
505 1) Sets up a back chain.
506 2) Calls alloca.
507 3) Calls other normal functions
508 4) Has automatics.
509
510GOT-pointer:
511 This is a pointer to the global-offset-table in ELF
512 ( Executable Linkable Format, Linux'es most common executable format ),
513 all globals & shared library objects are found using this pointer.
514
515lazy-binding
516 ELF shared libraries are typically only loaded when routines in the shared
517 library are actually first called at runtime. This is lazy binding.
518
519procedure-linkage-table
520 This is a table found from the GOT which contains pointers to routines
521 in other shared libraries which can't be called to by easier means.
522
523prologue:
524 The code generated by the compiler to set up the stack frame.
525
526outgoing-args:
527 This is extra area allocated on the stack of the calling function if the
528 parameters for the callee's cannot all be put in registers, the same
529 area can be reused by each function the caller calls.
530
531routine-descriptor:
532 A COFF executable format based concept of a procedure reference
533 actually being 8 bytes or more as opposed to a simple pointer to the routine.
534 This is typically defined as follows:
535
536 - Routine Descriptor offset 0=Pointer to Function
537 - Routine Descriptor offset 4=Pointer to Table of Contents
538
539 The table of contents/TOC is roughly equivalent to a GOT pointer.
540 & it means that shared libraries etc. can be shared between several
541 environments each with their own TOC.
542
543static-chain:
544 This is used in nested functions a concept adopted from pascal
545 by gcc not used in ansi C or C++ ( although quite useful ), basically it
546 is a pointer used to reference local variables of enclosing functions.
547 You might come across this stuff once or twice in your lifetime.
548
549 e.g.
550
551 The function below should return 11 though gcc may get upset & toss warnings
552 about unused variables::
553
554 int FunctionA(int a)
555 {
556 int b;
557 FunctionC(int c)
558 {
559 b=c+1;
560 }
561 FunctionC(10);
562 return(b);
563 }
564
565
566s/390 & z/Architecture Register usage
567=====================================
568
569======== ========================================== ===============
570r0 used by syscalls/assembly call-clobbered
571r1 used by syscalls/assembly call-clobbered
572r2 argument 0 / return value 0 call-clobbered
573r3 argument 1 / return value 1 (if long long) call-clobbered
574r4 argument 2 call-clobbered
575r5 argument 3 call-clobbered
576r6 argument 4 saved
577r7 pointer-to arguments 5 to ... saved
578r8 this & that saved
579r9 this & that saved
580r10 static-chain ( if nested function ) saved
581r11 frame-pointer ( if function used alloca ) saved
582r12 got-pointer saved
583r13 base-pointer saved
584r14 return-address saved
585r15 stack-pointer saved
586
587f0 argument 0 / return value ( float/double ) call-clobbered
588f2 argument 1 call-clobbered
589f4 z/Architecture argument 2 saved
590f6 z/Architecture argument 3 saved
591======== ========================================== ===============
592
593The remaining floating points
594f1,f3,f5 f7-f15 are call-clobbered.
595
596Notes:
597------
5981) The only requirement is that registers which are used
599 by the callee are saved, e.g. the compiler is perfectly
600 capable of using r11 for purposes other than a frame a
601 frame pointer if a frame pointer is not needed.
6022) In functions with variable arguments e.g. printf the calling procedure
603 is identical to one without variable arguments & the same number of
604 parameters. However, the prologue of this function is somewhat more
605 hairy owing to it having to move these parameters to the stack to
606 get va_start, va_arg & va_end to work.
6073) Access registers are currently unused by gcc but are used in
608 the kernel. Possibilities exist to use them at the moment for
609 temporary storage but it isn't recommended.
6104) Only 4 of the floating point registers are used for
611 parameter passing as older machines such as G3 only have only 4
612 & it keeps the stack frame compatible with other compilers.
613 However with IEEE floating point emulation under linux on the
614 older machines you are free to use the other 12.
6155) A long long or double parameter cannot be have the
616 first 4 bytes in a register & the second four bytes in the
617 outgoing args area. It must be purely in the outgoing args
618 area if crossing this boundary.
6196) Floating point parameters are mixed with outgoing args
620 on the outgoing args area in the order the are passed in as parameters.
6217) Floating point arguments 2 & 3 are saved in the outgoing args area for
622 z/Architecture
623
624
625Stack Frame Layout
626------------------
627
628========= ============== ======================================================
629s/390 z/Architecture
630========= ============== ======================================================
6310 0 back chain ( a 0 here signifies end of back chain )
6324 8 eos ( end of stack, not used on Linux for S390 used
633 in other linkage formats )
6348 16 glue used in other s/390 linkage formats for saved
635 routine descriptors etc.
63612 24 glue used in other s/390 linkage formats for saved
637 routine descriptors etc.
63816 32 scratch area
63920 40 scratch area
64024 48 saved r6 of caller function
64128 56 saved r7 of caller function
64232 64 saved r8 of caller function
64336 72 saved r9 of caller function
64440 80 saved r10 of caller function
64544 88 saved r11 of caller function
64648 96 saved r12 of caller function
64752 104 saved r13 of caller function
64856 112 saved r14 of caller function
64960 120 saved r15 of caller function
65064 128 saved f4 of caller function
65172 132 saved f6 of caller function
65280 undefined
65396 160 outgoing args passed from caller to callee
65496+x 160+x possible stack alignment ( 8 bytes desirable )
65596+x+y 160+x+y alloca space of caller ( if used )
65696+x+y+z 160+x+y+z automatics of caller ( if used )
6570 back-chain
658========= ============== ======================================================
659
660A sample program with comments.
661===============================
662
663Comments on the function test
664-----------------------------
6651) It didn't need to set up a pointer to the constant pool gpr13 as it is not
666 used ( :-( ).
6672) This is a frameless function & no stack is bought.
6683) The compiler was clever enough to recognise that it could return the
669 value in r2 as well as use it for the passed in parameter ( :-) ).
6704) The basr ( branch relative & save ) trick works as follows the instruction
671 has a special case with r0,r0 with some instruction operands is understood as
672 the literal value 0, some risc architectures also do this ). So now
673 we are branching to the next address & the address new program counter is
674 in r13,so now we subtract the size of the function prologue we have executed
675 the size of the literal pool to get to the top of the literal pool::
676
677
678 0040037c int test(int b)
679 { # Function prologue below
680 40037c: 90 de f0 34 stm %r13,%r14,52(%r15) # Save registers r13 & r14
681 400380: 0d d0 basr %r13,%r0 # Set up pointer to constant pool using
682 400382: a7 da ff fa ahi %r13,-6 # basr trick
683 return(5+b);
684 # Huge main program
685 400386: a7 2a 00 05 ahi %r2,5 # add 5 to r2
686
687 # Function epilogue below
688 40038a: 98 de f0 34 lm %r13,%r14,52(%r15) # restore registers r13 & 14
689 40038e: 07 fe br %r14 # return
690 }
691
692Comments on the function main
693-----------------------------
6941) The compiler did this function optimally ( 8-) )::
695
696 Literal pool for main.
697 400390: ff ff ff ec .long 0xffffffec
698 main(int argc,char *argv[])
699 { # Function prologue below
700 400394: 90 bf f0 2c stm %r11,%r15,44(%r15) # Save necessary registers
701 400398: 18 0f lr %r0,%r15 # copy stack pointer to r0
702 40039a: a7 fa ff a0 ahi %r15,-96 # Make area for callee saving
703 40039e: 0d d0 basr %r13,%r0 # Set up r13 to point to
704 4003a0: a7 da ff f0 ahi %r13,-16 # literal pool
705 4003a4: 50 00 f0 00 st %r0,0(%r15) # Save backchain
706
707 return(test(5)); # Main Program Below
708 4003a8: 58 e0 d0 00 l %r14,0(%r13) # load relative address of test from
709 # literal pool
710 4003ac: a7 28 00 05 lhi %r2,5 # Set first parameter to 5
711 4003b0: 4d ee d0 00 bas %r14,0(%r14,%r13) # jump to test setting r14 as return
712 # address using branch & save instruction.
713
714 # Function Epilogue below
715 4003b4: 98 bf f0 8c lm %r11,%r15,140(%r15)# Restore necessary registers.
716 4003b8: 07 fe br %r14 # return to do program exit
717 }
718
719
720Compiler updates
721----------------
722
723::
724
725 main(int argc,char *argv[])
726 {
727 4004fc: 90 7f f0 1c stm %r7,%r15,28(%r15)
728 400500: a7 d5 00 04 bras %r13,400508 <main+0xc>
729 400504: 00 40 04 f4 .long 0x004004f4
730 # compiler now puts constant pool in code to so it saves an instruction
731 400508: 18 0f lr %r0,%r15
732 40050a: a7 fa ff a0 ahi %r15,-96
733 40050e: 50 00 f0 00 st %r0,0(%r15)
734 return(test(5));
735 400512: 58 10 d0 00 l %r1,0(%r13)
736 400516: a7 28 00 05 lhi %r2,5
737 40051a: 0d e1 basr %r14,%r1
738 # compiler adds 1 extra instruction to epilogue this is done to
739 # avoid processor pipeline stalls owing to data dependencies on g5 &
740 # above as register 14 in the old code was needed directly after being loaded
741 # by the lm %r11,%r15,140(%r15) for the br %14.
742 40051c: 58 40 f0 98 l %r4,152(%r15)
743 400520: 98 7f f0 7c lm %r7,%r15,124(%r15)
744 400524: 07 f4 br %r4
745 }
746
747
748Hartmut ( our compiler developer ) also has been threatening to take out the
749stack backchain in optimised code as this also causes pipeline stalls, you
750have been warned.
751
75264 bit z/Architecture code disassembly
753--------------------------------------
754
755If you understand the stuff above you'll understand the stuff
756below too so I'll avoid repeating myself & just say that
757some of the instructions have g's on the end of them to indicate
758they are 64 bit & the stack offsets are a bigger,
759the only other difference you'll find between 32 & 64 bit is that
760we now use f4 & f6 for floating point arguments on 64 bit::
761
762 00000000800005b0 <test>:
763 int test(int b)
764 {
765 return(5+b);
766 800005b0: a7 2a 00 05 ahi %r2,5
767 800005b4: b9 14 00 22 lgfr %r2,%r2 # downcast to integer
768 800005b8: 07 fe br %r14
769 800005ba: 07 07 bcr 0,%r7
770
771
772 }
773
774 00000000800005bc <main>:
775 main(int argc,char *argv[])
776 {
777 800005bc: eb bf f0 58 00 24 stmg %r11,%r15,88(%r15)
778 800005c2: b9 04 00 1f lgr %r1,%r15
779 800005c6: a7 fb ff 60 aghi %r15,-160
780 800005ca: e3 10 f0 00 00 24 stg %r1,0(%r15)
781 return(test(5));
782 800005d0: a7 29 00 05 lghi %r2,5
783 # brasl allows jumps > 64k & is overkill here bras would do fune
784 800005d4: c0 e5 ff ff ff ee brasl %r14,800005b0 <test>
785 800005da: e3 40 f1 10 00 04 lg %r4,272(%r15)
786 800005e0: eb bf f0 f8 00 04 lmg %r11,%r15,248(%r15)
787 800005e6: 07 f4 br %r4
788 }
789
790
791
792Compiling programs for debugging on Linux for s/390 & z/Architecture
793====================================================================
794-gdwarf-2 now works it should be considered the default debugging
795format for s/390 & z/Architecture as it is more reliable for debugging
796shared libraries, normal -g debugging works much better now
797Thanks to the IBM java compiler developers bug reports.
798
799This is typically done adding/appending the flags -g or -gdwarf-2 to the
800CFLAGS & LDFLAGS variables Makefile of the program concerned.
801
802If using gdb & you would like accurate displays of registers &
803stack traces compile without optimisation i.e make sure
804that there is no -O2 or similar on the CFLAGS line of the Makefile &
805the emitted gcc commands, obviously this will produce worse code
806( not advisable for shipment ) but it is an aid to the debugging process.
807
808This aids debugging because the compiler will copy parameters passed in
809in registers onto the stack so backtracing & looking at passed in
810parameters will work, however some larger programs which use inline functions
811will not compile without optimisation.
812
813Debugging with optimisation has since much improved after fixing
814some bugs, please make sure you are using gdb-5.0 or later developed
815after Nov'2000.
816
817
818
819Debugging under VM
820==================
821
822Notes
823-----
824Addresses & values in the VM debugger are always hex never decimal
825Address ranges are of the format <HexValue1>-<HexValue2> or
826<HexValue1>.<HexValue2>
827For example, the address range 0x2000 to 0x3000 can be described as 2000-3000
828or 2000.1000
829
830The VM Debugger is case insensitive.
831
832VM's strengths are usually other debuggers weaknesses you can get at any
833resource no matter how sensitive e.g. memory management resources, change
834address translation in the PSW. For kernel hacking you will reap dividends if
835you get good at it.
836
837The VM Debugger displays operators but not operands, and also the debugger
838displays useful information on the same line as the author of the code probably
839felt that it was a good idea not to go over the 80 columns on the screen.
840This isn't as unintuitive as it may seem as the s/390 instructions are easy to
841decode mentally and you can make a good guess at a lot of them as all the
842operands are nibble (half byte aligned).
843So if you have an objdump listing by hand, it is quite easy to follow, and if
844you don't have an objdump listing keep a copy of the s/390 Reference Summary
845or alternatively the s/390 principles of operation next to you.
846e.g. even I can guess that
8470001AFF8' LR 180F CC 0
848is a ( load register ) lr r0,r15
849
850Also it is very easy to tell the length of a 390 instruction from the 2 most
851significant bits in the instruction (not that this info is really useful except
852if you are trying to make sense of a hexdump of code).
853Here is a table
854
855======================= ==================
856Bits Instruction Length
857======================= ==================
85800 2 Bytes
85901 4 Bytes
86010 4 Bytes
86111 6 Bytes
862======================= ==================
863
864The debugger also displays other useful info on the same line such as the
865addresses being operated on destination addresses of branches & condition codes.
866e.g.::
867
868 00019736' AHI A7DAFF0E CC 1
869 000198BA' BRC A7840004 -> 000198C2' CC 0
870 000198CE' STM 900EF068 >> 0FA95E78 CC 2
871
872
873
874Useful VM debugger commands
875---------------------------
876
877I suppose I'd better mention this before I start
878to list the current active traces do::
879
880 Q TR
881
882there can be a maximum of 255 of these per set
883( more about trace sets later ).
884
885To stop traces issue a::
886
887 TR END.
888
889To delete a particular breakpoint issue::
890
891 TR DEL <breakpoint number>
892
893The PA1 key drops to CP mode so you can issue debugger commands,
894Doing alt c (on my 3270 console at least ) clears the screen.
895
896hitting b <enter> comes back to the running operating system
897from cp mode ( in our case linux ).
898
899It is typically useful to add shortcuts to your profile.exec file
900if you have one ( this is roughly equivalent to autoexec.bat in DOS ).
901file here are a few from mine::
902
903 /* this gives me command history on issuing f12 */
904 set pf12 retrieve
905 /* this continues */
906 set pf8 imm b
907 /* goes to trace set a */
908 set pf1 imm tr goto a
909 /* goes to trace set b */
910 set pf2 imm tr goto b
911 /* goes to trace set c */
912 set pf3 imm tr goto c
913
914
915
916Instruction Tracing
917-------------------
918Setting a simple breakpoint::
919
920 TR I PSWA <address>
921
922To debug a particular function try::
923
924 TR I R <function address range>
925 TR I on its own will single step.
926 TR I DATA <MNEMONIC> <OPTIONAL RANGE> will trace for particular mnemonics
927
928e.g.::
929
930 TR I DATA 4D R 0197BC.4000
931
932will trace for BAS'es ( opcode 4D ) in the range 0197BC.4000
933
934if you were inclined you could add traces for all branch instructions &
935suffix them with the run prefix so you would have a backtrace on screen
936when a program crashes::
937
938 TR BR <INTO OR FROM> will trace branches into or out of an address.
939
940e.g.::
941
942 TR BR INTO 0
943
944is often quite useful if a program is getting awkward & deciding
945to branch to 0 & crashing as this will stop at the address before in jumps to 0.
946
947::
948
949 TR I R <address range> RUN cmd d g
950
951single steps a range of addresses but stays running &
952displays the gprs on each step.
953
954
955
956Displaying & modifying Registers
957--------------------------------
958D G
959 will display all the gprs
960
961Adding a extra G to all the commands is necessary to access the full 64 bit
962content in VM on z/Architecture. Obviously this isn't required for access
963registers as these are still 32 bit.
964
965e.g.
966
967DGG
968 instead of DG
969
970D X
971 will display all the control registers
972D AR
973 will display all the access registers
974D AR4-7
975 will display access registers 4 to 7
976CPU ALL D G
977 will display the GRPS of all CPUS in the configuration
978D PSW
979 will display the current PSW
980st PSW 2000
981 will put the value 2000 into the PSW & cause crash your machine.
982D PREFIX
983 displays the prefix offset
984
985
986Displaying Memory
987-----------------
988To display memory mapped using the current PSW's mapping try::
989
990 D <range>
991
992To make VM display a message each time it hits a particular address and
993continue try:
994
995D I<range>
996 will disassemble/display a range of instructions.
997
998ST addr 32 bit word
999 will store a 32 bit aligned address
1000D T<range>
1001 will display the EBCDIC in an address (if you are that way inclined)
1002D R<range>
1003 will display real addresses ( without DAT ) but with prefixing.
1004
1005There are other complex options to display if you need to get at say home space
1006but are in primary space the easiest thing to do is to temporarily
1007modify the PSW to the other addressing mode, display the stuff & then
1008restore it.
1009
1010
1011
1012Hints
1013-----
1014If you want to issue a debugger command without halting your virtual machine
1015with the PA1 key try prefixing the command with #CP e.g.::
1016
1017 #cp tr i pswa 2000
1018
1019also suffixing most debugger commands with RUN will cause them not
1020to stop just display the mnemonic at the current instruction on the console.
1021
1022If you have several breakpoints you want to put into your program &
1023you get fed up of cross referencing with System.map
1024you can do the following trick for several symbols.
1025
1026::
1027
1028 grep do_signal System.map
1029
1030which emits the following among other things::
1031
1032 0001f4e0 T do_signal
1033
1034now you can do::
1035
1036 TR I PSWA 0001f4e0 cmd msg * do_signal
1037
1038This sends a message to your own console each time do_signal is entered.
1039( As an aside I wrote a perl script once which automatically generated a REXX
1040script with breakpoints on every kernel procedure, this isn't a good idea
1041because there are thousands of these routines & VM can only set 255 breakpoints
1042at a time so you nearly had to spend as long pruning the file down as you would
1043entering the msgs by hand), however, the trick might be useful for a single
1044object file. In the 3270 terminal emulator x3270 there is a very useful option
1045in the file menu called "Save Screen In File" - this is very good for keeping a
1046copy of traces.
1047
1048From CMS help <command name> will give you online help on a particular command.
1049e.g.::
1050
1051 HELP DISPLAY
1052
1053Also CP has a file called profile.exec which automatically gets called
1054on startup of CMS ( like autoexec.bat ), keeping on a DOS analogy session
1055CP has a feature similar to doskey, it may be useful for you to
1056use profile.exec to define some keystrokes.
1057
1058SET PF9 IMM B
1059 This does a single step in VM on pressing F8.
1060
1061SET PF10 ^
1062 This sets up the ^ key.
1063 which can be used for ^c (ctrl-c),^z (ctrl-z) which can't be typed
1064 directly into some 3270 consoles.
1065
1066SET PF11 ^-
1067 This types the starting keystrokes for a sysrq see SysRq below.
1068SET PF12 RETRIEVE
1069 This retrieves command history on pressing F12.
1070
1071
1072Sometimes in VM the display is set up to scroll automatically this
1073can be very annoying if there are messages you wish to look at
1074to stop this do
1075
1076TERM MORE 255 255
1077 This will nearly stop automatic screen updates, however it will
1078 cause a denial of service if lots of messages go to the 3270 console,
1079 so it would be foolish to use this as the default on a production machine.
1080
1081
1082Tracing particular processes
1083----------------------------
1084The kernel's text segment is intentionally at an address in memory that it will
1085very seldom collide with text segments of user programs ( thanks Martin ),
1086this simplifies debugging the kernel.
1087However it is quite common for user processes to have addresses which collide
1088this can make debugging a particular process under VM painful under normal
1089circumstances as the process may change when doing a::
1090
1091 TR I R <address range>.
1092
1093Thankfully after reading VM's online help I figured out how to debug
1094I particular process.
1095
1096Your first problem is to find the STD ( segment table designation )
1097of the program you wish to debug.
1098There are several ways you can do this here are a few
1099
1100Run::
1101
1102 objdump --syms <program to be debugged> | grep main
1103
1104To get the address of main in the program. Then::
1105
1106 tr i pswa <address of main>
1107
1108Start the program, if VM drops to CP on what looks like the entry
1109point of the main function this is most likely the process you wish to debug.
1110Now do a D X13 or D XG13 on z/Architecture.
1111
1112On 31 bit the STD is bits 1-19 ( the STO segment table origin )
1113& 25-31 ( the STL segment table length ) of CR13.
1114
1115now type::
1116
1117 TR I R STD <CR13's value> 0.7fffffff
1118
1119e.g.::
1120
1121 TR I R STD 8F32E1FF 0.7fffffff
1122
1123Another very useful variation is::
1124
1125 TR STORE INTO STD <CR13's value> <address range>
1126
1127for finding out when a particular variable changes.
1128
1129An alternative way of finding the STD of a currently running process
1130is to do the following, ( this method is more complex but
1131could be quite convenient if you aren't updating the kernel much &
1132so your kernel structures will stay constant for a reasonable period of
1133time ).
1134
1135::
1136
1137 grep task /proc/<pid>/status
1138
1139from this you should see something like::
1140
1141 task: 0f160000 ksp: 0f161de8 pt_regs: 0f161f68
1142
1143This now gives you a pointer to the task structure.
1144
1145Now make::
1146
1147 CC:="s390-gcc -g" kernel/sched.s
1148
1149To get the task_struct stabinfo.
1150
1151( task_struct is defined in include/linux/sched.h ).
1152
1153Now we want to look at
1154task->active_mm->pgd
1155
1156on my machine the active_mm in the task structure stab is
1157active_mm:(4,12),672,32
1158
1159its offset is 672/8=84=0x54
1160
1161the pgd member in the mm_struct stab is
1162pgd:(4,6)=*(29,5),96,32
1163so its offset is 96/8=12=0xc
1164
1165so we'll::
1166
1167 hexdump -s 0xf160054 /dev/mem | more
1168
1169i.e. task_struct+active_mm offset
1170to look at the active_mm member::
1171
1172 f160054 0fee cc60 0019 e334 0000 0000 0000 0011
1173
1174::
1175
1176 hexdump -s 0x0feecc6c /dev/mem | more
1177
1178i.e. active_mm+pgd offset::
1179
1180 feecc6c 0f2c 0000 0000 0001 0000 0001 0000 0010
1181
1182we get something like
1183now do::
1184
1185 TR I R STD <pgd|0x7f> 0.7fffffff
1186
1187i.e. the 0x7f is added because the pgd only
1188gives the page table origin & we need to set the low bits
1189to the maximum possible segment table length.
1190
1191::
1192
1193 TR I R STD 0f2c007f 0.7fffffff
1194
1195on z/Architecture you'll probably need to do::
1196
1197 TR I R STD <pgd|0x7> 0.ffffffffffffffff
1198
1199to set the TableType to 0x1 & the Table length to 3.
1200
1201
1202
1203Tracing Program Exceptions
1204--------------------------
1205If you get a crash which says something like
1206illegal operation or specification exception followed by a register dump
1207You can restart linux & trace these using the tr prog <range or value> trace
1208option.
1209
1210
1211The most common ones you will normally be tracing for is:
1212
1213- 1=operation exception
1214- 2=privileged operation exception
1215- 4=protection exception
1216- 5=addressing exception
1217- 6=specification exception
1218- 10=segment translation exception
1219- 11=page translation exception
1220
1221The full list of these is on page 22 of the current s/390 Reference Summary.
1222e.g.
1223
1224tr prog 10 will trace segment translation exceptions.
1225
1226tr prog on its own will trace all program interruption codes.
1227
1228Trace Sets
1229----------
1230On starting VM you are initially in the INITIAL trace set.
1231You can do a Q TR to verify this.
1232If you have a complex tracing situation where you wish to wait for instance
1233till a driver is open before you start tracing IO, but know in your
1234heart that you are going to have to make several runs through the code till you
1235have a clue whats going on.
1236
1237What you can do is::
1238
1239 TR I PSWA <Driver open address>
1240
1241hit b to continue till breakpoint
1242
1243reach the breakpoint
1244
1245now do your::
1246
1247 TR GOTO B
1248 TR IO 7c08-7c09 inst int run
1249
1250or whatever the IO channels you wish to trace are & hit b
1251
1252To got back to the initial trace set do::
1253
1254 TR GOTO INITIAL
1255
1256& the TR I PSWA <Driver open address> will be the only active breakpoint again.
1257
1258
1259Tracing linux syscalls under VM
1260-------------------------------
1261Syscalls are implemented on Linux for S390 by the Supervisor call instruction
1262(SVC). There 256 possibilities of these as the instruction is made up of a 0xA
1263opcode and the second byte being the syscall number. They are traced using the
1264simple command::
1265
1266 TR SVC <Optional value or range>
1267
1268the syscalls are defined in linux/arch/s390/include/asm/unistd.h
1269e.g. to trace all file opens just do::
1270
1271 TR SVC 5 ( as this is the syscall number of open )
1272
1273
1274SMP Specific commands
1275---------------------
1276To find out how many cpus you have
1277Q CPUS displays all the CPU's available to your virtual machine
1278To find the cpu that the current cpu VM debugger commands are being directed at
1279do Q CPU to change the current cpu VM debugger commands are being directed at
1280do::
1281
1282 CPU <desired cpu no>
1283
1284On a SMP guest issue a command to all CPUs try prefixing the command with cpu
1285all. To issue a command to a particular cpu try cpu <cpu number> e.g.::
1286
1287 CPU 01 TR I R 2000.3000
1288
1289If you are running on a guest with several cpus & you have a IO related problem
1290& cannot follow the flow of code but you know it isn't smp related.
1291
1292from the bash prompt issue::
1293
1294 shutdown -h now or halt.
1295
1296do a::
1297
1298 Q CPUS
1299
1300to find out how many cpus you have detach each one of them from cp except
1301cpu 0 by issuing a::
1302
1303 DETACH CPU 01-(number of cpus in configuration)
1304
1305& boot linux again.
1306
1307TR SIGP
1308 will trace inter processor signal processor instructions.
1309
1310DEFINE CPU 01-(number in configuration)
1311 will get your guests cpus back.
1312
1313
1314Help for displaying ascii textstrings
1315-------------------------------------
1316On the very latest VM Nucleus'es VM can now display ascii
1317( thanks Neale for the hint ) by doing::
1318
1319 D TX<lowaddr>.<len>
1320
1321e.g.::
1322
1323 D TX0.100
1324
1325Alternatively
1326=============
1327Under older VM debuggers (I love EBDIC too) you can use following little
1328program which converts a command line of hex digits to ascii text. It can be
1329compiled under linux and you can copy the hex digits from your x3270 terminal
1330to your xterm if you are debugging from a linuxbox.
1331
1332This is quite useful when looking at a parameter passed in as a text string
1333under VM ( unless you are good at decoding ASCII in your head ).
1334
1335e.g. consider tracing an open syscall::
1336
1337 TR SVC 5
1338
1339We have stopped at a breakpoint::
1340
1341 000151B0' SVC 0A05 -> 0001909A' CC 0
1342
1343D 20.8 to check the SVC old psw in the prefix area and see was it from userspace
1344(for the layout of the prefix area consult the "Fixed Storage Locations"
1345chapter of the s/390 Reference Summary if you have it available).
1346
1347::
1348
1349 V00000020 070C2000 800151B2
1350
1351The problem state bit wasn't set & it's also too early in the boot sequence
1352for it to be a userspace SVC if it was we would have to temporarily switch the
1353psw to user space addressing so we could get at the first parameter of the open
1354in gpr2.
1355
1356Next do a::
1357
1358 D G2
1359 GPR 2 = 00014CB4
1360
1361Now display what gpr2 is pointing to::
1362
1363 D 00014CB4.20
1364 V00014CB4 2F646576 2F636F6E 736F6C65 00001BF5
1365 V00014CC4 FC00014C B4001001 E0001000 B8070707
1366
1367Now copy the text till the first 00 hex ( which is the end of the string
1368to an xterm & do hex2ascii on it::
1369
1370 hex2ascii 2F646576 2F636F6E 736F6C65 00
1371
1372outputs::
1373
1374 Decoded Hex:=/ d e v / c o n s o l e 0x00
1375
1376We were opening the console device,
1377
1378You can compile the code below yourself for practice :-),
1379
1380::
1381
1382 /*
1383 * hex2ascii.c
1384 * a useful little tool for converting a hexadecimal command line to ascii
1385 *
1386 * Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
1387 * (C) 2000 IBM Deutschland Entwicklung GmbH, IBM Corporation.
1388 */
1389 #include <stdio.h>
1390
1391 int main(int argc,char *argv[])
1392 {
1393 int cnt1,cnt2,len,toggle=0;
1394 int startcnt=1;
1395 unsigned char c,hex;
1396
1397 if(argc>1&&(strcmp(argv[1],"-a")==0))
1398 startcnt=2;
1399 printf("Decoded Hex:=");
1400 for(cnt1=startcnt;cnt1<argc;cnt1++)
1401 {
1402 len=strlen(argv[cnt1]);
1403 for(cnt2=0;cnt2<len;cnt2++)
1404 {
1405 c=argv[cnt1][cnt2];
1406 if(c>='0'&&c<='9')
1407 c=c-'0';
1408 if(c>='A'&&c<='F')
1409 c=c-'A'+10;
1410 if(c>='a'&&c<='f')
1411 c=c-'a'+10;
1412 switch(toggle)
1413 {
1414 case 0:
1415 hex=c<<4;
1416 toggle=1;
1417 break;
1418 case 1:
1419 hex+=c;
1420 if(hex<32||hex>127)
1421 {
1422 if(startcnt==1)
1423 printf("0x%02X ",(int)hex);
1424 else
1425 printf(".");
1426 }
1427 else
1428 {
1429 printf("%c",hex);
1430 if(startcnt==1)
1431 printf(" ");
1432 }
1433 toggle=0;
1434 break;
1435 }
1436 }
1437 }
1438 printf("\n");
1439 }
1440
1441
1442
1443
1444Stack tracing under VM
1445----------------------
1446A basic backtrace
1447-----------------
1448
1449Here are the tricks I use 9 out of 10 times it works pretty well,
1450
1451When your backchain reaches a dead end
1452--------------------------------------
1453This can happen when an exception happens in the kernel and the kernel is
1454entered twice. If you reach the NULL pointer at the end of the back chain you
1455should be able to sniff further back if you follow the following tricks.
14561) A kernel address should be easy to recognise since it is in
1457primary space & the problem state bit isn't set & also
1458The Hi bit of the address is set.
14592) Another backchain should also be easy to recognise since it is an
1460address pointing to another address approximately 100 bytes or 0x70 hex
1461behind the current stackpointer.
1462
1463
1464Here is some practice.
1465
1466boot the kernel & hit PA1 at some random time
1467
1468d g to display the gprs, this should display something like::
1469
1470 GPR 0 = 00000001 00156018 0014359C 00000000
1471 GPR 4 = 00000001 001B8888 000003E0 00000000
1472 GPR 8 = 00100080 00100084 00000000 000FE000
1473 GPR 12 = 00010400 8001B2DC 8001B36A 000FFED8
1474
1475Note that GPR14 is a return address but as we are real men we are going to
1476trace the stack.
1477display 0x40 bytes after the stack pointer::
1478
1479 V000FFED8 000FFF38 8001B838 80014C8E 000FFF38
1480 V000FFEE8 00000000 00000000 000003E0 00000000
1481 V000FFEF8 00100080 00100084 00000000 000FE000
1482 V000FFF08 00010400 8001B2DC 8001B36A 000FFED8
1483
1484
1485Ah now look at whats in sp+56 (sp+0x38) this is 8001B36A our saved r14 if
1486you look above at our stackframe & also agrees with GPR14.
1487
1488now backchain::
1489
1490 d 000FFF38.40
1491
1492we now are taking the contents of SP to get our first backchain::
1493
1494 V000FFF38 000FFFA0 00000000 00014995 00147094
1495 V000FFF48 00147090 001470A0 000003E0 00000000
1496 V000FFF58 00100080 00100084 00000000 001BF1D0
1497 V000FFF68 00010400 800149BA 80014CA6 000FFF38
1498
1499This displays a 2nd return address of 80014CA6
1500
1501now do::
1502
1503 d 000FFFA0.40
1504
1505for our 3rd backchain::
1506
1507 V000FFFA0 04B52002 0001107F 00000000 00000000
1508 V000FFFB0 00000000 00000000 FF000000 0001107F
1509 V000FFFC0 00000000 00000000 00000000 00000000
1510 V000FFFD0 00010400 80010802 8001085A 000FFFA0
1511
1512
1513our 3rd return address is 8001085A
1514
1515as the 04B52002 looks suspiciously like rubbish it is fair to assume that the
1516kernel entry routines for the sake of optimisation don't set up a backchain.
1517
1518now look at System.map to see if the addresses make any sense::
1519
1520 grep -i 0001b3 System.map
1521
1522outputs among other things::
1523
1524 0001b304 T cpu_idle
1525
1526so 8001B36A
1527is cpu_idle+0x66 ( quiet the cpu is asleep, don't wake it )
1528
1529::
1530
1531 grep -i 00014 System.map
1532
1533produces among other things::
1534
1535 00014a78 T start_kernel
1536
1537so 0014CA6 is start_kernel+some hex number I can't add in my head.
1538
1539::
1540
1541 grep -i 00108 System.map
1542
1543this produces::
1544
1545 00010800 T _stext
1546
1547so 8001085A is _stext+0x5a
1548
1549Congrats you've done your first backchain.
1550
1551
1552
1553s/390 & z/Architecture IO Overview
1554==================================
1555
1556I am not going to give a course in 390 IO architecture as this would take me
1557quite a while and I'm no expert. Instead I'll give a 390 IO architecture
1558summary for Dummies. If you have the s/390 principles of operation available
1559read this instead. If nothing else you may find a few useful keywords in here
1560and be able to use them on a web search engine to find more useful information.
1561
1562Unlike other bus architectures modern 390 systems do their IO using mostly
1563fibre optics and devices such as tapes and disks can be shared between several
1564mainframes. Also S390 can support up to 65536 devices while a high end PC based
1565system might be choking with around 64.
1566
1567Here is some of the common IO terminology:
1568
1569Subchannel:
1570 This is the logical number most IO commands use to talk to an IO device. There
1571 can be up to 0x10000 (65536) of these in a configuration, typically there are a
1572 few hundred. Under VM for simplicity they are allocated contiguously, however
1573 on the native hardware they are not. They typically stay consistent between
1574 boots provided no new hardware is inserted or removed.
1575
1576 Under Linux for s390 we use these as IRQ's and also when issuing an IO command
1577 (CLEAR SUBCHANNEL, HALT SUBCHANNEL, MODIFY SUBCHANNEL, RESUME SUBCHANNEL,
1578 START SUBCHANNEL, STORE SUBCHANNEL and TEST SUBCHANNEL). We use this as the ID
1579 of the device we wish to talk to. The most important of these instructions are
1580 START SUBCHANNEL (to start IO), TEST SUBCHANNEL (to check whether the IO
1581 completed successfully) and HALT SUBCHANNEL (to kill IO). A subchannel can have
1582 up to 8 channel paths to a device, this offers redundancy if one is not
1583 available.
1584
1585Device Number:
1586 This number remains static and is closely tied to the hardware. There are 65536
1587 of these, made up of a CHPID (Channel Path ID, the most significant 8 bits) and
1588 another lsb 8 bits. These remain static even if more devices are inserted or
1589 removed from the hardware. There is a 1 to 1 mapping between subchannels and
1590 device numbers, provided devices aren't inserted or removed.
1591
1592Channel Control Words:
1593 CCWs are linked lists of instructions initially pointed to by an operation
1594 request block (ORB), which is initially given to Start Subchannel (SSCH)
1595 command along with the subchannel number for the IO subsystem to process
1596 while the CPU continues executing normal code.
1597 CCWs come in two flavours, Format 0 (24 bit for backward compatibility) and
1598 Format 1 (31 bit). These are typically used to issue read and write (and many
1599 other) instructions. They consist of a length field and an absolute address
1600 field.
1601
1602 Each IO typically gets 1 or 2 interrupts, one for channel end (primary status)
1603 when the channel is idle, and the second for device end (secondary status).
1604 Sometimes you get both concurrently. You check how the IO went on by issuing a
1605 TEST SUBCHANNEL at each interrupt, from which you receive an Interruption
1606 response block (IRB). If you get channel and device end status in the IRB
1607 without channel checks etc. your IO probably went okay. If you didn't you
1608 probably need to examine the IRB, extended status word etc.
1609 If an error occurs, more sophisticated control units have a facility known as
1610 concurrent sense. This means that if an error occurs Extended sense information
1611 will be presented in the Extended status word in the IRB. If not you have to
1612 issue a subsequent SENSE CCW command after the test subchannel.
1613
1614
1615TPI (Test pending interrupt) can also be used for polled IO, but in
1616multitasking multiprocessor systems it isn't recommended except for
1617checking special cases (i.e. non looping checks for pending IO etc.).
1618
1619Store Subchannel and Modify Subchannel can be used to examine and modify
1620operating characteristics of a subchannel (e.g. channel paths).
1621
1622Other IO related Terms:
1623
1624Sysplex:
1625 S390's Clustering Technology
1626QDIO:
1627 S390's new high speed IO architecture to support devices such as gigabit
1628 ethernet, this architecture is also designed to be forward compatible with
1629 upcoming 64 bit machines.
1630
1631
1632General Concepts
1633----------------
1634
1635Input Output Processors (IOP's) are responsible for communicating between
1636the mainframe CPU's & the channel & relieve the mainframe CPU's from the
1637burden of communicating with IO devices directly, this allows the CPU's to
1638concentrate on data processing.
1639
1640IOP's can use one or more links ( known as channel paths ) to talk to each
1641IO device. It first checks for path availability & chooses an available one,
1642then starts ( & sometimes terminates IO ).
1643There are two types of channel path: ESCON & the Parallel IO interface.
1644
1645IO devices are attached to control units, control units provide the
1646logic to interface the channel paths & channel path IO protocols to
1647the IO devices, they can be integrated with the devices or housed separately
1648& often talk to several similar devices ( typical examples would be raid
1649controllers or a control unit which connects to 1000 3270 terminals )::
1650
1651
1652 +---------------------------------------------------------------+
1653 | +-----+ +-----+ +-----+ +-----+ +----------+ +----------+ |
1654 | | CPU | | CPU | | CPU | | CPU | | Main | | Expanded | |
1655 | | | | | | | | | | Memory | | Storage | |
1656 | +-----+ +-----+ +-----+ +-----+ +----------+ +----------+ |
1657 |---------------------------------------------------------------+
1658 | IOP | IOP | IOP |
1659 |---------------------------------------------------------------
1660 | C | C | C | C | C | C | C | C | C | C | C | C | C | C | C | C |
1661 ----------------------------------------------------------------
1662 || ||
1663 || Bus & Tag Channel Path || ESCON
1664 || ====================== || Channel
1665 || || || || Path
1666 +----------+ +----------+ +----------+
1667 | | | | | |
1668 | CU | | CU | | CU |
1669 | | | | | |
1670 +----------+ +----------+ +----------+
1671 | | | | |
1672 +----------+ +----------+ +----------+ +----------+ +----------+
1673 |I/O Device| |I/O Device| |I/O Device| |I/O Device| |I/O Device|
1674 +----------+ +----------+ +----------+ +----------+ +----------+
1675 CPU = Central Processing Unit
1676 C = Channel
1677 IOP = IP Processor
1678 CU = Control Unit
1679
1680The 390 IO systems come in 2 flavours the current 390 machines support both
1681
1682The Older 360 & 370 Interface,sometimes called the Parallel I/O interface,
1683sometimes called Bus-and Tag & sometimes Original Equipment Manufacturers
1684Interface (OEMI).
1685
1686This byte wide Parallel channel path/bus has parity & data on the "Bus" cable
1687and control lines on the "Tag" cable. These can operate in byte multiplex mode
1688for sharing between several slow devices or burst mode and monopolize the
1689channel for the whole burst. Up to 256 devices can be addressed on one of these
1690cables. These cables are about one inch in diameter. The maximum unextended
1691length supported by these cables is 125 Meters but this can be extended up to
16922km with a fibre optic channel extended such as a 3044. The maximum burst speed
1693supported is 4.5 megabytes per second. However, some really old processors
1694support only transfer rates of 3.0, 2.0 & 1.0 MB/sec.
1695One of these paths can be daisy chained to up to 8 control units.
1696
1697
1698ESCON if fibre optic it is also called FICON
1699Was introduced by IBM in 1990. Has 2 fibre optic cables and uses either leds or
1700lasers for communication at a signaling rate of up to 200 megabits/sec. As
170110bits are transferred for every 8 bits info this drops to 160 megabits/sec
1702and to 18.6 Megabytes/sec once control info and CRC are added. ESCON only
1703operates in burst mode.
1704
1705ESCONs typical max cable length is 3km for the led version and 20km for the
1706laser version known as XDF (extended distance facility). This can be further
1707extended by using an ESCON director which triples the above mentioned ranges.
1708Unlike Bus & Tag as ESCON is serial it uses a packet switching architecture,
1709the standard Bus & Tag control protocol is however present within the packets.
1710Up to 256 devices can be attached to each control unit that uses one of these
1711interfaces.
1712
1713Common 390 Devices include:
1714Network adapters typically OSA2,3172's,2116's & OSA-E gigabit ethernet adapters,
1715Consoles 3270 & 3215 (a teletype emulated under linux for a line mode console).
1716DASD's direct access storage devices ( otherwise known as hard disks ).
1717Tape Drives.
1718CTC ( Channel to Channel Adapters ),
1719ESCON or Parallel Cables used as a very high speed serial link
1720between 2 machines.
1721
1722
1723Debugging IO on s/390 & z/Architecture under VM
1724===============================================
1725
1726Now we are ready to go on with IO tracing commands under VM
1727
1728A few self explanatory queries::
1729
1730 Q OSA
1731 Q CTC
1732 Q DISK ( This command is CMS specific )
1733 Q DASD
1734
1735Q OSA on my machine returns::
1736
1737 OSA 7C08 ON OSA 7C08 SUBCHANNEL = 0000
1738 OSA 7C09 ON OSA 7C09 SUBCHANNEL = 0001
1739 OSA 7C14 ON OSA 7C14 SUBCHANNEL = 0002
1740 OSA 7C15 ON OSA 7C15 SUBCHANNEL = 0003
1741
1742If you have a guest with certain privileges you may be able to see devices
1743which don't belong to you. To avoid this, add the option V.
1744e.g.::
1745
1746 Q V OSA
1747
1748Now using the device numbers returned by this command we will
1749Trace the io starting up on the first device 7c08 & 7c09
1750In our simplest case we can trace the
1751start subchannels
1752like TR SSCH 7C08-7C09
1753or the halt subchannels
1754or TR HSCH 7C08-7C09
1755MSCH's ,STSCH's I think you can guess the rest
1756
1757A good trick is tracing all the IO's and CCWS and spooling them into the reader
1758of another VM guest so he can ftp the logfile back to his own machine. I'll do
1759a small bit of this and give you a look at the output.
1760
17611) Spool stdout to VM reader::
1762
1763 SP PRT TO (another vm guest ) or * for the local vm guest
1764
17652) Fill the reader with the trace::
1766
1767 TR IO 7c08-7c09 INST INT CCW PRT RUN
1768
17693) Start up linux::
1770
1771 i 00c
17724) Finish the trace::
1773
1774 TR END
1775
17765) close the reader::
1777
1778 C PRT
1779
17806) list reader contents::
1781
1782 RDRLIST
1783
17847) copy it to linux4's minidisk::
1785
1786 RECEIVE / LOG TXT A1 ( replace
1787
17888)
1789filel & press F11 to look at it
1790You should see something like::
1791
1792 00020942' SSCH B2334000 0048813C CC 0 SCH 0000 DEV 7C08
1793 CPA 000FFDF0 PARM 00E2C9C4 KEY 0 FPI C0 LPM 80
1794 CCW 000FFDF0 E4200100 00487FE8 0000 E4240100 ........
1795 IDAL 43D8AFE8
1796 IDAL 0FB76000
1797 00020B0A' I/O DEV 7C08 -> 000197BC' SCH 0000 PARM 00E2C9C4
1798 00021628' TSCH B2354000 >> 00488164 CC 0 SCH 0000 DEV 7C08
1799 CCWA 000FFDF8 DEV STS 0C SCH STS 00 CNT 00EC
1800 KEY 0 FPI C0 CC 0 CTLS 4007
1801 00022238' STSCH B2344000 >> 00488108 CC 0 SCH 0000 DEV 7C08
1802
1803If you don't like messing up your readed ( because you possibly booted from it )
1804you can alternatively spool it to another readers guest.
1805
1806
1807Other common VM device related commands
1808---------------------------------------------
1809These commands are listed only because they have
1810been of use to me in the past & may be of use to
1811you too. For more complete info on each of the commands
1812use type HELP <command> from CMS.
1813
1814detaching devices::
1815
1816 DET <devno range>
1817 ATT <devno range> <guest>
1818
1819attach a device to guest * for your own guest
1820
1821READY <devno>
1822 cause VM to issue a fake interrupt.
1823
1824The VARY command is normally only available to VM administrators::
1825
1826 VARY ON PATH <path> TO <devno range>
1827 VARY OFF PATH <PATH> FROM <devno range>
1828
1829This is used to switch on or off channel paths to devices.
1830
1831Q CHPID <channel path ID>
1832 This displays state of devices using this channel path
1833
1834D SCHIB <subchannel>
1835 This displays the subchannel information SCHIB block for the device.
1836 this I believe is also only available to administrators.
1837
1838DEFINE CTC <devno>
1839 defines a virtual CTC channel to channel connection
1840 2 need to be defined on each guest for the CTC driver to use.
1841
1842COUPLE devno userid remote devno
1843 Joins a local virtual device to a remote virtual device
1844 ( commonly used for the CTC driver ).
1845
1846Building a VM ramdisk under CMS which linux can use::
1847
1848 def vfb-<blocksize> <subchannel> <number blocks>
1849
1850blocksize is commonly 4096 for linux.
1851
1852Formatting it::
1853
1854 format <subchannel> <driver letter e.g. x> (blksize <blocksize>
1855
1856Sharing a disk between multiple guests::
1857
1858 LINK userid devno1 devno2 mode password
1859
1860
1861
1862GDB on S390
1863===========
1864N.B. if compiling for debugging gdb works better without optimisation
1865( see Compiling programs for debugging )
1866
1867invocation
1868----------
1869gdb <victim program> <optional corefile>
1870
1871Online help
1872-----------
1873help: gives help on commands
1874
1875e.g.::
1876
1877 help
1878 help display
1879
1880Note gdb's online help is very good use it.
1881
1882
1883Assembly
1884--------
1885info registers:
1886 displays registers other than floating point.
1887
1888info all-registers:
1889 displays floating points as well.
1890
1891disassemble:
1892 disassembles
1893
1894e.g.::
1895
1896 disassemble without parameters will disassemble the current function
1897 disassemble $pc $pc+10
1898
1899Viewing & modifying variables
1900-----------------------------
1901print or p:
1902 displays variable or register
1903
1904e.g. p/x $sp will display the stack pointer
1905
1906display:
1907 prints variable or register each time program stops
1908
1909e.g.::
1910
1911 display/x $pc will display the program counter
1912 display argc
1913
1914undisplay:
1915 undo's display's
1916
1917info breakpoints:
1918 shows all current breakpoints
1919
1920info stack:
1921 shows stack back trace (if this doesn't work too well, I'll show
1922 you the stacktrace by hand below).
1923
1924info locals:
1925 displays local variables.
1926
1927info args:
1928 display current procedure arguments.
1929
1930set args:
1931 will set argc & argv each time the victim program is invoked
1932
1933e.g.::
1934
1935 set <variable>=value
1936 set argc=100
1937 set $pc=0
1938
1939
1940
1941Modifying execution
1942-------------------
1943step:
1944 steps n lines of sourcecode
1945
1946step
1947 steps 1 line.
1948
1949step 100
1950 steps 100 lines of code.
1951
1952next:
1953 like step except this will not step into subroutines
1954
1955stepi:
1956 steps a single machine code instruction.
1957
1958e.g.::
1959
1960 stepi 100
1961
1962nexti:
1963 steps a single machine code instruction but will not step into
1964 subroutines.
1965
1966finish:
1967 will run until exit of the current routine
1968
1969run:
1970 (re)starts a program
1971
1972cont:
1973 continues a program
1974
1975quit:
1976 exits gdb.
1977
1978
1979breakpoints
1980------------
1981
1982break
1983 sets a breakpoint
1984
1985e.g.::
1986
1987 break main
1988 break *$pc
1989 break *0x400618
1990
1991Here's a really useful one for large programs
1992
1993rbr
1994 Set a breakpoint for all functions matching REGEXP
1995
1996e.g.::
1997
1998 rbr 390
1999
2000will set a breakpoint with all functions with 390 in their name.
2001
2002info breakpoints
2003 lists all breakpoints
2004
2005delete:
2006 delete breakpoint by number or delete them all
2007
2008e.g.
2009
2010delete 1
2011 will delete the first breakpoint
2012
2013
2014delete
2015 will delete them all
2016
2017watch:
2018 This will set a watchpoint ( usually hardware assisted ),
2019
2020This will watch a variable till it changes
2021
2022e.g.
2023
2024watch cnt
2025 will watch the variable cnt till it changes.
2026
2027As an aside unfortunately gdb's, architecture independent watchpoint code
2028is inconsistent & not very good, watchpoints usually work but not always.
2029
2030info watchpoints:
2031 Display currently active watchpoints
2032
2033condition: ( another useful one )
2034 Specify breakpoint number N to break only if COND is true.
2035
2036Usage is `condition N COND`, where N is an integer and COND is an
2037expression to be evaluated whenever breakpoint N is reached.
2038
2039
2040
2041User defined functions/macros
2042-----------------------------
2043define: ( Note this is very very useful,simple & powerful )
2044
2045usage define <name> <list of commands> end
2046
2047examples which you should consider putting into .gdbinit in your home
2048directory::
2049
2050 define d
2051 stepi
2052 disassemble $pc $pc+10
2053 end
2054 define e
2055 nexti
2056 disassemble $pc $pc+10
2057 end
2058
2059
2060Other hard to classify stuff
2061----------------------------
2062signal n:
2063 sends the victim program a signal.
2064
2065e.g. `signal 3` will send a SIGQUIT.
2066
2067info signals:
2068 what gdb does when the victim receives certain signals.
2069
2070list:
2071
2072e.g.:
2073
2074list
2075 lists current function source
2076list 1,10
2077 list first 10 lines of current file.
2078
2079list test.c:1,10
2080
2081
2082directory:
2083 Adds directories to be searched for source if gdb cannot find the source.
2084 (note it is a bit sensitive about slashes)
2085
2086e.g. To add the root of the filesystem to the searchpath do::
2087
2088 directory //
2089
2090
2091call <function>
2092This calls a function in the victim program, this is pretty powerful
2093e.g.
2094(gdb) call printf("hello world")
2095outputs:
2096$1 = 11
2097
2098You might now be thinking that the line above didn't work, something extra had
2099to be done.
2100(gdb) call fflush(stdout)
2101hello world$2 = 0
2102As an aside the debugger also calls malloc & free under the hood
2103to make space for the "hello world" string.
2104
2105
2106
2107hints
2108-----
21091) command completion works just like bash
2110 ( if you are a bad typist like me this really helps )
2111
2112e.g. hit br <TAB> & cursor up & down :-).
2113
21142) if you have a debugging problem that takes a few steps to recreate
2115put the steps into a file called .gdbinit in your current working directory
2116if you have defined a few extra useful user defined commands put these in
2117your home directory & they will be read each time gdb is launched.
2118
2119A typical .gdbinit file might be.::
2120
2121 break main
2122 run
2123 break runtime_exception
2124 cont
2125
2126
2127stack chaining in gdb by hand
2128-----------------------------
2129This is done using a the same trick described for VM::
2130
2131 p/x (*($sp+56))&0x7fffffff
2132
2133get the first backchain.
2134
2135For z/Architecture
2136Replace 56 with 112 & ignore the &0x7fffffff
2137in the macros below & do nasty casts to longs like the following
2138as gdb unfortunately deals with printed arguments as ints which
2139messes up everything.
2140
2141i.e. here is a 3rd backchain dereference::
2142
2143 p/x *(long *)(***(long ***)$sp+112)
2144
2145
2146this outputs::
2147
2148 $5 = 0x528f18
2149
2150on my machine.
2151
2152Now you can use::
2153
2154 info symbol (*($sp+56))&0x7fffffff
2155
2156you might see something like::
2157
2158 rl_getc + 36 in section .text
2159
2160telling you what is located at address 0x528f18
2161Now do::
2162
2163 p/x (*(*$sp+56))&0x7fffffff
2164
2165This outputs::
2166
2167 $6 = 0x528ed0
2168
2169Now do::
2170
2171 info symbol (*(*$sp+56))&0x7fffffff
2172 rl_read_key + 180 in section .text
2173
2174now do::
2175
2176 p/x (*(**$sp+56))&0x7fffffff
2177
2178& so on.
2179
2180Disassembling instructions without debug info
2181---------------------------------------------
2182gdb typically complains if there is a lack of debugging
2183symbols in the disassemble command with
2184"No function contains specified address." To get around
2185this do::
2186
2187 x/<number lines to disassemble>xi <address>
2188
2189e.g.::
2190
2191 x/20xi 0x400730
2192
2193
2194
2195Note:
2196 Remember gdb has history just like bash you don't need to retype the
2197 whole line just use the up & down arrows.
2198
2199
2200
2201For more info
2202-------------
2203From your linuxbox do::
2204
2205 man gdb
2206
2207or::
2208
2209 info gdb.
2210
2211core dumps
2212----------
2213
2214What a core dump ?
2215^^^^^^^^^^^^^^^^^^
2216
2217A core dump is a file generated by the kernel (if allowed) which contains the
2218registers and all active pages of the program which has crashed.
2219
2220From this file gdb will allow you to look at the registers, stack trace and
2221memory of the program as if it just crashed on your system. It is usually
2222called core and created in the current working directory.
2223
2224This is very useful in that a customer can mail a core dump to a technical
2225support department and the technical support department can reconstruct what
2226happened. Provided they have an identical copy of this program with debugging
2227symbols compiled in and the source base of this build is available.
2228
2229In short it is far more useful than something like a crash log could ever hope
2230to be.
2231
2232Why have I never seen one ?
2233^^^^^^^^^^^^^^^^^^^^^^^^^^^
2234
2235Probably because you haven't used the command::
2236
2237 ulimit -c unlimited in bash
2238
2239to allow core dumps, now do::
2240
2241 ulimit -a
2242
2243to verify that the limit was accepted.
2244
2245A sample core dump
2246 To create this I'm going to do::
2247
2248 ulimit -c unlimited
2249 gdb
2250
2251to launch gdb (my victim app. ) now be bad & do the following from another
2252telnet/xterm session to the same machine::
2253
2254 ps -aux | grep gdb
2255 kill -SIGSEGV <gdb's pid>
2256
2257or alternatively use `killall -SIGSEGV gdb` if you have the killall command.
2258
2259Now look at the core dump::
2260
2261 ./gdb core
2262
2263Displays the following::
2264
2265 GNU gdb 4.18
2266 Copyright 1998 Free Software Foundation, Inc.
2267 GDB is free software, covered by the GNU General Public License, and you are
2268 welcome to change it and/or distribute copies of it under certain conditions.
2269 Type "show copying" to see the conditions.
2270 There is absolutely no warranty for GDB. Type "show warranty" for details.
2271 This GDB was configured as "s390-ibm-linux"...
2272 Core was generated by `./gdb'.
2273 Program terminated with signal 11, Segmentation fault.
2274 Reading symbols from /usr/lib/libncurses.so.4...done.
2275 Reading symbols from /lib/libm.so.6...done.
2276 Reading symbols from /lib/libc.so.6...done.
2277 Reading symbols from /lib/ld-linux.so.2...done.
2278 #0 0x40126d1a in read () from /lib/libc.so.6
2279 Setting up the environment for debugging gdb.
2280 Breakpoint 1 at 0x4dc6f8: file utils.c, line 471.
2281 Breakpoint 2 at 0x4d87a4: file top.c, line 2609.
2282 (top-gdb) info stack
2283 #0 0x40126d1a in read () from /lib/libc.so.6
2284 #1 0x528f26 in rl_getc (stream=0x7ffffde8) at input.c:402
2285 #2 0x528ed0 in rl_read_key () at input.c:381
2286 #3 0x5167e6 in readline_internal_char () at readline.c:454
2287 #4 0x5168ee in readline_internal_charloop () at readline.c:507
2288 #5 0x51692c in readline_internal () at readline.c:521
2289 #6 0x5164fe in readline (prompt=0x7ffff810)
2290 at readline.c:349
2291 #7 0x4d7a8a in command_line_input (prompt=0x564420 "(gdb) ", repeat=1,
2292 annotation_suffix=0x4d6b44 "prompt") at top.c:2091
2293 #8 0x4d6cf0 in command_loop () at top.c:1345
2294 #9 0x4e25bc in main (argc=1, argv=0x7ffffdf4) at main.c:635
2295
2296
2297LDD
2298===
2299This is a program which lists the shared libraries which a library needs,
2300Note you also get the relocations of the shared library text segments which
2301help when using objdump --source.
2302
2303e.g.::
2304
2305 ldd ./gdb
2306
2307outputs::
2308
2309 libncurses.so.4 => /usr/lib/libncurses.so.4 (0x40018000)
2310 libm.so.6 => /lib/libm.so.6 (0x4005e000)
2311 libc.so.6 => /lib/libc.so.6 (0x40084000)
2312 /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
2313
2314
2315Debugging shared libraries
2316==========================
2317Most programs use shared libraries, however it can be very painful
2318when you single step instruction into a function like printf for the
2319first time & you end up in functions like _dl_runtime_resolve this is
2320the ld.so doing lazy binding, lazy binding is a concept in ELF where
2321shared library functions are not loaded into memory unless they are
2322actually used, great for saving memory but a pain to debug.
2323
2324To get around this either relink the program -static or exit gdb type
2325export LD_BIND_NOW=true this will stop lazy binding & restart the gdb'ing
2326the program in question.
2327
2328
2329
2330Debugging modules
2331=================
2332As modules are dynamically loaded into the kernel their address can be
2333anywhere to get around this use the -m option with insmod to emit a load
2334map which can be piped into a file if required.
2335
2336The proc file system
2337====================
2338What is it ?.
2339It is a filesystem created by the kernel with files which are created on demand
2340by the kernel if read, or can be used to modify kernel parameters,
2341it is a powerful concept.
2342
2343e.g.::
2344
2345 cat /proc/sys/net/ipv4/ip_forward
2346
2347On my machine outputs::
2348
2349 0
2350
2351telling me ip_forwarding is not on to switch it on I can do::
2352
2353 echo 1 > /proc/sys/net/ipv4/ip_forward
2354
2355cat it again::
2356
2357 cat /proc/sys/net/ipv4/ip_forward
2358
2359On my machine now outputs::
2360
2361 1
2362
2363IP forwarding is on.
2364
2365There is a lot of useful info in here best found by going in and having a look
2366around, so I'll take you through some entries I consider important.
2367
2368All the processes running on the machine have their own entry defined by
2369/proc/<pid>
2370
2371So lets have a look at the init process::
2372
2373 cd /proc/1
2374 cat cmdline
2375
2376emits::
2377
2378 init [2]
2379
2380::
2381
2382 cd /proc/1/fd
2383
2384This contains numerical entries of all the open files,
2385some of these you can cat e.g. stdout (2)::
2386
2387 cat /proc/29/maps
2388
2389on my machine emits::
2390
2391 00400000-00478000 r-xp 00000000 5f:00 4103 /bin/bash
2392 00478000-0047e000 rw-p 00077000 5f:00 4103 /bin/bash
2393 0047e000-00492000 rwxp 00000000 00:00 0
2394 40000000-40015000 r-xp 00000000 5f:00 14382 /lib/ld-2.1.2.so
2395 40015000-40016000 rw-p 00014000 5f:00 14382 /lib/ld-2.1.2.so
2396 40016000-40017000 rwxp 00000000 00:00 0
2397 40017000-40018000 rw-p 00000000 00:00 0
2398 40018000-4001b000 r-xp 00000000 5f:00 14435 /lib/libtermcap.so.2.0.8
2399 4001b000-4001c000 rw-p 00002000 5f:00 14435 /lib/libtermcap.so.2.0.8
2400 4001c000-4010d000 r-xp 00000000 5f:00 14387 /lib/libc-2.1.2.so
2401 4010d000-40111000 rw-p 000f0000 5f:00 14387 /lib/libc-2.1.2.so
2402 40111000-40114000 rw-p 00000000 00:00 0
2403 40114000-4011e000 r-xp 00000000 5f:00 14408 /lib/libnss_files-2.1.2.so
2404 4011e000-4011f000 rw-p 00009000 5f:00 14408 /lib/libnss_files-2.1.2.so
2405 7fffd000-80000000 rwxp ffffe000 00:00 0
2406
2407
2408Showing us the shared libraries init uses where they are in memory
2409& memory access permissions for each virtual memory area.
2410
2411/proc/1/cwd is a softlink to the current working directory.
2412
2413/proc/1/root is the root of the filesystem for this process.
2414
2415/proc/1/mem is the current running processes memory which you
2416can read & write to like a file.
2417
2418strace uses this sometimes as it is a bit faster than the
2419rather inefficient ptrace interface for peeking at DATA.
2420
2421::
2422
2423 cat status
2424
2425 Name: init
2426 State: S (sleeping)
2427 Pid: 1
2428 PPid: 0
2429 Uid: 0 0 0 0
2430 Gid: 0 0 0 0
2431 Groups:
2432 VmSize: 408 kB
2433 VmLck: 0 kB
2434 VmRSS: 208 kB
2435 VmData: 24 kB
2436 VmStk: 8 kB
2437 VmExe: 368 kB
2438 VmLib: 0 kB
2439 SigPnd: 0000000000000000
2440 SigBlk: 0000000000000000
2441 SigIgn: 7fffffffd7f0d8fc
2442 SigCgt: 00000000280b2603
2443 CapInh: 00000000fffffeff
2444 CapPrm: 00000000ffffffff
2445 CapEff: 00000000fffffeff
2446
2447 User PSW: 070de000 80414146
2448 task: 004b6000 tss: 004b62d8 ksp: 004b7ca8 pt_regs: 004b7f68
2449 User GPRS:
2450 00000400 00000000 0000000b 7ffffa90
2451 00000000 00000000 00000000 0045d9f4
2452 0045cafc 7ffffa90 7fffff18 0045cb08
2453 00010400 804039e8 80403af8 7ffff8b0
2454 User ACRS:
2455 00000000 00000000 00000000 00000000
2456 00000001 00000000 00000000 00000000
2457 00000000 00000000 00000000 00000000
2458 00000000 00000000 00000000 00000000
2459 Kernel BackChain CallChain BackChain CallChain
2460 004b7ca8 8002bd0c 004b7d18 8002b92c
2461 004b7db8 8005cd50 004b7e38 8005d12a
2462 004b7f08 80019114
2463
2464Showing among other things memory usage & status of some signals &
2465the processes'es registers from the kernel task_structure
2466as well as a backchain which may be useful if a process crashes
2467in the kernel for some unknown reason.
2468
2469Some driver debugging techniques
2470================================
2471debug feature
2472-------------
2473Some of our drivers now support a "debug feature" in
2474/proc/s390dbf see s390dbf.txt in the linux/Documentation directory
2475for more info.
2476
2477e.g.
2478to switch on the lcs "debug feature"::
2479
2480 echo 5 > /proc/s390dbf/lcs/level
2481
2482& then after the error occurred::
2483
2484 cat /proc/s390dbf/lcs/sprintf >/logfile
2485
2486the logfile now contains some information which may help
2487tech support resolve a problem in the field.
2488
2489
2490
2491high level debugging network drivers
2492------------------------------------
2493ifconfig is a quite useful command
2494it gives the current state of network drivers.
2495
2496If you suspect your network device driver is dead
2497one way to check is type::
2498
2499 ifconfig <network device>
2500
2501e.g. tr0
2502
2503You should see something like::
2504
2505 ifconfig tr0
2506 tr0 Link encap:16/4 Mbps Token Ring (New) HWaddr 00:04:AC:20:8E:48
2507 inet addr:9.164.185.132 Bcast:9.164.191.255 Mask:255.255.224.0
2508 UP BROADCAST RUNNING MULTICAST MTU:2000 Metric:1
2509 RX packets:246134 errors:0 dropped:0 overruns:0 frame:0
2510 TX packets:5 errors:0 dropped:0 overruns:0 carrier:0
2511 collisions:0 txqueuelen:100
2512
2513if the device doesn't say up
2514try::
2515
2516 /etc/rc.d/init.d/network start
2517
2518( this starts the network stack & hopefully calls ifconfig tr0 up ).
2519ifconfig looks at the output of /proc/net/dev and presents it in a more
2520presentable form.
2521
2522Now ping the device from a machine in the same subnet.
2523
2524if the RX packets count & TX packets counts don't increment you probably
2525have problems.
2526
2527next::
2528
2529 cat /proc/net/arp
2530
2531Do you see any hardware addresses in the cache if not you may have problems.
2532Next try::
2533
2534 ping -c 5 <broadcast_addr>
2535
2536i.e. the Bcast field above in the output of
2537ifconfig. Do you see any replies from machines other than the local machine
2538if not you may have problems. also if the TX packets count in ifconfig
2539hasn't incremented either you have serious problems in your driver
2540(e.g. the txbusy field of the network device being stuck on )
2541or you may have multiple network devices connected.
2542
2543
2544chandev
2545-------
2546There is a new device layer for channel devices, some
2547drivers e.g. lcs are registered with this layer.
2548
2549If the device uses the channel device layer you'll be
2550able to find what interrupts it uses & the current state
2551of the device.
2552
2553See the manpage chandev.8 &type cat /proc/chandev for more info.
2554
2555
2556SysRq
2557=====
2558This is now supported by linux for s/390 & z/Architecture.
2559
2560To enable it do compile the kernel with::
2561
2562 Kernel Hacking -> Magic SysRq Key Enabled
2563
2564Then::
2565
2566 echo "1" > /proc/sys/kernel/sysrq
2567
2568also type::
2569
2570 echo "8" >/proc/sys/kernel/printk
2571
2572To make printk output go to console.
2573
2574On 390 all commands are prefixed with::
2575
2576 ^-
2577
2578e.g.::
2579
2580 ^-t will show tasks.
2581 ^-? or some unknown command will display help.
2582
2583The sysrq key reading is very picky ( I have to type the keys in an
2584xterm session & paste them into the x3270 console )
2585& it may be wise to predefine the keys as described in the VM hints above
2586
2587This is particularly useful for syncing disks unmounting & rebooting
2588if the machine gets partially hung.
2589
2590Read Documentation/admin-guide/sysrq.rst for more info
2591
2592References:
2593===========
2594- Enterprise Systems Architecture Reference Summary
2595- Enterprise Systems Architecture Principles of Operation
2596- Hartmut Penners s390 stack frame sheet.
2597- IBM Mainframe Channel Attachment a technology brief from a CISCO webpage
2598- Various bits of man & info pages of Linux.
2599- Linux & GDB source.
2600- Various info & man pages.
2601- CMS Help on tracing commands.
2602- Linux for s/390 Elf Application Binary Interface
2603- Linux for z/Series Elf Application Binary Interface ( Both Highly Recommended )
2604- z/Architecture Principles of Operation SA22-7832-00
2605- Enterprise Systems Architecture/390 Reference Summary SA22-7209-01 & the
2606- Enterprise Systems Architecture/390 Principles of Operation SA22-7201-05
2607
2608Special Thanks
2609==============
2610Special thanks to Neale Ferguson who maintains a much
2611prettier HTML version of this page at
2612http://linuxvm.org/penguinvm/
2613Bob Grainger Stefan Bader & others for reporting bugs
diff --git a/Documentation/s390/index.rst b/Documentation/s390/index.rst
index f8c01cb7fa37..f7af2061e406 100644
--- a/Documentation/s390/index.rst
+++ b/Documentation/s390/index.rst
@@ -7,7 +7,6 @@ s390 Architecture
7 7
8 cds 8 cds
9 3270 9 3270
10 debugging390
11 driver-model 10 driver-model
12 monreader 11 monreader
13 qeth 12 qeth