From fc609b4916ab2b68d164b5120ae6daf49146911c Mon Sep 17 00:00:00 2001 From: Abdulaziz Ghuloum Date: Sun, 24 Dec 2006 09:25:01 +0300 Subject: [PATCH] * lab/interupts program is added to experiment with sigaction and sigaltstack. added: lab/interrupts/ lab/interrupts/Makefile lab/interrupts/inf_loop.s lab/interrupts/main lab/interrupts/main.c --- TODO | 1 + lab/interrupts/Makefile | 6 +++ lab/interrupts/inf_loop.s | 8 ++++ lab/interrupts/main | Bin 0 -> 13656 bytes lab/interrupts/main.c | 90 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 105 insertions(+) create mode 100644 lab/interrupts/Makefile create mode 100644 lab/interrupts/inf_loop.s create mode 100755 lab/interrupts/main create mode 100644 lab/interrupts/main.c diff --git a/TODO b/TODO index d3b707e..d2ba510 100644 --- a/TODO +++ b/TODO @@ -2,6 +2,7 @@ CHECK - Implement guardians. CHECK - clean up after file ports are dead by flushing/closing the underlying file handle. + - Flush and close output-port on exit. * Interrupts: - pcb should have an engine-counter field that's decremented on diff --git a/lab/interrupts/Makefile b/lab/interrupts/Makefile new file mode 100644 index 0000000..aa1bc1d --- /dev/null +++ b/lab/interrupts/Makefile @@ -0,0 +1,6 @@ + +all: main + +main: inf_loop.s main.c + gcc -o main inf_loop.s main.c + diff --git a/lab/interrupts/inf_loop.s b/lab/interrupts/inf_loop.s new file mode 100644 index 0000000..a46cefe --- /dev/null +++ b/lab/interrupts/inf_loop.s @@ -0,0 +1,8 @@ + +.globl _inf_loop + +_inf_loop: + movl %esp, %eax + movl $0, %esp +L_loop: + jmp L_loop diff --git a/lab/interrupts/main b/lab/interrupts/main new file mode 100755 index 0000000000000000000000000000000000000000..bb8c24dc1edccbd74c824385c6e4bb8867bcc750 GIT binary patch literal 13656 zcmeHOZ)hB48h?|FcCpdy* zTx6@5frUFl<2VJuobT55?#|gMCX2&P=UxY)vuSbei-UfGlk0`?$9~S33Fl)dl4|{N zDeQ2DIX67tHSN(<(OScb+ZdaHZAI6@9Qk}n9fqS@+@^9`b6i9Y>hmIUv{DnLq8wF=3VGHLW>{Dq{thi&xBH zIF*WHXIWZvsK~K7H4+!uqQ0|5cnZS#jwc77dV2mz*aRgtp(Z;$2P9cPoL3#w_J!*~ ziM3cfg~#!U+W8uRE`dqEx zv)(oNX>G|z^gcX$Yj|q*riV8A*9CuTo28HN%dS7SzdTi&4R2%=@vqsAU`nYMC%>wF z*QhE-=}n~0Ca3)N<`+i`xr^xdGR7L(nXtd4Oe>{T$Q}(b#+rN1G_;viJ3!j)(AKpX z@mkEu zK&j9OzD38BA?z+iH^Yj1hx3}z`JYiWr62p*98JR$R(dOq{sU{M%>{?%SZ#eH_$My2 zCL6DNlyWyx;^4o+lBN6|d1-T@HZ!e7lxDscdVxhRGZgYpoIC4bB2G>Efb{4gK5Rh` zujYE#39szHb-)Y#6WZFLeLoko5`MwS&FGcNz)F5c@rph!cv)EbgedchQ?6Npo3`nj zx@Eo~TyE%=<>mdIGJeRq6+Tk44Kir-TLwQ#)!yD-^#;cJ9a~^ykLz~X60Z6v5{U9z zQn6j;sBZYCW2=wpCbV1C9*+!<>bC9pYDKpkL)C3nw|v#}bz>aH)aD6)UY*6kZ$s>- zIwPuwdexq?3Qx*eUscLlrK6KoJo9P+l3mJOG9Vd{3`hnf1CjyBfMh^2AQ_MhNCqSW zl7VZFfeTl?u00N9N0I@_fMh^2AQ_MhNCqSWk^#wpWI!??8MxLMP|?sD3_+a4(D3~! zK8^X^{uF-*{XPtptm!z+vbpyzrO0TUh-R4y(@;@&iW%@*z#TN7gMS~9{`w+Qq5mSq zCE)WZz8iQM&L^Msz;~v26Y#baZwB6%;w``jQ~VI{Ybo9a{HGN61OFq%j|2ZV#RI?( zvZQ7O*h61kusySyv0tS46#Cto;;(_X5k_r;@P8@QuUmtmqZI!hu|t#-d1&tWUFh3b z8?G2LAQ?Uu>*G;s_M2Fr;6LVkR_1)x=JI@y!yo7HT{-^~IsIojd^(4}$>EsX7g6RE zqzU;8rltOl0i1tB?!ko9FeF&Q*jJDVOpCk-`TPdfgL>COXs#PHu-hS^fT@r>A)t)i z0l5oOf~IODY{R2W=wea3~o-*oY( z2sARHyH3qFZ92R%#>GKl)O>-QdKo#njz2~*ak`=V23ZYJrMVpL>ZXT~Mb%WXe`O;# z%fj|ee*!5m%QMb(OUJB`E2bO45 zD+yneFEdgQcWeViBFq!d+m3gIBNuUKIe8I}%L-V;Cs&7XUE9H3j@gd8r|GKsn^VzE zn}HxhnEM6y^h(td=-RYL=t-gHgqsg+d7yVx_`GUxf2?MY_YNOqd@Px-qS*97z%&%y zB4a$KOTFmf;3&nxt;du17~>;V3~l)%00&%??ka|_aK{+;vKg%eT7H@me|VH6z_b1X DrM^fE literal 0 HcmV?d00001 diff --git a/lab/interrupts/main.c b/lab/interrupts/main.c new file mode 100644 index 0000000..96c2959 --- /dev/null +++ b/lab/interrupts/main.c @@ -0,0 +1,90 @@ +#include +#include +#include +#include + +extern void inf_loop(); +void register_handlers(); +void register_alt_stack(); + +int main(int argc, char** argv){ + fprintf(stderr, "Entering ... \n"); + register_handlers(); + register_alt_stack(); + inf_loop(); + fprintf(stderr, "Done\n"); + return 0; +} + +#if 0 + #include + + struct sigaction { + union { + void (*__sa_handler)(int); + void (*__sa_sigaction)(int, struct __siginfo *, void *); + } __sigaction_u; /* signal handler */ + int sa_flags; /* see signal options below */ + sigset_t sa_mask; /* signal mask to apply */ + }; + + #define sa_handler __sigaction_u.__sa_handler + #define sa_sigaction __sigaction_u.__sa_sigaction + + int + sigaction(int sig, const struct sigaction * restrict act, + struct sigaction * restrict oact); +#endif + +void handler(int signo, struct __siginfo* info, ucontext_t* uap){ + fprintf(stderr, "Handler Called!\n"); +} + +void +register_handlers(){ + struct sigaction sa; + sa.sa_sigaction = (void(*)(int,struct __siginfo*,void*)) handler; + sa.sa_flags = SA_SIGINFO | SA_ONSTACK; + sa.sa_mask = 0; + int err = sigaction(SIGINT, &sa, 0); + if(err){ + fprintf(stderr, "Sigaction Failed: %s\n", strerror(errno)); + exit(-1); + } +} + + +#if 0 +SYNOPSIS + #include + #include + + struct sigaltstack { + char *ss_sp; + int ss_size; + int ss_flags; + }; + + int + sigaltstack(const struct sigaltstack *ss, struct sigaltstack *oss); +#endif + +void +register_alt_stack(){ + char* stk = malloc(SIGSTKSZ); + if(stk == 0){ + fprintf(stderr, "Cannot maloc an alt stack\n"); + exit(-1); + } + + struct sigaltstack sa; + sa.ss_sp = stk; + sa.ss_size = SIGSTKSZ; + sa.ss_flags = 0; + int err = sigaltstack(&sa, 0); + if(err){ + fprintf(stderr, "Cannot set alt stack: %s\n", strerror(errno)); + exit(-1); + } + fprintf(stderr, "alt-stack of size %d set\n", SIGSTKSZ); +}