l4re-base-25.08.0

This commit is contained in:
2025-09-12 15:55:45 +02:00
commit d959eaab98
37938 changed files with 9382688 additions and 0 deletions

View File

@@ -0,0 +1,2 @@
requires: libdrivers-lcd x86emu_int10 stdlibs libio-vbus
maintainer: adam@os.inf.tu-dresden.de

View File

@@ -0,0 +1,4 @@
PKGDIR = .
L4DIR ?= $(PKGDIR)/../..
include $(L4DIR)/mk/subdir.mk

View File

@@ -0,0 +1,4 @@
PKGDIR = ..
L4DIR ?= $(PKGDIR)/../..
include $(L4DIR)/mk/subdir.mk

View File

@@ -0,0 +1,623 @@
/* GIMP RGB C-Source image dump 1-byte-run-length-encoded (logo.c) */
#define GIMP_IMAGE_RUN_LENGTH_DECODE(image_buf, rle_data, size, bpp) do \
{ unsigned int __bpp; unsigned char *__ip; const unsigned char *__il, *__rd; \
__bpp = (bpp); __ip = (image_buf); __il = __ip + (size) * __bpp; \
__rd = (rle_data); if (__bpp > 3) { /* RGBA */ \
while (__ip < __il) { unsigned int __l = *(__rd++); \
if (__l & 128) { __l = __l - 128; \
do { memcpy (__ip, __rd, 4); __ip += 4; } while (--__l); __rd += 4; \
} else { __l *= 4; memcpy (__ip, __rd, __l); \
__ip += __l; __rd += __l; } } \
} else if (__bpp == 3) { /* RGB */ \
while (__ip < __il) { unsigned int __l = *(__rd++); \
if (__l & 128) { __l = __l - 128; \
do { memcpy (__ip, __rd, 3); __ip += 3; } while (--__l); __rd += 3; \
} else { __l *= 3; memcpy (__ip, __rd, __l); \
__ip += __l; __rd += __l; } } \
} else { /* RGB16 */ \
while (__ip < __il) { unsigned int __l = *(__rd++); \
if (__l & 128) { __l = __l - 128; \
do { memcpy (__ip, __rd, 2); __ip += 2; } while (--__l); __rd += 2; \
} else { __l *= 2; memcpy (__ip, __rd, __l); \
__ip += __l; __rd += __l; } } \
} } while (0)
static const struct {
unsigned int width;
unsigned int height;
unsigned int bytes_per_pixel; /* 2:RGB16, 3:RGB, 4:RGBA */
unsigned char rle_pixel_data[15535 + 1];
} gimp_image = {
530, 276, 3,
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E"
"\377'\070E\377'\070E\371'\070E\022&\067D$\066C'\071F:HTP[caippv{x}\202}\201\206"
"}\202\206z~\203sy~dlrU^g?LW*;H#\065C%\067D\377'\070E\377'\070E\377'\070E\377'"
"\070E\013%\067D*;HOZcz\200\205\242\250\254\325\330\332\373\373\373\375\375\375"
"\375\376\376\376\376\376\376\377\377\205\377\377\377\202\376\376\376\010\375"
"\375\375\374\374\375\342\344\346\255\262\266\204\211\216Zck\060@L%\066D\377"
"'\070E\340'\070E\002&\067D&\070E\324'\070E\005&\070E$\066C\"\065C#\065C%\066D\315'\070E"
"\003%\067D\070GRW`h\241bjq\006`hoV`hGS\\\062BN$\066D%\067D\304'\070E\006%\067D\070FQsy"
"\177\260\265\271\364\365\365\375\375\376\224\377\377\377\006\376\376\376\373"
"\373\373\303\307\312\200\206\213EQZ%\067D\377'\070E\332'\070E\010/>Kelr\211\220"
"\225\232\241\246\222\231\236v|\201BNX&\067D\317'\070E\011&\070EKU^\216\224\231"
"\314\317\322\356\357\360\353\354\355\277\304\307\200\206\214;HS\312'\070E"
"\003emt\312\315\320\374\374\374\244\376\376\376\202\375\375\375\006\357\360\361"
"\271\276\302\205\213\220V`h*;H&\067D\275'\070E\006&\070E,=Iiqw\273\277\302\372"
"\373\373\376\376\377\233\377\377\377\005\374\375\375\323\325\330z\200\206\067"
"EP&\067D\377'\070E\325'\070E\004+;G\177\206\214\354\355\356\376\376\376\204\377"
"\377\377\003\373\373\374\260\265\270AMW\315'\070E\003\062AM\245\252\255\373\373"
"\373\206\377\377\377\003\363\364\364\204\213\220*:G\306'\070E\003\062@L\263\267"
"\272\374\375\375\253\377\377\377\004\375\376\376\360\361\362\240\245\252Xa"
"i\272'\070E\005&\070E;HS\212\220\225\353\355\355\376\376\376\240\377\377\377"
"\005\376\377\377\367\367\367\242\247\254KU^&\067E\377'\070E\322'\070E\003\061@L\275"
"\300\303\375\376\376\210\377\377\377\002\350\351\352]el\313'\070E\002\067EP\315"
"\320\322\211\377\377\377\003\375\375\375\256\262\265,<H\304'\070E\003/>J\303\306"
"\310\376\376\376\257\377\377\377\004\375\375\375\327\331\333ov}+;H\266'\070"
"E\003<IS\230\235\242\365\366\366\246\377\377\377\004\373\374\374\265\271\274"
"NXa&\070E\377'\070E\317'\070E\003,;H\271\274\277\376\376\376\212\377\377\377\002"
"\350\351\352LV_\311'\070E\003,<H\276\301\303\376\376\377\212\377\377\377\003\374"
"\374\374\223\230\235(\071F\302'\070E\003(\071F\233\240\244\375\375\375\262\377"
"\377\377\004\376\376\376\333\335\337fnu(\071F\262'\070E\003\060?K\212\220\225\363"
"\364\364\252\377\377\377\003\373\373\373\251\255\261?KU\377'\070E\316'\070E\002"
"x\177\205\373\373\373\214\377\377\377\002\304\307\311-<H\310'\070E\002px~\373"
"\373\373\214\377\377\377\002\356\360\360HS\\\302'\070E\002DOX\354\355\356\265"
"\377\377\377\003\375\375\375\273\276\301BMX\260'\070E\003emt\340\342\343\376\376"
"\377\255\377\377\377\003\362\362\363\200\207\215+;H\377'\070E\313'\070E\002\060"
"?K\316\320\322\215\377\377\377\002\372\372\372Zdl\307'\070E\002-<I\306\311\313"
"\215\377\377\377\002\375\376\376\242\246\252\302'\070E\002\217\225\231\375\375"
"\375\267\377\377\377\003\354\355\356nu|(\070E\254'\070E\003\067DP\256\262\266\374"
"\374\374\260\377\377\377\003\376\376\376\315\317\322KV_\377'\070E\312'\070E\002"
"LV_\371\371\372\215\377\377\377\002\376\376\376\251\254\257\307'\070E\002MW`\367"
"\367\367\216\377\377\377\002\313\316\320/>J\300'\070E\002):F\300\303\305\271\377"
"\377\377\003\373\374\374\232\237\244+;H\252'\070E\002\\el\337\341\343\264\377"
"\377\377\003\362\363\363y\200\206(\071F\377'\070E\310'\070E\002qy\200\373\374\374"
"\216\377\377\377\002\303\306\310+;H\306'\070E\002\242\246\252\375\376\376\216"
"\377\377\377\002\337\341\342\071FP\300'\070E\002.>J\312\315\317\272\377\377\377"
"\003\375\375\375\267\272\275\060?K\247'\070E\003):F\201\210\216\370\370\370\266"
"\377\377\377\003\374\374\374\252\256\262\060?K\377'\070E\307'\070E\002\200\207\215"
"\374\374\374\216\377\377\377\002\311\314\316.=J\305'\070E\002\065CN\327\332\333"
"\217\377\377\377\002\343\345\346;GQ\300'\070E\002\060?K\315\320\322\273\377\377"
"\377\003\376\376\376\300\302\305\061@L\245'\070E\003.=I\252\256\262\374\374\375"
"\270\377\377\377\003\376\376\376\312\315\317=JT\377'\070E\306'\070E\002\200\207"
"\215\374\374\374\216\377\377\377\002\311\314\317.=J\305'\070E\002gpx\373\373\373"
"\217\377\377\377\002\324\327\331\064BM\300'\070E\002\060?K\315\320\322\274\377\377"
"\377\003\376\376\376\273\276\301.=I\243'\070E\003\064BN\300\303\306\376\376\376"
"\273\377\377\377\002\333\335\337KU^\377'\070E\305'\070E\002\200\207\215\374\374"
"\374\216\377\377\377\002\311\314\317.=J\304'\070E\002):F\276\300\302\220\377\377"
"\377\002\274\277\301)\071F\300'\070E\002\060?K\315\320\322\275\377\377\377\003\375"
"\375\375\247\253\256*:G\241'\070E\003\067EP\310\313\315\376\376\377\275\377\377"
"\377\002\342\344\345R[d\377'\070E\304'\070E\002\200\207\215\374\374\374\216\377"
"\377\377\002\311\314\317.=J\304'\070E\002BMW\354\355\356\217\377\377\377\002\373"
"\373\374nv}\301'\070E\002\060?K\315\320\322\276\377\377\377\002\373\373\373}\204"
"\212\240'\070E\002\065CO\313\315\317\300\377\377\377\002\345\346\350PZb\377'\070"
"E\303'\070E\002\200\207\215\374\374\374\216\377\377\377\002\311\314\317.=J\304"
"'\070E\002\214\221\226\374\375\375\217\377\377\377\002\333\335\337\067EO\301'\070"
"E\002\060?K\315\320\322\277\377\377\377\002\356\357\360PZc\236'\070E\002\061@L\305"
"\310\312\302\377\377\377\002\337\340\342IS\\\377'\070E\302'\070E\002\200\207\215"
"\374\374\374\216\377\377\377\002\311\314\317.=J\303'\070E\002/>J\314\317\321\217"
"\377\377\377\002\376\376\376\253\256\260\302'\070E\002\060?K\315\320\322\300\377"
"\377\377\002\311\314\316/>J\234'\070E\003,<H\266\271\274\376\376\376\236\377\377"
"\377\002\373\373\373\367\370\370\202\365\366\367\003\366\367\367\372\372\372"
"\376\376\376\236\377\377\377\002\323\326\327:GR\377'\070E\301'\070E\002\200\207"
"\215\374\374\374\216\377\377\377\002\311\314\317.=J\303'\070E\002U_g\371\372\372"
"\217\377\377\377\002\370\370\370PZc\302'\070E\002\060?K\315\320\322\300\377\377"
"\377\002\374\374\374\204\213\220\233'\070E\003)\071F\233\237\244\374\374\375\232"
"\377\377\377\007\365\366\366\353\354\354\263\270\274u~\206MW`>IS\070EP\202\066"
"CN\010\067DO=HRGR[hr{\243\252\256\343\344\345\363\364\364\375\375\375\232\377"
"\377\377\002\303\306\310/>J\377'\070E\300'\070E\002\200\207\215\374\374\374\216"
"\377\377\377\002\311\314\317.=J\302'\070E\003(\071E\256\261\264\376\376\376\217"
"\377\377\377\002\311\313\316.=J\302'\070E\002\060?K\315\320\322\217\377\377\377"
"\001\375\375\375\226\372\372\373\003\372\372\372\371\372\372\374\374\375\230"
"\377\377\377\002\337\341\343<HS\232'\070E\002nv}\371\371\372\230\377\377\377\005"
"\365\365\366\314\316\321bls\066CN):F\214'\070E\006(\071F\061@LQ\\d\263\267\273"
"\361\362\362\376\376\376\227\377\377\377\003\375\375\375\240\244\250)\071F\377"
"'\070E\277'\070E\002\200\207\215\374\374\374\216\377\377\377\002\311\314\317.="
"J\302'\070E\002\071FQ\337\341\342\217\377\377\377\002\374\374\374\205\213\221\224"
"'\070E\006*;HLV_gmsmsx`gm?KU\251'\070E\002\060?K\315\320\322\217\377\377\377\002\302"
"\304\306?JT\225>IS\202=IS\005BLVU`h\220\230\235\340\342\343\370\370\370\224"
"\377\377\377\002\375\375\375\227\234\240\231'\070E\002HS\\\347\351\352\226\377"
"\377\377\004\376\376\376\354\354\355\206\215\222\066DO\224'\070E\004\060?Kiry\335"
"\337\340\374\374\374\226\377\377\377\002\372\372\372mt{\377'\070E\277'\070E\002"
"\200\207\215\374\374\374\216\377\377\377\002\311\314\317.=J\302'\070E\002t|\202"
"\373\374\374\217\377\377\377\002\352\353\354@KU\222'\070E\012-=I|\202\210\347"
"\350\351\374\374\374\376\376\376\377\377\377\376\376\376\373\373\373\311"
"\314\317Yai\247'\070E\002\060?K\315\320\322\217\377\377\377\002\300\302\304)\071"
"F\232'\070E\004(\071F>JT\251\256\262\366\366\367\223\377\377\377\002\336\340\342"
":FQ\227'\070E\002.>J\306\311\313\226\377\377\377\003\355\355\356{\202\211/>J\230"
"'\070E\004*:G]gn\334\336\337\375\375\375\225\377\377\377\002\341\343\344AMW\377"
"'\070E\276'\070E\002\200\207\215\374\374\374\216\377\377\377\002\311\314\317.="
"J\301'\070E\002+;H\303\305\307\220\377\377\377\002\272\274\277)\071F\221'\070E\003"
">JT\313\316\320\376\376\376\207\377\377\377\003\372\373\373\227\234\241*;G"
"\245'\070E\002\060?K\315\320\322\217\377\377\377\002\300\302\304)\071F\235'\070E"
"\003EPZ\317\321\323\376\376\376\221\377\377\377\002\374\374\374\177\206\214\227"
"'\070E\002\212\220\225\374\374\374\224\377\377\377\003\370\370\371\247\253\257"
"\063AM\234'\070E\003,<H\200\207\214\362\363\363\224\377\377\377\003\376\376\377"
"\272\275\300+;G\377'\070E\275'\070E\002\200\207\215\374\374\374\216\377\377\377"
"\002\311\314\317.=J\301'\070E\002HS\\\363\363\364\217\377\377\377\002\372\372\373"
"bls\221'\070E\002\067DP\321\323\325\212\377\377\377\003\374\374\374\234\241\245"
")\071F\244'\070E\002\060?K\315\320\322\217\377\377\377\002\300\302\304)\071F\236"
"'\070E\003.=I\255\261\264\374\374\374\221\377\377\377\002\307\311\314-=I\225'"
"\070E\002HS\\\353\354\355\224\377\377\377\003\343\345\346Wai(\070E\237'\070E\003@"
"LV\313\316\320\376\376\376\223\377\377\377\002\372\372\373ow}\377'\070E\275"
"'\070E\002\200\207\215\374\374\374\216\377\377\377\002\311\314\317.=J\301'\070"
"E\002\230\235\241\375\375\375\217\377\377\377\002\324\327\331\064BM\220'\070E\003"
")\071F\257\262\265\376\376\376\213\377\377\377\002\371\371\371ckr\244'\070E\002"
"\060?K\315\320\322\217\377\377\377\002\300\302\304)\071F\237'\070E\003*;G\253\256"
"\262\375\375\375\220\377\377\377\002\364\365\366HS\\\224'\070E\003*:G\272\275"
"\277\376\377\377\222\377\377\377\003\376\376\376\302\305\310\067EO\242'\070E"
"\003,<H\237\244\250\372\372\372\223\377\377\377\002\325\330\332\066DO\377'\070"
"E\274'\070E\002\200\207\215\374\374\374\216\377\377\377\002\311\314\317.=J\300"
"'\070E\002\063AL\322\325\327\217\377\377\377\002\375\375\375\236\242\246\221'\070"
"E\002JU^\363\364\365\215\377\377\377\002\307\311\313-=I\243'\070E\002\060?K\315\320"
"\322\217\377\377\377\002\300\302\304)\071F\240'\070E\002.=J\301\304\307\220\377"
"\377\377\002\374\374\375\206\214\222\224'\070E\002_ho\371\371\371\222\377\377"
"\377\003\374\374\374\251\255\261,<H\244'\070E\003(\071F}\204\212\367\367\370\222"
"\377\377\377\002\375\375\375\223\230\235\377'\070E\274'\070E\002\200\207\215\374"
"\374\374\216\377\377\377\002\311\314\317.=J\300'\070E\002_hp\372\372\373\217\377"
"\377\377\002\365\365\366IT]\221'\070E\002\226\233\240\375\375\375\215\377\377"
"\377\002\367\367\370IS\\\243'\070E\002\060?K\315\320\322\217\377\377\377\002\300"
"\302\304)\071F\241'\070E\002EPY\352\353\354\220\377\377\377\002\300\302\304):F"
"\222'\070E\002-=I\306\311\313\222\377\377\377\003\373\373\373\235\242\246*:G\246"
"'\070E\003(\070Eow~\366\367\367\222\377\377\377\002\343\345\346>JT\377'\070E\273"
"'\070E\002\200\207\215\374\374\374\216\377\377\377\002\311\314\317.=J\277'\070"
"E\002(\071F\270\272\275\220\377\377\377\002\303\306\310+<H\220'\070E\002):F\300\302"
"\305\216\377\377\377\002\373\374\374qy\200\243'\070E\002\060?K\315\320\322\217"
"\377\377\377\002\300\302\304)\071F\242'\070E\002\224\232\236\375\375\375\217\377"
"\377\377\002\330\332\334\066CN\222'\070E\002clt\372\372\372\221\377\377\377\003\374"
"\374\375\244\250\253*:G\251'\070E\002s{\201\367\370\370\221\377\377\377\002\375"
"\375\375\234\240\244\377'\070E\273'\070E\002\200\207\215\374\374\374\216\377"
"\377\377\002\311\314\317.=J\277'\070E\002>JT\346\350\351\217\377\377\377\002\374"
"\374\374x\177\206\221'\070E\002-<I\307\312\314\216\377\377\377\002\374\374\375"
"\210\216\224\243'\070E\002\060?K\315\320\322\217\377\377\377\002\300\302\304)\071"
"F\242'\070E\002=IS\345\346\350\217\377\377\377\002\366\367\367FPY\221'\070E\002+"
";H\303\306\310\221\377\377\377\003\376\376\376\267\272\275,<H\252'\070E\003(\071"
"E\214\222\227\372\373\373\221\377\377\377\002\337\341\343:GR\377'\070E\272'"
"\070E\002\200\207\215\374\374\374\216\377\377\377\002\311\314\317.=J\277'\070E"
"\002\201\210\216\374\374\374\217\377\377\377\002\341\343\345;GR\221'\070E\002.="
"J\311\314\317\216\377\377\377\002\374\374\375\211\217\224\243'\070E\002\060?K\315"
"\320\322\217\377\377\377\002\300\302\304)\071F\242'\070E\002(\071F\270\273\275\217"
"\377\377\377\002\373\373\373`jr\221'\070E\002S]e\370\370\370\221\377\377\377\002"
"\317\321\323\065CN\254'\070E\003*:G\261\265\270\376\376\376\220\377\377\377\002"
"\374\374\374\207\215\222\377'\070E\272'\070E\002\200\207\215\374\374\374\216"
"\377\377\377\002\311\314\317.=J\276'\070E\002-=I\310\312\314\217\377\377\377\003"
"\376\376\376\262\265\270(\071F\221'\070E\002.=J\311\314\317\216\377\377\377\002"
"\374\374\375\211\217\224\243'\070E\002\060?K\315\320\322\217\377\377\377\002\300"
"\302\304)\071F\243'\070E\002s{\202\374\374\374\216\377\377\377\002\374\374\374"
"\177\207\215\220'\070E\003(\071F\260\262\266\376\376\376\220\377\377\377\002\360"
"\360\361NXa\256'\070E\002\066CO\322\324\326\221\377\377\377\002\315\317\321\060"
"?K\377'\070E\271'\070E\002\200\207\215\374\374\374\216\377\377\377\002\311\314"
"\317.=J\276'\070E\002OYa\367\370\370\217\377\377\377\002\371\371\372Xbj\222'\070"
"E\002.=J\311\314\317\216\377\377\377\002\374\374\375\211\217\224\243'\070E\002\060"
"?K\315\320\322\217\377\377\377\002\300\302\304)\071F\243'\070E\002IS\\\371\372"
"\372\216\377\377\377\002\375\375\375\227\234\241\220'\070E\002;GR\341\343\344"
"\220\377\377\377\002\374\374\374\214\222\226\260'\070E\002Ybj\366\366\367\220"
"\377\377\377\002\372\372\372Xbj\377'\070E\271'\070E\002\200\207\215\374\374\374"
"\216\377\377\377\002\311\314\317.=J\276'\070E\002\246\251\255\376\376\376\217"
"\377\377\377\002\316\320\322\060?K\222'\070E\002.=J\311\314\317\216\377\377\377"
"\002\374\374\375\211\217\224\243'\070E\002\060?K\315\320\322\217\377\377\377\002"
"\300\302\304)\071F\243'\070E\002<HR\345\347\350\216\377\377\377\002\376\376\376"
"\251\255\260\220'\070E\002s{\202\373\374\374\220\377\377\377\002\312\314\317\060"
"?K\260'\070E\003(\071F\253\256\261\376\376\376\217\377\377\377\002\376\376\376"
"\255\260\263\377'\070E\271'\070E\002\200\207\215\374\374\374\216\377\377\377"
"\002\311\314\317.=J\275'\070E\002\066DO\331\333\335\217\377\377\377\002\375\375\375"
"\217\225\232\223'\070E\002.=J\311\314\317\216\377\377\377\002\374\374\375\211"
"\217\224\243'\070E\002\060?K\315\320\322\217\377\377\377\002\300\302\304)\071F\243"
"'\070E\002\070EP\335\337\341\216\377\377\377\002\376\376\376\256\261\264\217'\070"
"E\002):F\276\300\303\220\377\377\377\002\371\371\371_hp\262'\070E\002?KU\345\346"
"\347\220\377\377\377\002\330\332\334\066CN\377'\070E\270'\070E\002\200\207\215\374"
"\374\374\216\377\377\377\002\311\314\317.=J\275'\070E\002jsz\373\373\373\217\377"
"\377\377\002\357\360\361DNX\223'\070E\002.=J\311\314\317\216\377\377\377\002\374"
"\374\375\211\217\224\243'\070E\002\060?K\315\320\322\217\377\377\377\002\300\302"
"\304)\071F\243'\070E\002:FQ\340\342\344\216\377\377\377\002\376\376\376\253\256"
"\261\217'\070E\002;GR\342\344\346\220\377\377\377\002\301\304\306+;H\263'\070E"
"\002\230\235\241\375\375\375\217\377\377\377\002\372\372\373Xbj\377'\070E\270"
"'\070E\002\200\207\215\374\374\374\216\377\377\377\002\311\314\317.=J\274'\070"
"E\002):G\277\301\303\220\377\377\377\002\277\301\303*:G\223'\070E\002.=J\311\314"
"\317\216\377\377\377\002\374\374\375\211\217\224\243'\070E\002\060?K\315\320\322"
"\217\377\377\377\002\300\302\304)\071F\243'\070E\002ALV\360\361\361\216\377\377"
"\377\002\375\376\376\240\245\250\217'\070E\002ajr\373\373\373\217\377\377\377"
"\002\371\372\372ajr\264'\070E\002?JT\347\350\352\217\377\377\377\002\375\375\375"
"\235\241\245\377'\070E\270'\070E\002\200\207\215\374\374\374\216\377\377\377"
"\002\311\314\317.=J\274'\070E\002CNX\356\357\360\217\377\377\377\002\373\373\373"
"kt{\224'\070E\002.=J\311\314\317\216\377\377\377\002\374\374\375\211\217\224\243"
"'\070E\002\060?K\315\320\322\217\377\377\377\002\300\302\304)\071F\243'\070E\002Xb"
"j\373\373\373\216\377\377\377\002\374\375\375\212\221\225\217'\070E\002\245\251"
"\254\376\376\376\217\377\377\377\002\315\320\322\060?K\264'\070E\003(\071E\261\264"
"\266\376\376\376\217\377\377\377\002\306\311\313,<I\377'\070E\267'\070E\002\200"
"\207\215\374\374\374\216\377\377\377\002\311\314\317.=J\274'\070E\002\216\224"
"\230\375\375\375\217\377\377\377\002\332\334\335\067DO\224'\070E\002.=J\311\314"
"\317\216\377\377\377\002\374\374\375\211\217\224\243'\070E\002\060?K\315\320\322"
"\217\377\377\377\002\300\302\304)\071F\243'\070E\002\225\232\237\375\375\375\216"
"\377\377\377\002\373\374\374nw~\216'\070E\002,<H\306\310\313\217\377\377\377\002"
"\374\375\375\214\222\230\266'\070E\002U_h\371\371\372\217\377\377\377\002\344"
"\346\350<HR\377'\070E\267'\070E\002\200\207\215\374\374\374\216\377\377\377\002"
"\311\314\317.=J\273'\070E\002\060?K\315\320\322\217\377\377\377\002\376\376\376"
"\247\252\256\225'\070E\002.=J\311\314\317\216\377\377\377\002\374\374\375\211"
"\217\224\243'\070E\002\060?K\315\320\322\217\377\377\377\002\300\302\304)\071F\242"
"'\070E\002/>J\313\316\320\217\377\377\377\002\372\372\373Q[d\216'\070E\002;GQ\342"
"\344\345\217\377\377\377\002\363\364\365FQZ\266'\070E\002\062@L\321\324\326\217"
"\377\377\377\002\372\373\373Wai\377'\070E\267'\070E\002\200\207\215\374\374\374"
"\216\377\377\377\002\311\314\317.=J\273'\070E\002Wai\371\372\372\217\377\377\377"
"\002\367\370\370OYb\225'\070E\002.=J\311\314\317\216\377\377\377\002\374\374\375"
"\211\217\224\243'\070E\002\060?K\315\320\322\217\377\377\377\002\300\302\304)\071"
"F\242'\070E\002\\em\371\372\372\217\377\377\377\002\347\350\351=IS\216'\070E\002"
"MW`\372\372\372\217\377\377\377\002\344\346\350\240\247\254\267\236\245\252"
"\001\324\326\330\217\377\377\377\002\374\374\374\201\210\216\377'\070E\267'\070"
"E\002\200\207\215\374\374\374\216\377\377\377\002\311\314\317.=J\272'\070E\003("
"\071F\261\264\267\376\376\376\217\377\377\377\002\310\312\314-=I\225'\070E\002"
".=J\311\314\317\216\377\377\377\002\374\374\375\211\217\224\243'\070E\002\060?"
"K\315\320\322\217\377\377\377\002\300\302\304)\071F\241'\070E\002-<I\304\307\311"
"\220\377\377\377\002\312\314\317.>J\216'\070E\002qy\200\373\374\374\330\377\377"
"\377\002\376\376\376\261\264\266\377'\070E\267'\070E\002\200\207\215\374\374\374"
"\216\377\377\377\002\311\314\317.=J\272'\070E\002:GQ\340\342\344\217\377\377\377"
"\002\374\374\374\202\211\216\226'\070E\002.=J\311\314\317\216\377\377\377\002\374"
"\374\375\211\217\224\243'\070E\002\060?K\315\320\322\217\377\377\377\002\300\302"
"\304)\071F\241'\070E\002}\204\212\373\373\373\217\377\377\377\002\376\376\376\252"
"\256\260\217'\070E\002\226\233\237\375\375\375\331\377\377\377\002\302\304\306"
"*:G\377'\070E\266'\070E\002\200\207\215\374\374\374\216\377\377\377\002\311\314"
"\317.=J\272'\070E\002w\177\205\374\374\374\217\377\377\377\002\347\351\352>JT"
"\226'\070E\002.=J\311\314\317\216\377\377\377\002\374\374\375\211\217\224\243"
"'\070E\002\060?K\315\320\322\217\377\377\377\002\300\302\304)\071F\240'\070E\002V_"
"g\357\360\360\220\377\377\377\002\372\373\373ajr\217'\070E\001\267\272\273\332"
"\377\377\377\002\315\320\322\060?K\377'\070E\266'\070E\002\200\207\215\374\374\374"
"\216\377\377\377\002\311\314\317.=J\271'\070E\002+;H\303\306\310\220\377\377\377"
"\002\271\273\276(\071F\226'\070E\002.=J\311\314\317\216\377\377\377\002\374\374\375"
"\211\217\224\243'\070E\002\060?K\315\320\322\217\377\377\377\002\300\302\304)\071"
"F\237'\070E\002Q[c\345\346\350\221\377\377\377\002\334\336\340\070EP\216'\070E\002"
"):G\301\303\305\332\377\377\377\002\333\335\337\067DO\377'\070E\266'\070E\002\200"
"\207\215\374\374\374\216\377\377\377\002\311\314\317.=J\271'\070E\002IT]\364\365"
"\365\217\377\377\377\002\372\372\372_iq\227'\070E\002.=J\311\314\317\216\377\377"
"\377\002\374\374\375\211\217\224\243'\070E\002\060?K\315\320\322\217\377\377\377"
"\002\300\302\304)\071F\235'\070E\003(\071Fgow\356\357\360\221\377\377\377\003\376"
"\376\376\256\261\264(\070E\216'\070E\002-<I\307\311\314\332\377\377\377\002\346"
"\350\351=IS\377'\070E\266'\070E\002\200\207\215\374\374\374\216\377\377\377\002"
"\311\314\317.=J\271'\070E\002\234\240\244\375\375\375\217\377\377\377\002\322"
"\325\327\063AL\227'\070E\002.=J\311\314\317\216\377\377\377\002\374\374\375\211"
"\217\224\243'\070E\002\060?K\315\320\322\217\377\377\377\002\300\302\304)\071F\234"
"'\070E\003@LV\261\265\270\372\373\373\222\377\377\377\002\370\370\370Q[d\217'"
"\070E\002\060?K\315\320\322\332\377\377\377\002\363\364\365CMV\377'\070E\266'\070"
"E\002\200\207\215\374\374\374\216\377\377\377\002\311\314\317.=J\270'\070E\002\063"
"AM\324\326\330\217\377\377\377\002\375\375\375\232\236\242\230'\070E\002.=J\311"
"\314\317\216\377\377\377\002\374\374\375\211\217\224\243'\070E\002\060?K\315\320"
"\322\217\377\377\377\002\300\302\304)\071F\230'\070E\005(\071F\065CNW`h\262\266\272"
"\367\370\370\224\377\377\377\002\301\304\306+;H\217'\070E\002\062@L\320\323\325"
"\332\377\377\377\002\367\367\367DNW\377'\070E\266'\070E\002\200\207\215\374\374"
"\374\216\377\377\377\002\311\314\317.=J\270'\070E\002bkr\372\372\373\217\377\377"
"\377\002\364\364\365HS\\\230'\070E\002.=J\311\314\317\216\377\377\377\002\374\374"
"\375\211\217\224\243'\070E\002\060?K\315\320\322\217\377\377\377\002\344\345\347"
"\274\301\304\226\274\300\304\005\275\302\305\317\323\325\357\360\360\367\370"
"\370\375\375\375\225\377\377\377\002\371\371\371^go\220'\070E\002\064BM\324\327"
"\331\332\377\377\377\002\372\372\373FPX\377'\070E\266'\070E\002\200\207\215\374"
"\374\374\216\377\377\377\002\311\314\317.=J\267'\070E\002(\071F\272\274\277\220"
"\377\377\377\002\302\305\307+;H\230'\070E\002.=J\311\314\317\216\377\377\377\002"
"\374\374\375\211\217\224\243'\070E\002\060?K\315\320\322\301\377\377\377\002\275"
"\277\302*;G\220'\070E\002\062@L\321\324\326\332\377\377\377\002\362\363\363BMV"
"\377'\070E\266'\070E\002\200\207\215\374\374\374\216\377\377\377\002\311\314\317"
".=J\267'\070E\002?KU\351\352\353\217\377\377\377\002\373\374\374u}\203\231'\070"
"E\002.=J\311\314\317\216\377\377\377\002\374\374\375\211\217\224\243'\070E\002\060"
"?K\315\320\322\300\377\377\377\002\357\360\360KV^\221'\070E\002\060?K\315\320\322"
"\332\377\377\377\002\327\331\333\065CN\377'\070E\266'\070E\002\200\207\215\374\374"
"\374\216\377\377\377\002\311\314\317.=J\267'\070E\002\204\212\220\374\374\374"
"\217\377\377\377\002\337\341\342:FQ\231'\070E\002.=J\311\314\317\216\377\377\377"
"\002\374\374\375\211\217\224\243'\070E\002\060?K\315\320\322\277\377\377\377\003"
"\374\374\374\216\224\230(\070E\221'\070E\002-=I\311\313\316\331\377\377\377\003"
"\376\376\376\265\267\272(\071F\377'\070E\266'\070E\002\200\207\215\374\374\374"
"\216\377\377\377\002\311\314\317.=J\266'\070E\002.=I\310\313\315\217\377\377\377"
"\003\376\376\376\260\262\265(\070E\231'\070E\002.=J\311\314\317\216\377\377\377"
"\002\374\374\375\211\217\224\243'\070E\002\060?K\315\320\322\277\377\377\377\002"
"\303\305\310.=I\222'\070E\002*;G\303\305\307\331\377\377\377\002\365\366\366R"
"\\d\377'\070E\267'\070E\002\200\207\215\374\374\374\216\377\377\377\002\311\314"
"\317.=J\266'\070E\002PZc\370\370\371\217\377\377\377\002\371\371\372U_g\232'\070"
"E\002.=J\311\314\317\216\377\377\377\002\374\374\375\211\217\224\243'\070E\002\060"
"?K\315\320\322\276\377\377\377\002\336\340\342ALV\224'\070E\001\275\277\301\330"
"\377\377\377\003\375\375\375\241\245\251(\071F\377'\070E\267'\070E\002\200\207\215"
"\374\374\374\216\377\377\377\002\311\314\317.=J\266'\070E\002\251\254\260\376"
"\376\376\217\377\377\377\002\314\317\321\060>J\232'\070E\002.=J\311\314\317\216"
"\377\377\377\002\374\374\375\211\217\224\243'\070E\002\060?K\315\320\322\275\377"
"\377\377\002\356\357\360U_g\225'\070E\002\240\244\250\375\375\376\326\377\377"
"\377\003\375\375\375\264\270\273-=I\377'\070E\270'\070E\002\200\207\215\374\374"
"\374\216\377\377\377\002\311\314\317.=J\265'\070E\002\067DO\333\335\337\217\377"
"\377\377\002\374\375\375\215\223\230\233*:G\002\060?K\312\315\317\216\377\377"
"\377\002\374\374\375\211\217\225\217*:G\001(\071F\223'\070E\002\060?K\315\320\322"
"\274\377\377\377\002\363\363\364cks\226'\070E\002}\204\212\374\374\374\325\377"
"\377\377\003\365\365\365\210\216\224+;H\377'\070E\271'\070E\002\200\207\215\374"
"\374\374\216\377\377\377\002\311\314\317.=J\265'\070E\002mv}\373\373\373\220\377"
"\377\377\001\365\366\366\233\364\364\365\002\364\365\365\373\373\373\217\377"
"\377\377\001\367\367\370\217\364\364\365\004\363\363\363\307\313\316px\177\064"
"BM\220'\070E\002\060?K\315\320\322\273\377\377\377\002\362\363\364cls\227'\070E"
"\002U_h\373\373\373\217\377\377\377\001\374\375\375\302\370\370\370\004\365\366"
"\366\312\316\320{\203\211<HS\377'\070E\273'\070E\002\200\207\215\374\374\374"
"\216\377\377\377\002\311\314\317.=J\264'\070E\002*:G\277\302\304\320\377\377\377"
"\004\376\376\376\356\357\360s{\201)\071F\216'\070E\002\060?K\315\320\322\272\377"
"\377\377\002\347\350\351Wai\230'\070E\002?JT\353\355\355\217\377\377\377\002\347"
"\350\351?KU\301*;H\001(\071F\377'\070E\276'\070E\002\200\207\215\374\374\374\216"
"\377\377\377\002\311\314\317.=J\264'\070E\002DOY\360\361\362\322\377\377\377\003"
"\372\373\373\235\241\246):F\215'\070E\002\060?K\315\320\322\270\377\377\377\003"
"\376\376\376\315\320\322CNX\231'\070E\002\060?K\314\317\321\217\377\377\377\002"
"\373\374\374qy\200\377'\070E\377'\070E\003'\070E\200\207\215\374\374\374\216\377"
"\377\377\002\311\314\317.=J\264'\070E\002\222\227\234\375\375\375\323\377\377"
"\377\002\371\372\372|\203\211\215'\070E\002\060?K\315\320\322\267\377\377\377\003"
"\371\371\372\226\234\240/>J\233'\070E\002\265\270\272\376\377\377\217\377\377"
"\377\002\301\303\306+;G\377'\070E\377'\070E\002\200\207\215\374\374\374\216\377"
"\377\377\002\311\314\317.=J\263'\070E\002\061@K\317\321\323\325\377\377\377\002\342"
"\343\345<HR\214'\070E\002\060?K\315\320\322\265\377\377\377\003\375\375\375\320"
"\322\324R\\d\235'\070E\002t|\202\374\374\374\217\377\377\377\002\364\364\365K"
"U^\377'\070E\377'\070E\002\200\207\215\374\374\374\216\377\377\377\002\311\314"
"\317.=J\263'\070E\002V`i\371\371\372\325\377\377\377\002\374\374\375\206\215\222"
"\214'\070E\002\060?K\315\320\322\265\377\377\377\002\324\326\330\066DO\236'\070E"
"\002BMW\357\360\361\217\377\377\377\003\376\376\376\255\260\263(\071F\377'\070"
"E\376'\070E\002\200\207\215\374\374\374\216\377\377\377\002\311\314\317.=J\263"
"'\070E\002\233\237\244\375\375\375\326\377\377\377\002\300\303\305):G\213'\070"
"E\002\060?K\315\320\322\265\377\377\377\003\375\375\375\236\242\246(\071F\235'"
"\070E\002-<I\306\311\313\220\377\377\377\002\357\360\361GR[\377'\070E\376'\070E"
"\002\200\207\215\374\374\374\216\377\377\377\002\311\314\317.=J\262'\070E\002(\070"
"E\275\277\301\327\377\377\377\002\317\321\324\061?K\213'\070E\002\060?K\315\320"
"\322\266\377\377\377\002\364\365\365T^g\236'\070E\002\213\221\226\374\375\375"
"\217\377\377\377\003\376\376\376\266\272\274):F\377'\070E\375'\070E\002\200\207"
"\215\374\374\374\216\377\377\377\002\311\314\317.=J\262'\070E\002(\071F\277\301"
"\303\327\377\377\377\002\321\324\326\062@L\213'\070E\002\060?K\315\320\322\217\377"
"\377\377\001\363\363\364\224\343\345\346\001\363\363\364\222\377\377\377\002\314"
"\317\321\062@L\235'\070E\002FQZ\361\362\362\220\377\377\377\002\370\370\370bks"
"\377'\070E\375'\070E\002\200\207\215\374\374\374\216\377\377\377\002\311\314\317"
".=J\263'\070E\002\260\262\265\376\376\376\326\377\377\377\002\307\312\314-<I\213"
"'\070E\002\060?K\315\320\322\217\377\377\377\002\300\302\304(\071F\222&\067E\003&\070"
"Emu|\372\372\372\221\377\377\377\003\375\375\375\233\237\243(\070E\234'\070E"
"\002*:G\301\303\305\221\377\377\377\002\327\331\333\070EP\377'\070E\374'\070E\002"
"\200\207\215\374\374\374\216\377\377\377\002\311\314\317.=J\263'\070E\002s{\202"
"\373\374\374\325\377\377\377\002\376\376\376\251\254\260\214'\070E\002\060?K\315"
"\320\322\217\377\377\377\002\300\302\304)\071F\223'\070E\003*:G\270\272\275\376"
"\376\376\221\377\377\377\002\364\364\365T^f\235'\070E\002ks{\373\373\373\220\377"
"\377\377\003\376\376\376\263\266\271*:G\260'\070E\002)\071F(\071F\377'\070E\311'"
"\070E\002\200\207\215\374\374\374\216\377\377\377\002\311\314\317.=J\263'\070E"
"\002;GR\340\342\343\325\377\377\377\002\367\370\370S]e\214'\070E\002\060?K\315\320"
"\322\217\377\377\377\002\300\302\304)\071F\224'\070E\002?KU\340\342\343\222\377"
"\377\377\002\313\316\320\062@L\234'\070E\002\062AL\321\324\326\221\377\377\377\003"
"\372\373\373\212\220\225(\071E\253'\070E\011(\071FCNX\222\231\237\337\340\341"
"\361\362\362\360\360\361\307\312\315nv~\063AL\377'\070E\306'\070E\002\200\207"
"\215\374\374\374\216\377\377\377\002\311\314\317.=J\264'\070E\002\214\221\226"
"\374\374\374\323\377\377\377\003\376\376\376\266\271\274*:G\214'\070E\002\060?"
"K\315\320\322\217\377\377\377\002\300\302\304)\071F\225'\070E\002rz\200\372\372"
"\373\221\377\377\377\003\375\375\375\232\237\243(\070E\234'\070E\002\205\213\220"
"\374\374\374\221\377\377\377\002\367\367\367lt{\252'\070E\003\066DO\267\274\277"
"\370\371\371\205\377\377\377\004\376\376\377\357\360\360z\202\207):F\377'\070"
"E\304'\070E\002\200\207\215\374\374\374\216\377\377\377\002\311\314\317.=J\264"
"'\070E\003-<I\272\275\300\376\376\376\322\377\377\377\002\323\325\327\071FQ\215"
"'\070E\002\060?K\315\320\322\217\377\377\377\002\300\302\304)\071F\225'\070E\003*;"
"G\270\273\276\376\376\376\221\377\377\377\002\363\364\364S]e\234'\070E\002\066"
"CN\327\331\333\222\377\377\377\002\364\364\365clt\250'\070E\002EPZ\333\335\336"
"\211\377\377\377\003\373\373\374\250\254\257*;G\377'\070E\303'\070E\002\200\207"
"\215\374\374\374\216\377\377\377\002\311\314\317.=J\265'\070E\003/?K\256\262\266"
"\374\374\374\317\377\377\377\003\375\376\376\311\314\316>JT\216'\070E\002\060?"
"K\315\320\322\217\377\377\377\002\300\302\304)\071F\226'\070E\002@LV\340\342\344"
"\222\377\377\377\002\313\316\320\061@L\234'\070E\002\201\207\215\374\374\374\222"
"\377\377\377\003\365\365\366kt{(\070E\245'\070E\002KV_\343\344\345\213\377\377"
"\377\002\373\373\373\223\227\234\377'\070E\303'\070E\002\200\207\215\374\374\374"
"\216\377\377\377\002\311\314\317.=J\266'\070E\005(\071F`ho\315\320\322\372\372"
"\373\375\375\375\251\376\376\376\220\377\377\377\220\376\376\376\005\375\375"
"\375\373\373\373\337\341\342sz\200,<H\217'\070E\002\060?K\315\320\322\217\377"
"\377\377\002\300\302\304)\071F\227'\070E\002sz\201\372\373\373\221\377\377\377"
"\003\375\375\375\231\236\242(\070E\233'\070E\002\061@K\315\320\322\223\377\377\377"
"\003\367\370\370\213\221\226):G\242'\070E\003(\070E_hp\356\357\357\215\377\377"
"\377\002\360\361\361HR\\\377'\070E\302'\070E\002\200\207\215\374\374\374\216\377"
"\377\377\002\311\314\317.=J\271'\070E\003:HSU^fahn\247bio\002elr\320\323\325\216"
"\377\377\377\002\375\375\375\234\240\245\216bio\004ahoYahAMW(\071F\221'\070E\002"
"\060?K\315\320\322\217\377\377\377\002\300\302\304)\071F\227'\070E\003*;G\271\274"
"\276\376\376\376\221\377\377\377\002\363\364\364R\\e\234'\070E\002cls\371\371"
"\372\223\377\377\377\003\374\374\374\267\273\276\064BM\240'\070E\003+;H\221\227"
"\234\367\370\370\216\377\377\377\002\376\376\376\250\254\257\377'\070E\302'"
"\070E\002\200\207\215\374\374\374\216\377\377\377\002\311\314\317.=J\343'\070E"
"\002.=J\311\314\317\216\377\377\377\002\374\374\375\211\217\224\243'\070E\002\060"
"?K\315\320\322\217\377\377\377\002\300\302\304)\071F\230'\070E\002@LV\341\343\344"
"\222\377\377\377\002\312\315\317\061@L\233'\070E\003):F\261\264\270\376\376\376"
"\224\377\377\377\003\345\346\347_hq(\071F\235'\070E\003FQ[\317\322\324\375\375"
"\376\220\377\377\377\002\317\321\323\061@K\377'\070E\301'\070E\002\200\207\215\374"
"\374\374\216\377\377\377\002\311\314\317.=J\343'\070E\002.=J\311\314\317\216\377"
"\377\377\002\374\374\375\211\217\224\243'\070E\002\060?K\315\320\322\217\377\377"
"\377\002\300\302\304)\071F\231'\070E\002t{\201\372\373\373\221\377\377\377\003\375"
"\375\375\231\235\242(\070E\233'\070E\002=IT\335\337\340\225\377\377\377\003\372"
"\372\373\301\304\307AMW\232'\070E\003\064BN\240\245\251\366\366\367\222\377\377"
"\377\002\351\352\353>IS\377'\070E\301'\070E\002\200\207\215\374\374\374\216\377"
"\377\377\002\311\314\317.=J\343'\070E\002.=J\311\314\317\216\377\377\377\002\374"
"\374\375\211\217\224\243'\070E\002\060?K\315\320\322\217\377\377\377\002\300\302"
"\304)\071F\231'\070E\003+;G\271\274\277\376\376\376\221\377\377\377\002\363\364"
"\364R\\d\234'\070E\002gov\370\371\371\226\377\377\377\004\367\367\367\267\273"
"\277DOY)\071F\225'\070E\003\070EP\227\235\242\362\362\363\224\377\377\377\002\360"
"\361\362ALV\377'\070E\301'\070E\002\200\207\215\374\374\374\216\377\377\377\002"
"\311\314\317.=J\343'\070E\002.=J\311\314\317\216\377\377\377\002\374\374\375\211"
"\217\224\243'\070E\002\060?K\315\320\322\217\377\377\377\002\300\302\304)\071F\232"
"'\070E\002ALV\341\343\344\222\377\377\377\002\311\314\316\060?K\233'\070E\003)\071"
"F\235\242\246\375\375\375\227\377\377\377\005\371\371\372\331\333\335ow\177"
"\066CN(\071F\217'\070E\004\061?K[em\307\312\315\365\366\366\226\377\377\377\002\343"
"\345\347;GR\377'\070E\301'\070E\002\200\207\215\374\374\374\216\377\377\377\002"
"\333\336\337\207\217\226\252\205\215\225\005\205\215\224y\203\212U_i\065CN("
"\071E\264'\070E\002.=J\311\314\317\216\377\377\377\002\374\374\375\211\217\224"
"\243'\070E\002\060?K\315\320\322\217\377\377\377\002\300\302\304)\071F\233'\070E"
"\002u|\202\373\373\373\221\377\377\377\002\374\375\375\226\232\237\234'\070E\002"
".=J\303\306\310\232\377\377\377\007\365\366\366\342\344\345\232\241\246T_g"
":GQ\061?K+;H\202(\071F\012'\070E(\071F*;G/>J\067DOJU^\206\216\225\326\331\332\363"
"\363\364\375\376\376\230\377\377\377\002\311\314\316.=I\377'\070E\301'\070E\002"
"\200\207\215\374\374\374\275\377\377\377\003\365\365\366\302\305\310@LV\263"
"'\070E\002.=J\311\314\317\216\377\377\377\002\374\374\375\211\217\224\243'\070"
"E\002\060?K\315\320\322\217\377\377\377\002\300\302\304)\071F\233'\070E\003+;G\273"
"\276\301\376\376\377\221\377\377\377\002\362\362\363OZc\234'\070E\002;HS\324\327"
"\330\235\377\377\377\004\370\371\371\363\363\364\360\360\361\356\357\357\202"
"\356\356\357\005\356\357\357\357\360\360\362\362\363\367\367\370\376\376\376"
"\233\377\377\377\002\375\375\375\221\227\233\377'\070E\302'\070E\002\200\207\215"
"\374\374\374\277\377\377\377\002\362\363\363ow~\262'\070E\002.=J\311\314\317\216"
"\377\377\377\002\374\374\375\211\217\224\243'\070E\002\060?K\315\320\322\217\377"
"\377\377\002\300\302\304)\071F\234'\070E\002BNW\343\345\346\222\377\377\377\002\310"
"\313\315\060?K\234'\070E\002KV^\343\345\346\302\377\377\377\002\336\340\341;HR"
"\377'\070E\302'\070E\002\200\207\215\374\374\374\300\377\377\377\002\365\366\366"
"fow\261'\070E\002.=J\311\314\317\216\377\377\377\002\374\374\375\211\217\224\243"
"'\070E\002\060?K\315\320\322\217\377\377\377\002\300\302\304)\071F\235'\070E\002w\177"
"\205\373\373\373\221\377\377\377\002\374\375\375\225\232\236\235'\070E\002U^f"
"\350\352\353\300\377\377\377\002\370\370\371lt{\377'\070E\303'\070E\002\200\207"
"\215\374\374\374\301\377\377\377\002\337\341\342;GR\260'\070E\002.=J\311\314\317"
"\216\377\377\377\002\374\374\375\211\217\224\243'\070E\002\060?K\315\320\322\217"
"\377\377\377\002\300\302\304)\071F\235'\070E\003+;H\274\277\301\376\376\377\221"
"\377\377\377\002\355\355\356CNX\235'\070E\002Zbj\350\352\353\276\377\377\377\003"
"\371\371\371z\201\207(\071F\377'\070E\303'\070E\002\200\207\215\374\374\374\301"
"\377\377\377\002\375\375\375\223\230\234\260'\070E\002.=J\311\314\317\216\377"
"\377\377\002\374\374\375\211\217\224\243'\070E\002\060?K\315\320\322\217\377\377"
"\377\002\300\302\304)\071F\236'\070E\002BNX\343\345\346\221\377\377\377\002\375\375"
"\375\231\235\242\236'\070E\002T]e\344\345\346\274\377\377\377\003\367\367\367"
"sz\200(\070E\377'\070E\304'\070E\002\200\207\215\374\374\374\302\377\377\377\002"
"\312\314\317.>J\257'\070E\002.=J\311\314\317\216\377\377\377\002\374\374\375\211"
"\217\224\243'\070E\002\060?K\315\320\322\217\377\377\377\002\300\302\304)\071F\237"
"'\070E\002x\177\206\373\373\373\221\377\377\377\002\307\312\314-<I\236'\070E\002"
"GR[\325\330\332\272\377\377\377\002\354\356\356dls\377'\070E\306'\070E\002\200"
"\207\215\374\374\374\302\377\377\377\002\346\347\350<HR\257'\070E\002.=J\311\314"
"\317\216\377\377\377\002\374\374\375\211\217\224\243'\070E\002\060?K\315\320\322"
"\217\377\377\377\002\300\302\304)\071F\237'\070E\003+;H\274\277\302\376\377\377"
"\220\377\377\377\002\330\332\334\065CN\237'\070E\003\067EP\275\301\303\375\375\376"
"\267\377\377\377\002\331\333\335PYb\377'\070E\307'\070E\002\203\212\217\374\374"
"\374\302\377\377\377\002\363\364\365CMV\257'\070E\002.=J\311\314\316\216\377\377"
"\377\002\374\374\375\210\217\224\243'\070E\002/>J\313\316\320\217\377\377\377"
"\002\300\302\304(\071F\240'\070E\002CNX\344\345\347\220\377\377\377\002\334\336\340"
"\067EO\240'\070E\003+;H\220\226\233\372\372\373\264\377\377\377\003\375\375\375"
"\267\272\275\066DO\377'\070E\310'\070E\002v~\205\374\374\374\302\377\377\377\002"
"\351\353\354>JT\257'\070E\002+;H\304\306\311\216\377\377\377\002\374\374\374~"
"\205\213\243'\070E\002+;H\304\306\310\217\377\377\377\001\266\270\273\242'\070"
"E\002y\200\206\373\373\373\217\377\377\377\002\317\322\324\061@K\242'\070E\002^f"
"m\337\341\343\262\377\377\377\003\362\362\363z\201\207)\071F\377'\070E\311'\070"
"E\002Q[c\372\372\372\302\377\377\377\002\317\322\324\061@K\260'\070E\002\262\264"
"\266\376\376\376\215\377\377\377\002\373\373\373Yck\244'\070E\002\245\251\254"
"\376\376\376\215\377\377\377\002\374\374\374\200\207\214\242'\070E\003+;H\275"
"\300\302\376\377\377\216\377\377\377\002\271\274\276(\071F\243'\070E\003\064BN\236"
"\243\247\373\373\373\256\377\377\377\003\375\375\375\277\303\305FQ[\377'\070"
"E\313'\070E\002\063AL\323\325\327\301\377\377\377\002\376\376\376\244\251\254\261"
"'\070E\002fov\373\373\373\215\377\377\377\002\333\335\337\067DO\244'\070E\002U_h\371"
"\371\372\215\377\377\377\002\354\355\356BNW\243'\070E\002COX\344\346\347\215\377"
"\377\377\002\373\373\373dlt\246'\070E\003U_f\312\315\320\375\375\376\252\377\377"
"\377\004\376\376\376\341\343\344ltz(\071F\377'\070E\315'\070E\002\205\213\220\374"
"\374\374\300\377\377\377\002\353\354\355FQZ\261'\070E\002\061@K\317\321\323\214"
"\377\377\377\002\375\375\375\226\233\240\245'\070E\002+;H\276\301\303\214\377"
"\377\377\003\375\376\376\245\251\254(\071F\244'\070E\002z\201\207\373\373\373\214"
"\377\377\377\002\306\310\313-=I\247'\070E\004(\071Fkry\330\333\334\376\376\376"
"\246\377\377\377\004\376\377\377\353\354\355\201\210\215\060?K\377'\070E\317"
"'\070E\002.=I\304\307\311\277\377\377\377\002\373\374\374\204\213\220\263'\070"
"E\002_go\365\365\366\213\377\377\377\002\320\322\324\063BM\246'\070E\002DOY\340\342"
"\343\213\377\377\377\002\321\324\325\065CO\245'\070E\003*:G\257\262\266\375\376"
"\376\212\377\377\377\002\342\344\345HS\\\252'\070E\004):Gkry\317\322\324\375\375"
"\375\242\377\377\377\004\376\376\376\343\345\346~\205\212\062AM\377'\070E\322"
"'\070E\003\067EP\313\315\317\376\376\376\274\377\377\377\003\373\374\374\224\231"
"\236):F\264'\070E\002v}\203\367\367\370\211\377\377\377\002\331\333\335EPZ\250"
"'\070E\002R\\d\337\341\343\210\377\377\377\003\376\377\377\321\323\325@MW\247"
"'\070E\003-=I\250\255\260\374\374\375\210\377\377\377\002\335\337\340Q[c\255'"
"\070E\005&\070EV_g\244\251\255\365\366\366\376\376\376\235\377\377\377\004\373"
"\374\374\273\300\303gou*;H\377'\070E\325'\070E\003.>J\222\230\235\365\366\366"
"\271\377\377\377\003\376\376\376\340\342\343iqx\267'\070E\003\\el\331\333\334"
"\376\376\376\205\377\377\377\003\374\374\374\257\263\266\071FQ\252'\070E\004\071"
"GR\243\250\253\371\371\372\376\376\377\203\377\377\377\004\376\376\376\363"
"\364\364\222\230\235\060?K\251'\070E\004(\071Ehpw\326\330\332\375\375\375\203"
"\377\377\377\004\376\376\376\363\363\364\225\232\237\065CN\260'\070E\006&\067D\062"
"AMlsy\260\265\271\365\365\366\376\376\376\226\377\377\377\006\376\376\376\373"
"\373\373\304\310\313z\200\206<JT%\067D\377'\070E\330'\070E\005&\067E\070FQtz\200"
"\233\241\246\261\267\273\263\267\274\300\005\266\273\300\254\261\266\217\225"
"\232bip*;H\271'\070E\011):Gdkr\233\241\246\307\313\316\322\325\330\272\277"
"\303\212\220\225KV_&\067E\254'\070E\011&\067D:HSqw}\216\225\232\231\237\244\214"
"\222\227krx\063BN&\067E\254'\070E\010&\067EIU^sx}\200\205\212{\200\205\\dl/?K"
"&\067E\264'\070E\010%\067D+<HYbi\205\213\220\272\277\303\362\363\364\375\375"
"\375\376\376\376\214\377\377\377\010\376\376\376\375\375\375\371\371\371\312"
"\315\320\220\225\232els\063BN%\066D\377'\070E\336'\070E\001&\067D\266%\067D\001&\070"
"E\275'\070E\001&\067D\202$\066C\001%\066D\262'\070E\002&\070E&\067D\360'\070E\025%\066D$"
"\066D;ITYbjty\177\206\214\221\225\233\241\246\254\261\261\266\272\267\274"
"\300\271\276\302\263\270\274\252\260\264\231\237\244\212\220\225y~\203`h"
"oBOY'\071F$\066C&\070E\377'\070E\377'\070E\377'\070E\377'\070E\207'\070E\003&\067E&"
"\067D%\067D\202%\066D\202%\067D\001&\067D\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377'\070E\377"
"'\070E\377'\070E\377'\070E\377'\070E\322'\070E",
};

View File

@@ -0,0 +1,21 @@
PKGDIR ?= ../..
L4DIR ?= $(PKGDIR)/../..
TARGET = fb-drv
SRC_CC_x86-l4f = vesa.cc
SRC_CC_amd64-l4f = vesa.cc
SRC_CC_arm-l4f = lcddrv.cc
SRC_CC_arm64-l4f = lcddrv.cc
SRC_CC = main.cc virtual.cc splash.cc
REQUIRES_LIBS_x86-l4f = x86emu_int10
REQUIRES_LIBS_amd64-l4f = x86emu_int10
REQUIRES_LIBS_arm-l4f = libdrivers-lcd
REQUIRES_LIBS_arm64-l4f = libdrivers-lcd
REQUIRES_LIBS = libc_support_misc libio-vbus
DEFINES = -DSPLASHNAME=gimp_image \
-DSPLASHNAME_RUN_LENGTH_DECODE=GIMP_IMAGE_RUN_LENGTH_DECODE
CPPFLAGS_splash.cc = -include $(PKGDIR)/server/data/splash1.c
include $(L4DIR)/mk/prog.mk

View File

@@ -0,0 +1,62 @@
/*
* (c) 2009 Adam Lackorzynski <adam@os.inf.tu-dresden.de>,
* Alexander Warg <warg@os.inf.tu-dresden.de>
* economic rights: Technische Universität Dresden (Germany)
*
* This file is part of TUD:OS and distributed under the terms of the
* GNU General Public License 2.
* Please see the COPYING-GPL-2 file for details.
*/
#pragma once
#include <l4/re/util/video/goos_svr>
#include <l4/re/util/object_registry>
#include <l4/re/util/dataspace_svr>
#include <l4/cxx/ipc_server>
class Prog_args
{
public:
Prog_args(int argc, char *argv[]);
int vbemode;
char *config_str;
bool do_virtual;
unsigned width;
unsigned height;
};
class Phys_fb :
public L4Re::Util::Video::Goos_svr,
public L4Re::Util::Dataspace_svr,
public L4::Epiface_t<Phys_fb, L4::Kobject_2t<void, L4Re::Dataspace, L4Re::Video::Goos> >
{
public:
using L4Re::Util::Video::Goos_svr::op_info;
using L4Re::Util::Dataspace_svr::op_info;
Phys_fb() : _vidmem_start(0), _map_done(0) {}
~Phys_fb() throw() {}
virtual bool setup_drv(Prog_args *pa, L4Re::Util::Object_registry *r) = 0;
void setup_ds(char const *name);
int map_hook(L4Re::Dataspace::Offset offs, unsigned order,
L4Re::Dataspace::Flags flags, L4Re::Dataspace::Map_addr *base,
unsigned *send_order) override;
bool running() { return _vidmem_start; };
static Phys_fb *probe();
static Phys_fb *get_virtual();
protected:
l4_addr_t _vidmem_start;
l4_addr_t _vidmem_end;
l4_addr_t _vidmem_size;
private:
bool _map_done;
};

View File

@@ -0,0 +1,79 @@
/*
* (c) 2009 Adam Lackorzynski <adam@os.inf.tu-dresden.de>
* economic rights: Technische Universität Dresden (Germany)
*
* This file is part of TUD:OS and distributed under the terms of the
* GNU General Public License 2.
* Please see the COPYING-GPL-2 file for details.
*/
#include <l4/drivers/lcd.h>
#include <l4/sys/cache.h>
#include <cstdio>
#include "fb.h"
#include "splash.h"
class Lcd_drv_fb : public Phys_fb
{
public:
bool setup_drv(Prog_args *pa, L4Re::Util::Object_registry *);
};
Phys_fb *Phys_fb::probe()
{
return new Lcd_drv_fb();
}
bool
Lcd_drv_fb::setup_drv(Prog_args *pa, L4Re::Util::Object_registry *)
{
struct arm_lcd_ops *lcd;
if (!(lcd = arm_lcd_probe(pa->config_str)))
{
printf("Could not find LCD.\n");
return false;
}
printf("Using LCD driver: %s\n", lcd->get_info());
_vidmem_start = (l4_addr_t)lcd->get_fb();
if (!_vidmem_start)
{
printf("Driver init failed\n");
return false;
}
_vidmem_size = lcd->get_video_mem_size();
_vidmem_end = _vidmem_start + _vidmem_size;
if (lcd->get_fbinfo((l4re_video_view_info_t *)&_view_info))
{
printf("Failed to get driver framebuffer info\n");
return false;
}
_screen_info.width = _view_info.width;
_screen_info.height = _view_info.height;
_screen_info.flags = L4Re::Video::Goos::F_auto_refresh;
_screen_info.pixel_info = _view_info.pixel_info;
_view_info.buffer_offset = 0;
init_infos();
lcd->enable();
splash_display(&_view_info, _vidmem_start);
#if defined(ARCH_arm64)
// slow
l4_cache_dma_coherent(_vidmem_start, _vidmem_start + _vidmem_size);
#else
l4_cache_dma_coherent_full();
#endif
return true;
}

View File

@@ -0,0 +1,146 @@
/*
* (c) 2009 Adam Lackorzynski <adam@os.inf.tu-dresden.de>,
* Alexander Warg <warg@os.inf.tu-dresden.de>,
* Torsten Frenzel <frenzel@os.inf.tu-dresden.de>
* economic rights: Technische Universität Dresden (Germany)
*
* This file is part of TUD:OS and distributed under the terms of the
* GNU General Public License 2.
* Please see the COPYING-GPL-2 file for details.
*/
#include <l4/sys/capability>
#include <l4/sys/typeinfo_svr>
#include <l4/re/util/br_manager>
#include <l4/re/dataspace>
#include <cstdio>
#include <getopt.h>
#include <cstdlib>
#include "fb.h"
static L4Re::Util::Registry_server<L4Re::Util::Br_manager_hooks> server;
void
Phys_fb::setup_ds(char const *name)
{
server.registry()->register_obj(this, name);
_fb_ds = L4::Cap<L4Re::Dataspace>(obj_cap().cap());
_ds_start = _vidmem_start;
_ds_size = _vidmem_size;
_rw_flags = L4Re::Dataspace::F::RW;
_cache_flags = L4::Ipc::Snd_fpage::Buffered;
}
int
Phys_fb::map_hook(L4Re::Dataspace::Offset /* offs */, unsigned /* order */,
L4Re::Dataspace::Flags /* flags */,
L4Re::Dataspace::Map_addr * /* base */,
unsigned * /* send_order */)
{
// map everything at once, a framebuffer will usually used fully
if (_map_done)
return 0;
int err;
L4::Cap<L4Re::Dataspace> ds;
unsigned long sz = 1;
L4Re::Rm::Offset off;
L4Re::Rm::Flags fl;
l4_addr_t a = _vidmem_start;
if ((err = L4Re::Env::env()->rm()->find(&a, &sz, &off, &fl, &ds)) < 0)
{
printf("Failed to query video memory: %d\n", err);
return err;
}
if ((err = ds->map_region(off, L4Re::Dataspace::F::RW,
_vidmem_start, _vidmem_end)) < 0)
{
printf("Failed to map video memory: %d\n", err);
return err;
}
_map_done = 1;
return 0;
}
Prog_args::Prog_args(int argc, char *argv[])
: vbemode(~0), config_str(0), do_virtual(false), width(0), height(0)
{
while (1)
{
struct option opts[] = {
{ "vbemode", required_argument, 0, 'm' },
{ "config", required_argument, 0, 'c' },
{ "virtual", no_argument, 0, 'V' },
{ "width", required_argument, 0, 'W' },
{ "height", required_argument, 0, 'H' },
{ 0, 0, 0, 0 },
};
int c = getopt_long(argc, argv, "m:c:V", opts, NULL);
if (c == -1)
break;
switch (c)
{
case 'm':
vbemode = strtol(optarg, 0, 0);
break;
case 'c':
config_str = optarg;
break;
case 'V':
do_virtual = true;
break;
case 'W':
width = strtoul(optarg, 0, 0);
break;
case 'H':
height = strtoul(optarg, 0, 0);
break;
default:
printf("Unknown option '%c'\n", c);
break;
}
}
}
int main(int argc, char *argv[])
{
Prog_args args(argc, argv);
Phys_fb *fb;
if (args.do_virtual)
fb = Phys_fb::get_virtual();
else
fb = Phys_fb::probe();
if (!fb->setup_drv(&args, server.registry()))
{
printf("Failed to setup framebuffer\n");
return 1;
}
fb->setup_ds("fb");
if (!fb->running())
{
printf("Failed to initialize framebuffer\n");
return 1;
}
if (!fb->obj_cap().is_valid())
{
printf("Failed to connect\n");
return 1;
}
printf("Starting server loop\n");
server.loop();
return 0;
}

View File

@@ -0,0 +1,92 @@
/*
* (c) 2010 Adam Lackorzynski <adam@os.inf.tu-dresden.de>
* economic rights: Technische Universität Dresden (Germany)
*
* This file is part of TUD:OS and distributed under the terms of the
* GNU General Public License 2.
* Please see the COPYING-GPL-2 file for details.
*/
#include <l4/re/video/colors>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include "splash.h"
static inline void
put_pixel(L4Re::Video::View::Info *fb_info, char *dest_pixel,
unsigned red, unsigned green, unsigned blue)
{
unsigned v;
v = (((red << 0) >> (8 - fb_info->pixel_info.r().size())) & ((1 << fb_info->pixel_info.r().size()) - 1)) << fb_info->pixel_info.r().shift();
v |= (((green << 8) >> (16 - fb_info->pixel_info.g().size())) & ((1 << fb_info->pixel_info.g().size()) - 1)) << fb_info->pixel_info.g().shift();
v |= (((blue << 16) >> (24 - fb_info->pixel_info.b().size())) & ((1 << fb_info->pixel_info.b().size()) - 1)) << fb_info->pixel_info.b().shift();
switch (fb_info->pixel_info.bytes_per_pixel())
{
case 1: *(unsigned char *)dest_pixel = v; break;
case 2: *(unsigned short *)dest_pixel = v; break;
case 3: memcpy(dest_pixel, &v, 3); break;
case 4: *(unsigned int *)dest_pixel = v; break;
};
}
void splash_display(L4Re::Video::View::Info *fb_info, l4_addr_t fbaddr)
{
if (fb_info->width < SPLASHNAME.width)
return;
if (fb_info->height < SPLASHNAME.height)
return;
int size = SPLASHNAME.width * SPLASHNAME.height;
unsigned char *buf = (unsigned char *)malloc(size * SPLASHNAME.bytes_per_pixel);
if (!buf)
return;
SPLASHNAME_RUN_LENGTH_DECODE(buf, SPLASHNAME.rle_pixel_data, size,
SPLASHNAME.bytes_per_pixel);
int off_x = (fb_info->width / 2) - (SPLASHNAME.width / 2);
int off_y = (fb_info->height / 2) - (SPLASHNAME.height / 2);
char *_fb = (char *)fbaddr;
char *a;
unsigned x;
// Fill first line
char *line_buffer = (char *)malloc(fb_info->bytes_per_line);
if (!line_buffer)
return;
// For simplicity, just take the first pixel as overall background
char *lb = line_buffer;
for (x = 0; x < fb_info->width;
++x, lb += fb_info->pixel_info.bytes_per_pixel())
put_pixel(fb_info, lb, buf[0], buf[1], buf[2]);
// Copy line all over
for (unsigned y = 0; y < fb_info->height;
++y, _fb += fb_info->bytes_per_line)
memcpy(_fb, line_buffer, fb_info->bytes_per_line);
free(line_buffer);
// Fill in logo
_fb = (char *)fbaddr + off_y * fb_info->bytes_per_line
+ off_x * fb_info->pixel_info.bytes_per_pixel();
int buf_idx = 0;
for (unsigned y = 0; y < SPLASHNAME.height;
++y, _fb += fb_info->bytes_per_line)
for (x = 0, a = _fb; x < SPLASHNAME.width;
++x, a += fb_info->pixel_info.bytes_per_pixel())
{
put_pixel(fb_info, a, buf[buf_idx], buf[buf_idx + 1], buf[buf_idx + 2]);
buf_idx += SPLASHNAME.bytes_per_pixel;
}
free(buf);
}

View File

@@ -0,0 +1,14 @@
/*
* (c) 2010 Adam Lackorzynski <adam@os.inf.tu-dresden.de>
* economic rights: Technische Universität Dresden (Germany)
*
* This file is part of TUD:OS and distributed under the terms of the
* GNU General Public License 2.
* Please see the COPYING-GPL-2 file for details.
*/
#pragma once
#include <l4/sys/types.h>
#include <l4/re/video/goos>
void splash_display(L4Re::Video::View::Info *fb_info, l4_addr_t fbaddr);

View File

@@ -0,0 +1,138 @@
/*
* (c) 2009 Adam Lackorzynski <adam@os.inf.tu-dresden.de>,
* Alexander Warg <warg@os.inf.tu-dresden.de>
* economic rights: Technische Universität Dresden (Germany)
*
* This file is part of TUD:OS and distributed under the terms of the
* GNU General Public License 2.
* Please see the COPYING-GPL-2 file for details.
*/
#include <l4/x86emu/int10.h>
#include <l4/vbus/vbus>
#include <l4/vbus/vbus_inhibitor.h>
#include <l4/re/env>
#include <l4/re/error_helper>
#include <l4/re/util/event>
#include <l4/re/event_enums.h>
#include "fb.h"
#include "splash.h"
#include <cstdio>
class Vesa_fb : public Phys_fb
{
private:
struct Vbus_handler : L4::Irqep_t<Vbus_handler>
{
Vbus_handler(Vesa_fb *f) : fb(f) {}
Vesa_fb *fb;
void handle_irq();
};
L4Re::Util::Event _vbus_event;
Vbus_handler _vbus_irq;
L4::Cap<L4vbus::Vbus> _vbus;
int _vbemode = 0;
public:
Vesa_fb() : _vbus_irq(this) {}
bool setup_drv(Prog_args *pa, L4Re::Util::Object_registry *r);
};
void Vesa_fb::Vbus_handler::handle_irq()
{
l4util_mb_vbe_ctrl_t vbe;
l4util_mb_vbe_mode_t vbi;
L4Re::Event_buffer::Event *e;
while ((e = fb->_vbus_event.buffer().next()) != NULL)
{
if (e->payload.type != L4RE_EV_PM)
continue;
switch (e->payload.code)
{
case L4VBUS_INHIBITOR_SUSPEND:
printf("Received suspend event.\n");
fb->_vbus->acquire(L4VBUS_INHIBITOR_WAKEUP, "restart video on wakeup");
fb->_vbus->L4Re::Inhibitor::release(L4VBUS_INHIBITOR_SUSPEND);
break;
case L4VBUS_INHIBITOR_WAKEUP:
printf("Received wakeup event.\n");
fb->_vbus->acquire(L4VBUS_INHIBITOR_SUSPEND, "GFX running");
fb->_vbus->L4Re::Inhibitor::release(L4VBUS_INHIBITOR_WAKEUP);
if (fb->_vbemode > 0)
{
int res = x86emu_int10_set_vbemode(fb->_vbemode, &vbe, &vbi);
if (res < 0)
printf("error: could not setup VESA mode on resume: %d\n", res);
}
break;
default:
break;
}
}
}
Phys_fb *Phys_fb::probe()
{
return new Vesa_fb();
}
bool
Vesa_fb::setup_drv(Prog_args *pa, L4Re::Util::Object_registry *r)
{
l4util_mb_vbe_ctrl_t vbe;
l4util_mb_vbe_mode_t vbi;
_vbus = L4Re::chkcap(L4Re::Env::env()->get_cap<L4vbus::Vbus>("vbus"), "request V-BUS cap");
_vbus_event.init<L4::Irq>(_vbus);
r->register_obj(&_vbus_irq, L4::cap_cast<L4::Irq>(_vbus_event.irq()));
_vbus->acquire(L4VBUS_INHIBITOR_SUSPEND, "GFX running");
int res = x86emu_int10_set_vbemode(pa->vbemode, &vbe, &vbi);
if (res < 0)
return false;
_vbemode = res;
_vidmem_size = 64*1024*vbe.total_memory;
_vidmem_start = 0;
int error;
error = L4Re::Env::env()->rm()->attach(&_vidmem_start, _vidmem_size,
L4Re::Rm::F::Search_addr | L4Re::Rm::F::Eager_map
| L4Re::Rm::F::RW,
_vbus, vbi.phys_base, 20);
if (error)
{
printf("map of gfx mem failed with error %d\n", error);
return false;
}
_vidmem_end = _vidmem_start + _vidmem_size;
_screen_info.width = vbi.x_resolution;
_screen_info.height = vbi.y_resolution;
_screen_info.flags = L4Re::Video::Goos::F_auto_refresh;
_screen_info.pixel_info = L4Re::Video::Pixel_info(&vbi);
_view_info.buffer_offset = 0; //base_offset;
_view_info.bytes_per_line = vbi.bytes_per_scanline;
init_infos();
printf("Framebuffer memory: phys: %x - %lx\n",
vbi.phys_base, vbi.phys_base + _vidmem_size);
printf(" virt: %lx - %lx\n",
_vidmem_start, _vidmem_start + _vidmem_size);
splash_display(&_view_info, _vidmem_start);
return true;
}

View File

@@ -0,0 +1,68 @@
/*
* (c) 2010 Adam Lackorzynski <adam@os.inf.tu-dresden.de>
* economic rights: Technische Universität Dresden (Germany)
*
* This file is part of TUD:OS and distributed under the terms of the
* GNU General Public License 2.
* Please see the COPYING-GPL-2 file for details.
*/
#include <sys/mman.h>
#include <cstdio>
#include <getopt.h>
#include <cstdlib>
#include "fb.h"
#include "splash.h"
class Virtual_fb : public Phys_fb
{
public:
bool setup_drv(Prog_args *pa, L4Re::Util::Object_registry *);
};
Phys_fb *Phys_fb::get_virtual()
{
return new Virtual_fb();
}
Phys_fb * __attribute__((weak))
Phys_fb::probe()
{
return new Virtual_fb();
}
bool
Virtual_fb::setup_drv(Prog_args *pa, L4Re::Util::Object_registry *)
{
_screen_info.width = (pa->width > 0) ? pa->width : 1024;
_screen_info.height = (pa->height > 0) ? pa->height : 768;
_screen_info.flags = L4Re::Video::Goos::F_auto_refresh;
_screen_info.pixel_info = L4Re::Video::Pixel_info(4, 8, 16, 8, 8, 8, 0);
_vidmem_size = _screen_info.width * _screen_info.height
* _screen_info.pixel_info.bytes_per_pixel();
_vidmem_size = l4_round_page(_vidmem_size);
void *v = mmap(0, _vidmem_size, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
if (v == MAP_FAILED)
return false;
_vidmem_start = (unsigned long)v;
_vidmem_end = _vidmem_start + _vidmem_size;
_view_info.buffer_offset = 0;
_view_info.bytes_per_line
= _screen_info.width * _screen_info.pixel_info.bytes_per_pixel();
init_infos();
printf("Virtual framebuffer: %lux%lu\n",
_screen_info.width, _screen_info.height);
splash_display(&_view_info, _vidmem_start);
return true;
}