diff options
author | Jan Glauber <jang@linux.vnet.ibm.com> | 2012-09-11 07:42:06 -0400 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2012-09-26 09:45:18 -0400 |
commit | d3feb481083636296f25daf36dbf44493fa7e1f2 (patch) | |
tree | 61df6077aba121ad8a73bd8d8dfef054f5fb1821 /drivers/s390/cio | |
parent | c0162b07b34ce8b33548f4b2658ec3133f960e71 (diff) |
s390/qdio: fix truncated debug output of hex values
Calling debug_event the s390 debug feature only logs up to buf_size
bytes of the debug view. If debug_event is called with more bytes
than buf_size the additional data is ignored and not logged in the
debug view.
Use multiple calls to debug_event if the length exceeds buf_size.
Signed-off-by: Jan Glauber <jang@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'drivers/s390/cio')
-rw-r--r-- | drivers/s390/cio/qdio_debug.h | 38 |
1 files changed, 25 insertions, 13 deletions
diff --git a/drivers/s390/cio/qdio_debug.h b/drivers/s390/cio/qdio_debug.h index e1f646800ddb..7f8b973da298 100644 --- a/drivers/s390/cio/qdio_debug.h +++ b/drivers/s390/cio/qdio_debug.h | |||
@@ -37,10 +37,14 @@ static inline int qdio_dbf_passes(debug_info_t *dbf_grp, int level) | |||
37 | debug_text_event(qdio_dbf_setup, DBF_ERR, debug_buffer); \ | 37 | debug_text_event(qdio_dbf_setup, DBF_ERR, debug_buffer); \ |
38 | } while (0) | 38 | } while (0) |
39 | 39 | ||
40 | #define DBF_HEX(addr, len) \ | 40 | static inline void DBF_HEX(void *addr, int len) |
41 | do { \ | 41 | { |
42 | debug_event(qdio_dbf_setup, DBF_ERR, (void*)(addr), len); \ | 42 | while (len > 0) { |
43 | } while (0) | 43 | debug_event(qdio_dbf_setup, DBF_ERR, addr, len); |
44 | len -= qdio_dbf_setup->buf_size; | ||
45 | addr += qdio_dbf_setup->buf_size; | ||
46 | } | ||
47 | } | ||
44 | 48 | ||
45 | #define DBF_ERROR(text...) \ | 49 | #define DBF_ERROR(text...) \ |
46 | do { \ | 50 | do { \ |
@@ -49,11 +53,14 @@ static inline int qdio_dbf_passes(debug_info_t *dbf_grp, int level) | |||
49 | debug_text_event(qdio_dbf_error, DBF_ERR, debug_buffer); \ | 53 | debug_text_event(qdio_dbf_error, DBF_ERR, debug_buffer); \ |
50 | } while (0) | 54 | } while (0) |
51 | 55 | ||
52 | #define DBF_ERROR_HEX(addr, len) \ | 56 | static inline void DBF_ERROR_HEX(void *addr, int len) |
53 | do { \ | 57 | { |
54 | debug_event(qdio_dbf_error, DBF_ERR, (void*)(addr), len); \ | 58 | while (len > 0) { |
55 | } while (0) | 59 | debug_event(qdio_dbf_error, DBF_ERR, addr, len); |
56 | 60 | len -= qdio_dbf_error->buf_size; | |
61 | addr += qdio_dbf_error->buf_size; | ||
62 | } | ||
63 | } | ||
57 | 64 | ||
58 | #define DBF_DEV_EVENT(level, device, text...) \ | 65 | #define DBF_DEV_EVENT(level, device, text...) \ |
59 | do { \ | 66 | do { \ |
@@ -64,10 +71,15 @@ static inline int qdio_dbf_passes(debug_info_t *dbf_grp, int level) | |||
64 | } \ | 71 | } \ |
65 | } while (0) | 72 | } while (0) |
66 | 73 | ||
67 | #define DBF_DEV_HEX(level, device, addr, len) \ | 74 | static inline void DBF_DEV_HEX(struct qdio_irq *dev, void *addr, |
68 | do { \ | 75 | int len, int level) |
69 | debug_event(device->debug_area, level, (void*)(addr), len); \ | 76 | { |
70 | } while (0) | 77 | while (len > 0) { |
78 | debug_event(dev->debug_area, level, addr, len); | ||
79 | len -= dev->debug_area->buf_size; | ||
80 | addr += dev->debug_area->buf_size; | ||
81 | } | ||
82 | } | ||
71 | 83 | ||
72 | void qdio_allocate_dbf(struct qdio_initialize *init_data, | 84 | void qdio_allocate_dbf(struct qdio_initialize *init_data, |
73 | struct qdio_irq *irq_ptr); | 85 | struct qdio_irq *irq_ptr); |