From: Wolfgang Mauerer <wolfgang.maue...@siemens.com>

Same procedure as last year, Miss Sophie?
Same procedure as every year, James.

Signed-off-by: Wolfgang Mauerer <wolfgang.maue...@siemens.com>
Signed-off-by: Jan Kiszka <jan.kis...@siemens.com>
---
 ksrc/arch/generic/hal.c |   99 ++++++++++++++++++++++++++++++++++-------------
 1 files changed, 72 insertions(+), 27 deletions(-)

diff --git a/ksrc/arch/generic/hal.c b/ksrc/arch/generic/hal.c
index ca221b5..c97659a 100644
--- a/ksrc/arch/generic/hal.c
+++ b/ksrc/arch/generic/hal.c
@@ -771,47 +771,92 @@ static struct file_operations faults_seq_operations = {
        .release        = seq_release_private,
 };
 
-static int apc_read_proc(char *page,
-                         char **start,
-                         off_t off, int count, int *eof, void *data)
+static inline void *apc_seq_find_valid_pos(loff_t *pos)
 {
-    int len = 0, cpu, apc;
-    char *p = page;
+       while (!(*pos > BITS_PER_LONG) &&
+              !test_bit(*pos - 1, &rthal_apc_map)) {
+               (*pos)++;
+       }
 
-    p += sprintf(p, "APC ");
+       if (*pos > BITS_PER_LONG) {
+               return NULL;
+       }
 
-    for_each_online_cpu(cpu) {
-        p += sprintf(p, "         CPU%d", cpu);
-    }
+       return pos;
+}
 
-    for (apc = 0; apc < BITS_PER_LONG; apc++) {
-        if (!test_bit(apc, &rthal_apc_map))
-            continue;           /* Not hooked. */
+static void *apc_seq_start(struct seq_file *seq, loff_t *pos)
+{
+       /* The header is valid, naturally */
+       if (*pos == 0)
+               return pos;
 
-        p += sprintf(p, "\n%3d: ", apc);
+       return apc_seq_find_valid_pos(pos);
+}
+
+static void apc_seq_stop(struct seq_file *f, void *v)
+{
+       /* Nothing to do */
+}
+
+static void *apc_seq_next(struct seq_file *f, void *v, loff_t *pos)
+{
+       (*pos)++;
+
+       return apc_seq_find_valid_pos(pos);
+}
+
+static int apc_seq_show(struct seq_file *f, void *v)
+{
+       unsigned int i = *(loff_t *) v;
+       unsigned int apc, cpu;
+
+       if (i == 0) {
+               seq_puts(f, "APC ");
+               for_each_online_cpu(cpu) {
+                       seq_printf(f, "        CPU%u", cpu);
+               }
+               seq_putc(f, '\n');
+
+               return 0;
+       }
+
+       apc = i - 1;
+
+        seq_printf(f, "%3d: ", apc);
 
         for_each_online_cpu(cpu) {
-            p += sprintf(p, "%12lu", rthal_apc_table[apc].hits[cpu]);
+            seq_printf(f, "%12lu", rthal_apc_table[apc].hits[cpu]);
         }
 
        if (rthal_apc_table[apc].name)
-           p += sprintf(p, "    (%s)", rthal_apc_table[apc].name);
-    }
+           seq_printf(f, "    (%s)", rthal_apc_table[apc].name);
 
-    p += sprintf(p, "\n");
+       seq_putc(f, '\n');
 
-    len = p - page - off;
-    if (len <= off + count)
-        *eof = 1;
-    *start = page + off;
-    if (len > count)
-        len = count;
-    if (len < 0)
-        len = 0;
+       return 0;
+}
 
-    return len;
+static struct seq_operations apc_seq_ops = {
+       .start  = apc_seq_start,
+       .next   = apc_seq_next,
+       .stop   = apc_seq_stop,
+       .show   = apc_seq_show,
+};
+
+static int apc_open(struct inode *inode, struct file *filp)
+{
+       return seq_open(filp, &apc_seq_ops);
 }
 
+static struct file_operations apc_seq_operations = {
+       .open           = apc_open,
+       .read           = seq_read,
+       .llseek         = seq_lseek,
+       .release        = seq_release,
+};
+
+
 struct proc_dir_entry *rthal_add_proc_leaf(const char *name,
                                            read_proc_t rdproc,
                                            write_proc_t wrproc,
@@ -869,7 +914,7 @@ static int rthal_proc_register(void)
        rthal_add_proc_leaf("hal", &hal_read_proc, NULL, NULL, rthal_proc_root);
        rthal_add_proc_seq("faults", &faults_seq_operations, 0,
                           rthal_proc_root);
-       rthal_add_proc_leaf("apc", &apc_read_proc, NULL, NULL, rthal_proc_root);
+       rthal_add_proc_seq("apc", &apc_seq_operations, 0, rthal_proc_root);
 
        rthal_nmi_proc_register();
 
-- 
1.6.0.2


_______________________________________________
Xenomai-core mailing list
Xenomai-core@gna.org
https://mail.gna.org/listinfo/xenomai-core

Reply via email to