From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 20177 invoked by alias); 31 May 2012 15:34:24 -0000 Received: (qmail 19992 invoked by uid 22791); 31 May 2012 15:34:22 -0000 X-SWARE-Spam-Status: No, hits=-6.6 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,KHOP_THREADED,RCVD_IN_DNSWL_HI,RCVD_IN_HOSTKARMA_W,TW_XZ,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mga02.intel.com (HELO mga02.intel.com) (134.134.136.20) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 31 May 2012 15:34:07 +0000 Content-Type: multipart/mixed; boundary="===============1886495617==" MIME-Version: 1.0 Received: from orsmga001.jf.intel.com ([10.7.209.18]) by orsmga101.jf.intel.com with ESMTP; 31 May 2012 08:34:06 -0700 X-ExtLoop1: 1 Received: from irsmsx103.ger.corp.intel.com ([163.33.3.157]) by orsmga001.jf.intel.com with ESMTP; 31 May 2012 08:34:05 -0700 Received: from irsmsx102.ger.corp.intel.com ([169.254.2.198]) by IRSMSX103.ger.corp.intel.com ([169.254.3.48]) with mapi id 14.01.0355.002; Thu, 31 May 2012 16:33:15 +0100 From: "Metzger, Markus T" To: Jan Kratochvil CC: "kettenis@gnu.org" , "gdb-patches@sourceware.org" , "markus.t.metzger@gmail.com" Subject: RE: [PATCH 08/16] linux, btrace: perf_event based branch tracing Date: Thu, 31 May 2012 15:34:00 -0000 Message-ID: References: <1337772151-20265-1-git-send-email-markus.t.metzger@intel.com> <1337772151-20265-9-git-send-email-markus.t.metzger@intel.com> <20120530204305.GG20633@host2.jankratochvil.net> In-Reply-To: <20120530204305.GG20633@host2.jankratochvil.net> MIME-Version: 1.0 X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2012-05/txt/msg01090.txt.bz2 --===============1886495617== MIME-Version: 1.0 Content-Language: en-US Content-Type: multipart/signed; protocol="application/x-pkcs7-signature"; micalg=SHA1; boundary="----=_NextPart_000_01D8_01CD3F53.747284B0" ------=_NextPart_000_01D8_01CD3F53.747284B0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-length: 7054 > -----Original Message----- > From: Jan Kratochvil [mailto:jan.kratochvil@redhat.com] > Sent: Wednesday, May 30, 2012 10:43 PM > To: Metzger, Markus T Thanks for your review! [...] > > +typedef unsigned char byte; > > Two spaces. There already exists gdb_byte. Gdb_byte is not available in gdb/common/. Is it OK to put the typedef into gdb/common/common-utils.h? > > + > > +/* A branch trace record in perf_event. */ struct perf_event_bts { > > + unsigned long long from; > > + unsigned long long to; > > 'long long' is forbidden in GDB, it will produce ARI script warnings. > uint64_t is OK. Fixed. Could we put this ARI script and maybe some style checker scripts into the gdb source tree? > > +}; > > + > > +/* A perf_event branch trace sample. */ struct perf_event_sample { > > + struct perf_event_header header; > > + struct perf_event_bts bts; > > GNU Coding Style forbids such alignment, just use: > struct perf_event_header header; > struct perf_event_bts bts; Fixed. > > +}; > > + > > +static inline volatile struct perf_event_mmap_page * > > +perf_event_header (struct btrace_target_info* tinfo) { > > + return tinfo->buffer; > > +} > > + > > +static inline size_t > > +perf_event_mmap_size (const struct btrace_target_info *tinfo) { > > + /* The branch trace buffer is preceded by a configuration page. */ > > + return ((tinfo->size + 1) * PAGE_SIZE); > > Excessive out parentheses. Multiple times. Fixed. > > +} > > + > > +static inline size_t > > +perf_event_buffer_size (struct btrace_target_info* tinfo) { > > + return (tinfo->size * PAGE_SIZE); > > +} > > + > > +static inline const byte * > > +perf_event_buffer_begin (struct btrace_target_info* tinfo) { > > + return ((const byte *) tinfo->buffer) + PAGE_SIZE; } > > + > > +static inline const byte * > > +perf_event_buffer_end (struct btrace_target_info* tinfo) { > > + return perf_event_buffer_begin (tinfo) + perf_event_buffer_size > > +(tinfo); } > > + > > +static inline int > > +perf_event_skip_record (struct btrace_target_info* tinfo, > > Formatting: > struct btrace_target_info *tinfo, Fixed. > > + const struct perf_event_bts *bts) { > > + if (tinfo->ptr_bits) > > + { > > + int shift = tinfo->ptr_bits - 1; > > + > > + /* Branch trace records branches from kernel space to user space. > > */ > > + if (bts->from & (1ull << shift)) > > long long again. Replaced with explicit type cast. > > + return 1; > > + > > + /* Branch trace records branches from user space to kernel space. > > */ > > + if (bts->to & (1ull << shift)) > > + return 1; > > + } > > + > > + return 0; > > +} > > + > > +static inline int > > +perf_event_check_sample (const struct perf_event_sample *sample) { > > + if (sample->header.type != PERF_RECORD_SAMPLE) > > + return EINVAL; > > Here everywhere some error with description would be easier than the error > codes passing in the callers. I'll fix this once it is clear whether this will also work with gdbserver. > > + > > + if (sample->header.size != sizeof (*sample)) > > + return EINVAL; > > + > > + return 0; > > +} > > + > > +/* Branch trace is collected in a circular buffer [begin; end) as pairs > > of from > > + and to addresses (plus some header). > > + > > + Start points into that buffer at the next sample position. > > + We read the collected samples backwards from start. > > + > > + While reading the samples, we convert the information into a list of > blocks. > > + For two adjacent samples s1 and s2, we form a block b such that > > b.begin > = > > + s1.to and b.end = s2.from. > > + > > + In case the buffer overflows during sampling, samples may be > > + split. */ > > Empty line. Fixed. > > +static int > > +perf_event_read_bts (struct btrace_target_info* tinfo, > > + const byte *begin, const byte *end, const byte > > *start, > > + int (*fun) (struct linux_btrace_block *, void *), > > + void *arg) > > +{ > > + struct perf_event_sample sample; > > + int read = 0, size = (end - begin), errcode = 0; > > + struct linux_btrace_block block = { 0, 0 }; > > + > > + if (start < begin) > > + return EINVAL; > > + > > + if (end < start) > > + return EINVAL; > > + > > + /* The buffer may contain a partial record as its last entry (i.e. when > > the > > + buffer size is not a mulitple of the sample size). */ read = > > + sizeof (sample) - 1; > > + > > + for (; read < size; read += sizeof (sample)) > > + { > > + const struct perf_event_sample *psample; > > + > > + /* Find the next perf_event sample. */ > > + start -= sizeof (sample); > > + if (begin <= start) > > + psample = (const struct perf_event_sample *) start; > > + else > > + { > > + int missing = (begin - start); > Empty line. Fixed. [...] > > +int > > +linux_btrace_has_changed (struct btrace_target_info *tinfo) { > > + volatile struct perf_event_mmap_page *header = perf_event_header > > +(tinfo); > Empty line. Fixed. > > + if (!header) > > + return 0; > > + > > + return (header->data_head != tinfo->data_head); } > > + > > +struct btrace_target_info * > > +linux_enable_btrace (ptid_t ptid) > > +{ > > + struct btrace_target_info *tinfo; > > + int pid; > > + > > + tinfo = xzalloc (sizeof (*tinfo)); > > + if (!tinfo) > > Remove, xzalloc can never return NULL. Fixed. [...] > > +#else /* HAVE_LINUX_PERF_EVENT_H */ > > GNU Coding Standards say here should be: > #else /* !HAVE_LINUX_PERF_EVENT_H */ > (they say "not" but GDB uses !) Fixed. [...] > > +#endif /* HAVE_LINUX_PERF_EVENT_H */ > > And !HAVE_LINUX_PERF_EVENT_H again. Fixed. [...] > > + /* The mmap configuration mapping the branch trace perf_event buffer. > > + > > + file .. the file descriptor > > + buffer .. the mmapped memory buffer > > + size .. the buffer's size in pages without the configuration > > page > > + data_head .. the data head from the last read */ > > + int file; > > + void *buffer; > > + size_t size; > > GNU Coding Style - no indentation of the names. Fixed. > > + unsigned long data_head; > > +#endif /* HAVE_LINUX_PERF_EVENT_H */ > > + > > + /* The size of a pointer in bits for this thread. > > + The information is used to identify kernel addresses in order to > > skip > > + records from/to kernel space. */ > > + int ptr_bits; > > +}; > > + > > +extern int linux_supports_btrace (void); extern struct > > +btrace_target_info *linux_enable_btrace (ptid_t); extern int > > +linux_disable_btrace (struct btrace_target_info *); extern int > > +linux_btrace_has_changed (struct btrace_target_info *); extern int > > +linux_read_btrace (struct btrace_target_info *, > > + int (*) (struct linux_btrace_block *, void > > *), > > + void *); > > Tabs, not spaces, everywhere. Fixed. Regards, Markus. ------=_NextPart_000_01D8_01CD3F53.747284B0 Content-Type: application/pkcs7-signature; name="smime.p7s" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7s" Content-length: 9801 MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEH AQAAoIIYeDCCAyAwggKJoAMCAQICBDXe9M8wDQYJKoZIhvcNAQEFBQAwTjEL MAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVxdWlm YXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTAeFw05ODA4MjIxNjQx NTFaFw0xODA4MjIxNjQxNTFaME4xCzAJBgNVBAYTAlVTMRAwDgYDVQQKEwdF cXVpZmF4MS0wKwYDVQQLEyRFcXVpZmF4IFNlY3VyZSBDZXJ0aWZpY2F0ZSBB dXRob3JpdHkwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMFdsVhnCGLu oJotHwhtkRRomAoe/toEbxOEYiHD0XzOnwXguAHwTjTs4oqVBGSs8WtTXwWz y2eAv0ICjv7dAQns4QAUT/z78AzdQ7pbK+EfgHCZFVeTFvEPl2q3wmgjHMxN WTCsUR47ryvW7mNFe8XZX1DS41APOojnvxT94Me5AgMBAAGjggEJMIIBBTBw BgNVHR8EaTBnMGWgY6BhpF8wXTELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0Vx dWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1 dGhvcml0eTENMAsGA1UEAxMEQ1JMMTAaBgNVHRAEEzARgQ8yMDE4MDgyMjE2 NDE1MVowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFEjmaPkr0rKV10fYIyAQ TzOYkJ/UMB0GA1UdDgQWBBRI5mj5K9KylddH2CMgEE8zmJCf1DAMBgNVHRME BTADAQH/MBoGCSqGSIb2fQdBAAQNMAsbBVYzLjBjAwIGwDANBgkqhkiG9w0B AQUFAAOBgQBYzinq/Pfetc4CuRe1hdG54+CVzCUxDQCmkm5/tpJjnlCV0Zpv 5BHeY4VumO6o/1rI01WyZnFX3sAh6z0qpyNJAQSGQnv87n+iFlK1Z2fTQNs7 JliyKHc9rhR3Ydb6KmYnoA36p3Nc6nDxlCFlRF/6/O8paKmih3nvee9PrAd3 ODCCAz0wggKmoAMCAQICAwWw/zANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQG EwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1 cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTA2MDIxNjE4MDEzMFoXDTE2 MDIxOTE4MDEzMFowUjELMAkGA1UEBhMCVVMxGjAYBgNVBAoTEUludGVsIENv cnBvcmF0aW9uMScwJQYDVQQDEx5JbnRlbCBFeHRlcm5hbCBCYXNpYyBQb2xp Y3kgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDBpd/XOb9Q VqEZ8mQ1042TdOIq3ATDIsV2xDyt30yLyMR5Wjtus0bn3B+he89BiNO/LP6+ rFzEwlD55PlX+HLGIKeNNG97dqyc30FElEUjZzTZFq2N4e3kVJ/XAEEgANzV 8v9qp7qWwxugPgfc3z9BkYot+CifozexHLb/hEZj+yISCU61kRZvuSQ0E11y YL4dRgcglJeaHo3oX57rvIckaLsYV5/1Aj+R8DM1Ppk965XQAKsHfnyT7C4S 50T4lVn4lz36wOdNZn/zegG1zp41lnoTFfT4KuKVJH5x7YD1p6KbgJCKLovn ujGuohquBNfdXKpZkvz6pGv+iC1HawJdAgMBAAGjgaAwgZ0wDgYDVR0PAQH/ BAQDAgEGMB0GA1UdDgQWBBQaxgxKxEdvqNutK/D0Vgaj7TdUDDA6BgNVHR8E MzAxMC+gLaArhilodHRwOi8vY3JsLmdlb3RydXN0LmNvbS9jcmxzL3NlY3Vy ZWNhLmNybDAfBgNVHSMEGDAWgBRI5mj5K9KylddH2CMgEE8zmJCf1DAPBgNV HRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4GBABMQOK2kVKVIlUWwLTdy wJ+e2O+PC/uQltK2F3lRyrPfBn69tOkIP4SgDJOfsxyobIrPLe75kBLw+Dom 13OBDp/EMZJZ1CglQfVV8co9mT3aZMjSGGQiMgkJLR3jMfr900fXZKj5XeqC J+JP0mEhJGEdVCY+FFlksJjV86fDrq1QMIIFijCCBHKgAwIBAgIKYR6AtwAA AAAABzANBgkqhkiG9w0BAQUFADBSMQswCQYDVQQGEwJVUzEaMBgGA1UEChMR SW50ZWwgQ29ycG9yYXRpb24xJzAlBgNVBAMTHkludGVsIEV4dGVybmFsIEJh c2ljIFBvbGljeSBDQTAeFw0wOTA1MTUxOTI1MTNaFw0xNTA1MTUxOTM1MTNa MFYxCzAJBgNVBAYTAlVTMRowGAYDVQQKExFJbnRlbCBDb3Jwb3JhdGlvbjEr MCkGA1UEAxMiSW50ZWwgRXh0ZXJuYWwgQmFzaWMgSXNzdWluZyBDQSAzQTCC ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMGPgGLnOO5IOzlHRfr1 XfCVb97V4BR2QVpPZ7CrcIQ+FGa2KHD/6dPjwxOIrtFTdfW4BYikdFmxUZVB WRWZ5Vye2cCdGzFWqIEOE1e17nNx1jM8Z6GZEqbDUS+vBuPlBFHKQoVm5BaN IHpyn2XZxqwjV9j5/crIfPrCGstk+2ztUhVS8OHEgzO784PgD9pOgBnnAbZH mEM1FYYmQ6ibS+gVCHzobDYG+YReRiHpFKWBxpUuP+X0WYFw/Ja1JW7N8pEL AFDw0UFBWFgiv1QIusdLvSy8mcsLJ5wy050OVcxShqoUxhw/wvyuuoQxvmEP jhRa1C2oSCmGN0003GMhQWMCAwEAAaOCAlwwggJYMA8GA1UdEwEB/wQFMAMB Af8wHQYDVR0OBBYEFKoWZq+3PVZTYK4Nwu3z7gfLUWB+MAsGA1UdDwQEAwIB hjASBgkrBgEEAYI3FQEEBQIDAQABMCMGCSsGAQQBgjcVAgQWBBTCKwhTx+hd MsKCgOmWwLgjQsAV+TAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTAfBgNV HSMEGDAWgBQaxgxKxEdvqNutK/D0Vgaj7TdUDDCBvQYDVR0fBIG1MIGyMIGv oIGsoIGphk5odHRwOi8vd3d3LmludGVsLmNvbS9yZXBvc2l0b3J5L0NSTC9J bnRlbCUyMEV4dGVybmFsJTIwQmFzaWMlMjBQb2xpY3klMjBDQS5jcmyGV2h0 dHA6Ly9jZXJ0aWZpY2F0ZXMuaW50ZWwuY29tL3JlcG9zaXRvcnkvQ1JML0lu dGVsJTIwRXh0ZXJuYWwlMjBCYXNpYyUyMFBvbGljeSUyMENBLmNybDCB4wYI KwYBBQUHAQEEgdYwgdMwYwYIKwYBBQUHMAKGV2h0dHA6Ly93d3cuaW50ZWwu Y29tL3JlcG9zaXRvcnkvY2VydGlmaWNhdGVzL0ludGVsJTIwRXh0ZXJuYWwl MjBCYXNpYyUyMFBvbGljeSUyMENBLmNydDBsBggrBgEFBQcwAoZgaHR0cDov L2NlcnRpZmljYXRlcy5pbnRlbC5jb20vcmVwb3NpdG9yeS9jZXJ0aWZpY2F0 ZXMvSW50ZWwlMjBFeHRlcm5hbCUyMEJhc2ljJTIwUG9saWN5JTIwQ0EuY3J0 MA0GCSqGSIb3DQEBBQUAA4IBAQCUY/1d0MS6VPTlIcOho1XWh193PD5kJDJS PdphLHQdM1oKA+whMdIBoY1VzTDDK+C+Ey4Jcyna7fpC8uVmn/Rz/i9MZtyc 7qezPtZTn9UyORvJmddH+Ox/RycGwe3ags8jUdspECorYOkJyZksnDIlTVUv bR7wyY+gGJYqxWXqrcVFEiMsWu8/OIlf7F2gAYMBw1kZ55dn4lWBIM0WqvRe WpPvhYeN7Y+3MKEdSMkQ7TZiNbfdZ5D/8KfWNMTJ4VHltOgCL1lA5tx/F4R1 920skpL5eu3Sj650RUe3rOXsaV5NyJzBwB31+1zsmleVdFD0k/Fw9HxXbAQE 35ucN/7CMIIGGzCCBQOgAwIBAgIKLe/tkAABAAB8QDANBgkqhkiG9w0BAQUF ADBWMQswCQYDVQQGEwJVUzEaMBgGA1UEChMRSW50ZWwgQ29ycG9yYXRpb24x KzApBgNVBAMTIkludGVsIEV4dGVybmFsIEJhc2ljIElzc3VpbmcgQ0EgM0Ew HhcNMTIwMTA5MTAyMTE5WhcNMTQxMjI0MTAyMTE5WjBHMRowGAYDVQQDExFN ZXR6Z2VyLCBNYXJrdXMgVDEpMCcGCSqGSIb3DQEJARYabWFya3VzLnQubWV0 emdlckBpbnRlbC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB AQDNFEzrGLYCoj6ZrC1Hl4ZVaxkYaR/XqIvq8N0MrkliLwFA0NMe92mLZGZH +Nib70+s/ug2QEBiTbIL8HmGisvivk4uos+VdJoklfccMqg+8jLy7K7EQPcT LADoSEqALH6CQUxOgMWy19mddNwgYcqtaYC20rBUU6OW4XNq4LpXuAcQsDEL zYB74/M8+Egu8f7hdqzOPSvqtySxQek83zrIvIj0kJGzzi/wx3YvCmVPeS+9 XCyysVxtE451RUdSMn278XP4ROL4nypewMumUKlM8zmpXr36DfEJp7POsOPh Is70HR5ECbl38xKwDIAFVJIiKPInbEYLNzxmNCYgwjxBAgMBAAGjggL4MIIC 9DALBgNVHQ8EBAMCB4AwPAYJKwYBBAGCNxUHBC8wLQYlKwYBBAGCNxUIhsOM dYSZ5VGD/YEohY6fU4KRwAlngd69OZXwQwIBZAIBCDAdBgNVHQ4EFgQUO1LS H9DzY7/SDxgu5ElpvSO2ucMwHwYDVR0jBBgwFoAUqhZmr7c9VlNgrg3C7fPu B8tRYH4wgc8GA1UdHwSBxzCBxDCBwaCBvqCBu4ZXaHR0cDovL3d3dy5pbnRl bC5jb20vcmVwb3NpdG9yeS9DUkwvSW50ZWwlMjBFeHRlcm5hbCUyMEJhc2lj JTIwSXNzdWluZyUyMENBJTIwM0EoMSkuY3JshmBodHRwOi8vY2VydGlmaWNh dGVzLmludGVsLmNvbS9yZXBvc2l0b3J5L0NSTC9JbnRlbCUyMEV4dGVybmFs JTIwQmFzaWMlMjBJc3N1aW5nJTIwQ0ElMjAzQSgxKS5jcmwwgfUGCCsGAQUF BwEBBIHoMIHlMGwGCCsGAQUFBzAChmBodHRwOi8vd3d3LmludGVsLmNvbS9y ZXBvc2l0b3J5L2NlcnRpZmljYXRlcy9JbnRlbCUyMEV4dGVybmFsJTIwQmFz aWMlMjBJc3N1aW5nJTIwQ0ElMjAzQSgxKS5jcnQwdQYIKwYBBQUHMAKGaWh0 dHA6Ly9jZXJ0aWZpY2F0ZXMuaW50ZWwuY29tL3JlcG9zaXRvcnkvY2VydGlm aWNhdGVzL0ludGVsJTIwRXh0ZXJuYWwlMjBCYXNpYyUyMElzc3VpbmclMjBD QSUyMDNBKDEpLmNydDAfBgNVHSUEGDAWBggrBgEFBQcDBAYKKwYBBAGCNwoD DDApBgkrBgEEAYI3FQoEHDAaMAoGCCsGAQUFBwMEMAwGCisGAQQBgjcKAwww UQYDVR0RBEowSKAqBgorBgEEAYI3FAIDoBwMGm1hcmt1cy50Lm1ldHpnZXJA aW50ZWwuY29tgRptYXJrdXMudC5tZXR6Z2VyQGludGVsLmNvbTANBgkqhkiG 9w0BAQUFAAOCAQEADdFEG6jdrvYiP7vtLUBHgm0nVxgFWGo4wWFaRtAxn5zX 9zffITtPdhtiMvRPJdRAKkAjjAfBx7oDojjMS0VIFZVEPKRx1IlrakO1cpGb 4vDpA4OTa8L1sdN+0SBUBYhIV1fxPlHvbcatzbwzP4xdKAunujaEN6Vv4DC0 hsEazMArZXIRVKnKxS7BeLsHlM7VL7K4R70wTonQCtwgxSjlU46y8R9ktLWD TQX7JxMZ76Z5oLbd6V+I28QcHL+/tyuM9a/WxT2Cgn2Up+xWE0OK9CNERIU8 +PI+ATvXgapAPe3kgRNDKs4JP5Dv3vzLo9lWWs4rfOLBC6050ZcZZxPDbjCC BmIwggVKoAMCAQICClJANE4AAQAAUK4wDQYJKoZIhvcNAQEFBQAwVjELMAkG A1UEBhMCVVMxGjAYBgNVBAoTEUludGVsIENvcnBvcmF0aW9uMSswKQYDVQQD EyJJbnRlbCBFeHRlcm5hbCBCYXNpYyBJc3N1aW5nIENBIDNBMB4XDTEwMTAx ODA4NTcxNFoXDTEzMTAwMjA4NTcxNFowRzEaMBgGA1UEAxMRTWV0emdlciwg TWFya3VzIFQxKTAnBgkqhkiG9w0BCQEWGm1hcmt1cy50Lm1ldHpnZXJAaW50 ZWwuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkMGMOKjN GWxm+QGUl32IFMyvLrzHAveRRn9jzy6LWuGmgmxJxuTMqkEK0y3vCVPWKWMw dP96AJS9U/J+3ByDovhXcPs3gi08xUHT7qolxOGt0nBwKzYgvW8ahbwW0Iuj UBLe4QB+XboX6WWx1aUIj0Urv93jSlqi942u96SspQh4oYV7EtZFnpOvkJPT tpJhXe5e1SACosn6vuSpIslZYdRlPdcFTx8vhL4A/YzZWW6NbnfhIAmFRq93 jRXwci9Cr/E6Ygb8jgCQgzmzw3864fGZ6uhKUuu3dsAcrlqALoFxb4HUh9cX HFFY553ZtFegbKSko4kFS1Jroi2qYYMMzwIDAQABo4IDPzCCAzswCwYDVR0P BAQDAgQwMD0GCSsGAQQBgjcVBwQwMC4GJisGAQQBgjcVCIbDjHWEmeVRg/2B KIWOn1OCkcAJZ4S52UGHhP9OAgFkAgEMMEQGCSqGSIb3DQEJDwQ3MDUwDgYI KoZIhvcNAwICAgCAMA4GCCqGSIb3DQMEAgIAgDAHBgUrDgMCBzAKBggqhkiG 9w0DBzAdBgNVHQ4EFgQUegpGutM4LPQCiqaGdC/gNvXYCIYwHwYDVR0jBBgw FoAUqhZmr7c9VlNgrg3C7fPuB8tRYH4wgc8GA1UdHwSBxzCBxDCBwaCBvqCB u4ZXaHR0cDovL3d3dy5pbnRlbC5jb20vcmVwb3NpdG9yeS9DUkwvSW50ZWwl MjBFeHRlcm5hbCUyMEJhc2ljJTIwSXNzdWluZyUyMENBJTIwM0EoMSkuY3Js hmBodHRwOi8vY2VydGlmaWNhdGVzLmludGVsLmNvbS9yZXBvc2l0b3J5L0NS TC9JbnRlbCUyMEV4dGVybmFsJTIwQmFzaWMlMjBJc3N1aW5nJTIwQ0ElMjAz QSgxKS5jcmwwgfUGCCsGAQUFBwEBBIHoMIHlMGwGCCsGAQUFBzAChmBodHRw Oi8vd3d3LmludGVsLmNvbS9yZXBvc2l0b3J5L2NlcnRpZmljYXRlcy9JbnRl bCUyMEV4dGVybmFsJTIwQmFzaWMlMjBJc3N1aW5nJTIwQ0ElMjAzQSgxKS5j cnQwdQYIKwYBBQUHMAKGaWh0dHA6Ly9jZXJ0aWZpY2F0ZXMuaW50ZWwuY29t L3JlcG9zaXRvcnkvY2VydGlmaWNhdGVzL0ludGVsJTIwRXh0ZXJuYWwlMjBC YXNpYyUyMElzc3VpbmclMjBDQSUyMDNBKDEpLmNydDAfBgNVHSUEGDAWBggr BgEFBQcDBAYKKwYBBAGCNwoDBDApBgkrBgEEAYI3FQoEHDAaMAoGCCsGAQUF BwMEMAwGCisGAQQBgjcKAwQwUQYDVR0RBEowSKAqBgorBgEEAYI3FAIDoBwM Gm1hcmt1cy50Lm1ldHpnZXJAaW50ZWwuY29tgRptYXJrdXMudC5tZXR6Z2Vy QGludGVsLmNvbTANBgkqhkiG9w0BAQUFAAOCAQEAOtoEY5C6tRBge2BLRJSF zR3sqBdsg8Qq7cvE7qKaow45J+fNN4o7zYc6aU/U9MeYZiLLo6q/0VY7R7by nwQKiUKPdwz08xFcUOI/plzbuSqp5qcex+WpMiHuS196JlPaaxbX+0ihWkB3 jjo6LDTQHmE2svplsVRZhm2kIr4xKlrdi0tjqc7CfSV57/cA/dJPSY34VU+v XS+QIWbB16WSVL4LN7wyhfb9xcJeIJm7nHKIJdMHAsH2Hncj2hbnqdpVRLmP J759yYOhOLH5npNgPn1af9+JcuVfDqj4dwIUvegsTEL5dX70wJoggVfksgHs zRLkzebEP8WreFFk2ml0UzGCA4YwggOCAgEBMGQwVjELMAkGA1UEBhMCVVMx GjAYBgNVBAoTEUludGVsIENvcnBvcmF0aW9uMSswKQYDVQQDEyJJbnRlbCBF eHRlcm5hbCBCYXNpYyBJc3N1aW5nIENBIDNBAgot7+2QAAEAAHxAMAkGBSsO AwIaBQCgggH3MBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcN AQkFMQ8XDTEyMDUzMTE1MzMxM1owIwYJKoZIhvcNAQkEMRYEFNXI4NLw3eY4 vECpp2TTDwur1DU1MHMGCSsGAQQBgjcQBDFmMGQwVjELMAkGA1UEBhMCVVMx GjAYBgNVBAoTEUludGVsIENvcnBvcmF0aW9uMSswKQYDVQQDEyJJbnRlbCBF eHRlcm5hbCBCYXNpYyBJc3N1aW5nIENBIDNBAgpSQDROAAEAAFCuMHUGCyqG SIb3DQEJEAILMWagZDBWMQswCQYDVQQGEwJVUzEaMBgGA1UEChMRSW50ZWwg Q29ycG9yYXRpb24xKzApBgNVBAMTIkludGVsIEV4dGVybmFsIEJhc2ljIElz c3VpbmcgQ0EgM0ECClJANE4AAQAAUK4wgasGCSqGSIb3DQEJDzGBnTCBmjAK BggqhkiG9w0DBzALBglghkgBZQMEASowCwYJYIZIAWUDBAEWMAsGCWCGSAFl AwQBAjAOBggqhkiG9w0DAgICAIAwBwYFKw4DAgcwDQYIKoZIhvcNAwICAUAw DQYIKoZIhvcNAwICASgwBwYFKw4DAhowCwYJYIZIAWUDBAIDMAsGCWCGSAFl AwQCAjALBglghkgBZQMEAgEwDQYJKoZIhvcNAQEBBQAEggEAXZIp2/NeuGGw 1SQLNE7CGZTDasqCitN5dOvhk9I4A6iUi79vtgNrp8rrTR5hqA3GJRK7tdEt 4E0aRrq05O+O6wh1KFceVFnd4+2nc7tUvGdMxoK0Nqk4hlVPMDlqhNBpcNvG /lBNPShkELCHXhxC3geB6izMvElE9n5e+TCTX+lq1H8wGTPYxg2cvoCd3RTv pBkQGdsWlUODjgQndAgA8+T4ia2UvdG6K77Tc5IfqJiPOm4eRQ2TJjK3nWRZ NsoDLb8Yquxdjh6FaBR+/ocab3BPVTp+wuCXTr7YDlk5CVDPlK2yInun6Yts VylvMCGXCa19P7EJDrKWlwu0s/j9VAAAAAAAAA== ------=_NextPart_000_01D8_01CD3F53.747284B0-- --===============1886495617== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Content-length: 414 ---------------------------------------------------------------------------= ----------- Intel GmbH Dornacher Strasse 1 85622 Feldkirchen/Muenchen, Deutschland=20 Sitz der Gesellschaft: Feldkirchen bei Muenchen Geschaeftsfuehrer: Douglas Lusk, Peter Gleissner, Hannes Schwaderer Registergericht: Muenchen HRB 47456=20 Ust.-IdNr./VAT Registration No.: DE129385895 Citibank Frankfurt a.M. (BLZ 502 109 00) 600119052 --===============1886495617==--