diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-12-22 10:49:52 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-12-22 10:49:52 +0100 |
commit | 515893dda6d67853ff271819d877fe2986b03456 (patch) | |
tree | 552cd86f6b4a08a8bd4e1ec96b5cbf802fefab96 /sys/src/9/xen | |
parent | f4c6dad8e13c289914962d3b43b07cfdaca3e33a (diff) |
pc, pc64, xen: simplify #P/irqalloc
Diffstat (limited to 'sys/src/9/xen')
-rw-r--r-- | sys/src/9/xen/trap.c | 39 |
1 files changed, 13 insertions, 26 deletions
diff --git a/sys/src/9/xen/trap.c b/sys/src/9/xen/trap.c index ddbb9c101..9d572577b 100644 --- a/sys/src/9/xen/trap.c +++ b/sys/src/9/xen/trap.c @@ -123,42 +123,29 @@ intrdisable(int irq, void (*f)(Ureg *, void *), void *a, int tbdf, char *name) } static long -irqallocread(Chan*, void *vbuf, long n, vlong offset) +irqallocread(Chan*, void *a, long n, vlong offset) { - char *buf, *p, str[2*(11+1)+KNAMELEN+1+1]; - int m, vno; - long oldn; + char buf[2*(11+1)+KNAMELEN+1+1]; + int vno, m; Vctl *v; if(n < 0 || offset < 0) error(Ebadarg); - oldn = n; - buf = vbuf; for(vno=0; vno<nelem(vctl); vno++){ for(v=vctl[vno]; v; v=v->next){ - m = snprint(str, sizeof str, "%11d %11d %.*s\n", vno, v->irq, KNAMELEN, v->name); - if(m <= offset) /* if do not want this, skip entry */ - offset -= m; - else{ - /* skip offset bytes */ - m -= offset; - p = str+offset; - offset = 0; - - /* write at most max(n,m) bytes */ - if(m > n) - m = n; - memmove(buf, p, m); - n -= m; - buf += m; - - if(n == 0) - return oldn; - } + m = snprint(buf, sizeof(buf), "%11d %11d %.*s\n", vno, v->irq, KNAMELEN, v->name); + offset -= m; + if(offset >= 0) + continue; + if(n > -offset) + n = -offset; + offset += m; + memmove(a, buf+offset, n); + return n; } } - return oldn - n; + return 0; } void |