<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4554776517811473232</id><updated>2012-01-02T09:57:30.672+01:00</updated><category term='seqlock'/><category term='Max'/><category term='Xenophobia'/><category term='Minix'/><category term='spaghetti'/><category term='HelenOS'/><category term='Machinery'/><category term='Windows'/><category term='Oracle'/><category term='microkernels'/><category term='Mercurial'/><category term='stupidity'/><category term='USA'/><category term='Hurd'/><category term='Programming'/><category term='GCC'/><category term='CDA'/><category term='amd64'/><category term='GSoC'/><category term='Git'/><category term='XNU'/><category term='observability'/><category term='Lestes'/><category term='QEMU'/><category term='Emerging Projects'/><category term='recruitment'/><category term='RCU'/><category term='cars'/><category term='spinlock'/><category term='QNX'/><category term='coreboot'/><category term='Russians'/><category term='Subversion'/><category term='Sysel'/><category term='CVS'/><category term='Freedoms'/><category term='HID'/><category term='Avast'/><category term='Bazaar'/><category term='Humour'/><category term='L4'/><category term='networking'/><category term='config'/><category term='MFF UK'/><category term='FMA'/><category term='French'/><category term='SPAD'/><category term='TRAPTRACE'/><category term='refcount'/><category term='Vita'/><category term='rwlock'/><category term='OpenSolaris'/><category term='PearPC'/><category term='alcohol'/><category term='Sun'/><category term='Ski'/><category term='VCS'/><category term='IPC'/><category term='GDB'/><category term='Linux'/><category term='career'/><category term='fun'/><category term='C99'/><category term='Europe'/><category term='Nationalism'/><category term='OpenBSD'/><title type='text'>JakUB - Jakub's Universal Blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>69</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-3322081967855093381</id><published>2011-12-23T22:08:00.002+01:00</published><updated>2011-12-23T22:10:40.970+01:00</updated><title type='text'>Rack wars aftermath</title><content type='html'>In my &lt;a href="http://jakubsuniversalblog.blogspot.com/2011/10/proliferation-of-racks-of-mass.html"&gt;older&lt;/a&gt; blog entry, I wrote about my struggle to buy myself a rack cabinet. After ditching the first recommended distributor for pretty much the same flaws as those of the rack manufacturer itself, I think I made some good business with &lt;a href="http://ceit.cz/"&gt;Ceit&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;Before:&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-WIVi7CY-KIw/TvTpyWKzRMI/AAAAAAAADlQ/B0VMGQQZNoY/s1600/SAM_0545.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/-WIVi7CY-KIw/TvTpyWKzRMI/AAAAAAAADlQ/B0VMGQQZNoY/s320/SAM_0545.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;After:&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-8QI0T-8SrlE/TvTqHW7WS0I/AAAAAAAADlc/QlGDCyDWHV4/s1600/SAM_0575.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-8QI0T-8SrlE/TvTqHW7WS0I/AAAAAAAADlc/QlGDCyDWHV4/s320/SAM_0575.JPG" width="240" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;The Itanium 2 server is not yet mounted in the rack as I am still waiting for its rack rails. On the other hand, I got hold of a Sun Fire V100 in the meantime, which is now mounted in the topmost position. And if I behaved properly the whole year, I may even find a Sun Fire V240 under my Christmas tree, so the empty positions will not be empty for too long.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-3322081967855093381?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/3322081967855093381/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=3322081967855093381' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/3322081967855093381'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/3322081967855093381'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2011/12/rack-aftermath.html' title='Rack wars aftermath'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-WIVi7CY-KIw/TvTpyWKzRMI/AAAAAAAADlQ/B0VMGQQZNoY/s72-c/SAM_0545.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-4428617189331952173</id><published>2011-12-09T10:32:00.001+01:00</published><updated>2011-12-09T13:08:47.194+01:00</updated><title type='text'>European bugaboo</title><content type='html'>Our Eurosceptic fellow citizens love to argue against closer integration within the EU using the &lt;i&gt;loss of sovereignty &lt;/i&gt;bugaboo. But is that something to be really afraid of? And is it really a loss as in 'I lost my wallet'?&lt;br /&gt;&lt;br /&gt;The idea of losing sovereignty is a heavyweight weapon which is powerful enough to keep the common herd from even thinking of something greater that exceeds the current borders of the state they are living in. If some decision making is to be moved from the state-level to the European-level, it must be bad. Bad!&lt;br /&gt; &lt;br /&gt; But what does state-level sovereignty mean to an individual citizen, how can he benefit from it? Does it make any difference if the decision is made on the state level or on the European level? In either case, the citizen does not have a direct control over the decision. In both cases, he can indirectly influence it in elections. Now the question is, which level is capable of making more competent decisions. The answer will differ depending on the subject. Decisions with potentially global impact will be better made on the global, i.e. European, level while decisions with only local effect are better to be made on local, perhaps even sub-state regional level.&lt;br /&gt;&lt;br /&gt;As for the noun &lt;i&gt;loss&lt;/i&gt;, I think it was carefully chosen to dress the bugaboo with duly scary rags. I think &lt;i&gt;sharing&lt;/i&gt; or &lt;i&gt;delegation&lt;/i&gt; of sovereignty are both more fitting words, because the member state is actively participating in the European-level decision making process and thus still has some say over the issues. On the European-level, it even has a say over the issues it previously didn't have any control of.&lt;br /&gt;&lt;br /&gt;Now, is this something to be afraid of? Should the citizen be alarmed if the state's fiscal policy is regulated on the EU level? In theory, a whole will not cause self-inflicted wounds to its own parts, will it? Of course, this self-preservation feature needs to be achieved by a balanced power sharing.&lt;br /&gt;&lt;br /&gt;For example, the Constitution of the United States was designed in such a way that one house of the US Congress honors the States populations, while the other gives each State the same rights. The US Congress thus follows two power sharing principles: the more populous the State, the bigger say, and all States are equal in some sense.&lt;br /&gt;&lt;br /&gt;In Europe, we have a similar system. Member states are represented in the European Parliament proportionally to their population, while the Council of the European Union will have one minister per member state. From 2014, the voting system in the Council will change towards qualified majority voting, giving thus more power to states, while still considering their population sizes. The European system can be further improved to more resemble the US one, but it still contains the two above principles.&lt;br /&gt;&lt;br /&gt;The US is a good example of successful integration. It has a balanced constitution which enabled nearly twice the number of EU member states to coexist together and effectively share sovereignty. Maybe the Americans succeeded because of good timing or because after Articles of Confederation, this was already their second attempt at forming USA and they were able to learn from their own mistakes. From the few Americans I know, I have never heard worries about e.g. Californians overrunning Wyomingites in decision making.&lt;br /&gt;&lt;br /&gt;By the way, the European Union today shows most of the weaknesses of USA under the Articles of Confederation, doesn't it? For the European Union to work effectively, it is necessary to share more sovereignty and share it in a more effective way. For example, the qualified majority of US States can amend the US constitution. This way of going forward is unheard of in the Old continent. The EU Treaty can only be changed by ratification in all member states, which makes any enhancements painfully slow, if not impossible.&lt;br /&gt;&lt;br /&gt;In closing, I wish for less ambitious and populist member state governments, greater leadership on the European-level and much greater sense of belonging to the same Europe.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-4428617189331952173?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/4428617189331952173/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=4428617189331952173' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/4428617189331952173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/4428617189331952173'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2011/12/european-bugaboo.html' title='European bugaboo'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-156155137332771509</id><published>2011-10-14T11:19:00.000+02:00</published><updated>2011-10-14T11:19:55.910+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='stupidity'/><title type='text'>Proliferation of racks of mass destruction</title><content type='html'>At the moment, there are 5 items on my desk that should rather be placed in a rack cabinet. These include an Itanium 2 server, a couple of UltraSPARC workstations, a monitor and a pair of Sun 5 and 6 keyboards. I therefore started to actively search for a fitting rack. I figured out that I need at least a 32U, 600mm-x-900mm cabinet with a couple of shelves.&lt;br /&gt;&lt;br /&gt;After some searching I found a Czech &lt;a href="http://www.triton.cz/en"&gt;company&lt;/a&gt; which manufactures these cabinets. I noticed there were no prices on their web, only a decent PDF catalog and a configurator form for inquiries. After having filled in the form, I was expecting to receive a quotation.&lt;br /&gt;&lt;br /&gt;To my surprise, this was not going to be the case. So far, I have received the total of 5 emails from them - none containing the desired piece of information. The conversation went like this:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Me&lt;/b&gt;: Hi, I'm interested in the rack cabinet model RMA-32-A69-BAX-A1.&lt;/li&gt;&lt;li&gt;&lt;b&gt;First Triton sales&lt;/b&gt;: Please let us know what is the country of residence of the company which is making the inquiry.&lt;/li&gt;&lt;/ul&gt;(The inquiry form only asked for name and e-mail address.) &lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Me&lt;/b&gt;: I live in Beroun, the same country as you are in and I need the rack cabinet for personal purposes.&amp;nbsp; What is the price?&lt;/li&gt;&lt;li&gt;&lt;b&gt;First Triton sales&lt;/b&gt;: We don't have the black one in the stock, but can sell you the grey one which we have. If you are not a company, please contact our distributor using the following telephone number.&lt;/li&gt;&lt;/ul&gt;I did not feel like using a phone. I don't remember myself using a phone for the&lt;br /&gt;sake of buying something computer-related for ages. Since they did not provide the &lt;a href="http://krt.cz/main/?id=17"&gt;URL&lt;/a&gt; of their distributor, I had to find it myself. It was not difficult at all, but to my further surprise, there were no prices on their web either.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Me&lt;/b&gt;: The color does not really matter to me. Can you just tell me the price?&lt;/li&gt;&lt;li&gt;&lt;b&gt;First Triton sales&lt;/b&gt;: The black unit and the grey unit both have the same price. As an end customer, you need to contact the distributor to buy them.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Me&lt;/b&gt;: I found the distributor's web, but they don't list the prices either. At the moment, I just need the price. Is the price secret?&lt;/li&gt;&lt;li&gt;&lt;b&gt;Second Triton sales&lt;/b&gt;: The price is not a secret, but it is a common practice for both us and the distributor not to list the prices on the web. I am sure they will tell you what the price is if you call them or write them an e-mail with your phone number.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Me&lt;/b&gt;: I probably underestimated the complexity of my inquiry as I was expecting a simple answer just as if I was looking for a price of e.g. a laptop. FYI, some of your &lt;a href="http://icecat.cz/cz/p/rof-27-60-80/reky-19-rack-27u-600x800-mm-770674.html"&gt;competition&lt;/a&gt; are not that secretive about their rack cabinets.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Second Triton sales&lt;/b&gt;: Well, you see it. If you included your phone number in your e-mail signature as is appropriate, I would have already told you what was the price. I am not sure how I can further help you. You really should contact the distributor.&lt;/li&gt;&lt;/ul&gt;WTF? Turns out that I have been using my e-mail inappropriately for years! I am not sure how this is going to end. I suspect that Triton might be in a need for a brand new sales team, because the sales lady and the gentleman with whom I have spoken won't recognize a customer even if the custmer wore a label "I am a customer."&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-156155137332771509?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/156155137332771509/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=156155137332771509' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/156155137332771509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/156155137332771509'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2011/10/proliferation-of-racks-of-mass.html' title='Proliferation of racks of mass destruction'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-3942584693158730642</id><published>2011-10-14T09:59:00.002+02:00</published><updated>2011-10-14T10:00:08.871+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Max'/><title type='text'>Next Generation Jermar, model B</title><content type='html'>On October 2, 2011, I became a multi-father as my second son, Max, was born on that day shortly after 8am.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-AphdxQo8fZs/TpfqMN5yuiI/AAAAAAAAC1c/BVfCQ6yl9ic/s1600/SAM_0361.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/-AphdxQo8fZs/TpfqMN5yuiI/AAAAAAAAC1c/BVfCQ6yl9ic/s320/SAM_0361.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;My first son, &lt;a href="http://jakubsuniversalblog.blogspot.com/2009/09/next-generation-jermar.html"&gt;Vita&lt;/a&gt;, is a little bit jealous now because of his younger brother, but my and my wife's confidence that in the long term he will appreciate the new family member is high.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-3942584693158730642?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/3942584693158730642/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=3942584693158730642' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/3942584693158730642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/3942584693158730642'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2011/10/next-generation-jermar-model-b.html' title='Next Generation Jermar, model B'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-AphdxQo8fZs/TpfqMN5yuiI/AAAAAAAAC1c/BVfCQ6yl9ic/s72-c/SAM_0361.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-5549837395274316684</id><published>2011-09-10T23:37:00.001+02:00</published><updated>2011-09-10T23:43:26.506+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HelenOS'/><category scheme='http://www.blogger.com/atom/ns#' term='Emerging Projects'/><title type='text'>Debugging file system hang using kconsole</title><content type='html'>&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;I thought it may be useful to interested people if I demonstrated how the HelenOS kconsole &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ipc&lt;/span&gt; command can be used to root cause a deadlock in the file system code. Yesterday I had the opportunity to use this technique on &lt;a href="http://trac.helenos.org/ticket/373"&gt;ticket #373&lt;/a&gt;. In short, the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;mount&lt;/span&gt; command was hanging in an attempt to mount a MFS file system on a file-backed block device with the underlying image located on the root FAT file system.&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;Let's first have a look at the commands which lead to this deadlock:&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&amp;nbsp; &lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Arial,Helvetica,sans-serif; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-3QC2Pq-ESUg/TmvA6lDy9aI/AAAAAAAACx4/CFbjdjfsdgo/s1600/commands.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://2.bp.blogspot.com/-3QC2Pq-ESUg/TmvA6lDy9aI/AAAAAAAACx4/CFbjdjfsdgo/s400/commands.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;With the deadlock in place, we can start debugging it by switching to kconsole and inspecting the IPC state of essential tasks. The first one to look at is VFS, which is usually task number 6:&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Arial,Helvetica,sans-serif; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-O1g9wpViXy0/TmvBpp-ka-I/AAAAAAAACx8/7u3e2z92Kas/s1600/ipc-vfs.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://4.bp.blogspot.com/-O1g9wpViXy0/TmvBpp-ka-I/AAAAAAAACx8/7u3e2z92Kas/s400/ipc-vfs.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;/div&gt;&lt;br /&gt;The screenshot above reveals that VFS is processing two client calls and that it itself has made two calls to the FAT server. The first call with method 1032 is &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;VFS_IN_MOUNT&lt;/span&gt; sent by &lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;bdsh&lt;/span&gt; as it was executing the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;mount&lt;/span&gt; built-in command. From the source code, we see that VFS needs to process &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;VFS_IN_MOUNT&lt;/span&gt; by sending &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;VFS_OUT_MOUNT&lt;/span&gt; to the file system with the mount-point node. This corresponds to the first of the two calls sent over phone 2. Let's now look at what the situation is at the FAT server:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-NQByotlknCo/TmvD5NwvjhI/AAAAAAAACyA/cwoBbdNpFwM/s1600/ipc-fat.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://1.bp.blogspot.com/-NQByotlknCo/TmvD5NwvjhI/AAAAAAAACyA/cwoBbdNpFwM/s400/ipc-fat.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;We see three calls dispatched to the FAT server, the first one being the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;VFS_OUT_MOUNT&lt;/span&gt;. In reaction to &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;VFS_OUT_MOUNT&lt;/span&gt;, FAT will send &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;VFS_OUT_MOUNTED&lt;/span&gt; to the mountee file system. The mountee, in this case, is task 41 - the MFS server.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-59jclXCL9A8/TmvGWDJz9gI/AAAAAAAACyE/IY3w7cypgxU/s1600/ipc-mfs.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://4.bp.blogspot.com/-59jclXCL9A8/TmvGWDJz9gI/AAAAAAAACyE/IY3w7cypgxU/s400/ipc-mfs.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Since MFS is being mounted on a file_bd block device, MFS will want to do some reads from it before it answers the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;VFS_OUT_MOUNTED&lt;/span&gt; call.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-dYGKFkdPRDE/TmvHB6h1l3I/AAAAAAAACyI/lTKlaZQosKs/s1600/ipc-file_bd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://1.bp.blogspot.com/-dYGKFkdPRDE/TmvHB6h1l3I/AAAAAAAACyI/lTKlaZQosKs/s400/ipc-file_bd.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This file_bd instance has its blocks in the image file located on the root FAT file system, so it makes &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;VFS_IN_READ&lt;/span&gt; and &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;IPC_M_READ_DATA&lt;/span&gt; calls to VFS in order to read the block. We already saw the former on the screenshot with VFS as the second dispatched call. We also saw the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;IPC_M_READ_DATA&lt;/span&gt; on the FAT situation screenshot (call with method 8) because it got forwarded to FAT.&lt;br /&gt;&lt;br /&gt;In reaction to &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;VFS_IN_READ&lt;/span&gt;, VFS will send &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;VFS_OUT_READ&lt;/span&gt; to the file system with the respective image file, i.e. the FAT server. It is the call with method 1025 on the FAT situation screenshot above. It is this call which contributes to the &lt;i&gt;calls&lt;/i&gt; column of phone 2 on the VFS screenshot by its second half.&lt;br /&gt;&lt;br /&gt;Now the deadlock cycle is completed. As seen on the FAT screenshot, the connection fibril associated with the VFS phone 2 is processing the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;VFS_OUT_MOUNT&lt;/span&gt; call and cannot finish it because for that it also needs to start and complete processing of the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;VFS_OUT_READ&lt;/span&gt; call. On the other hand, it cannot even start processing &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;VFS_OUT_READ&lt;/span&gt;, before it is done with &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;VFS_OUT_MOUNT&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;I have described a similar problem several years ago in &lt;a href="http://jakubsuniversalblog.blogspot.com/2009/06/christmas-time-in-june.html"&gt;this blog&lt;/a&gt;. The solution was the introduction of &lt;a href="http://trac.helenos.org/wiki/AsyncSessions"&gt;async sessions&lt;/a&gt;. So the million-dollar question is why this didn't work this time and why we see that the two requests which should be handled in parallel are sent over VFS phone 2 serially.&lt;br /&gt;&lt;br /&gt;The possible answer could be hidden in the way how the first call is handled. And indeed, in &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;vfs_mount_internal()&lt;/span&gt;, we find the following piece of code: &lt;br /&gt;&lt;blockquote style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vfs_exchange_release(exch);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; async_wait_for(msg, &amp;amp;rc);&lt;/blockquote&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/div&gt;The code is wrong because it ends the exchange before the answer to the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;VFS_OUT_MOUNT&lt;/span&gt; call arrives. That makes it possible for the underlying exchange phone to be reused for handling other requests, including those that need to be handled in parallel to the first one. With this realization, the fix is a piece of cake.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-5549837395274316684?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/5549837395274316684/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=5549837395274316684' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/5549837395274316684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/5549837395274316684'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2011/09/debugging-file-system-hang-using.html' title='Debugging file system hang using kconsole'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-3QC2Pq-ESUg/TmvA6lDy9aI/AAAAAAAACx4/CFbjdjfsdgo/s72-c/commands.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-4563687406829521847</id><published>2011-09-08T15:06:00.000+02:00</published><updated>2011-09-08T15:07:48.075+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HelenOS'/><category scheme='http://www.blogger.com/atom/ns#' term='Emerging Projects'/><title type='text'>With Bobcat will come the features</title><content type='html'>So far, we have resolved only about a quarter of all &lt;a href="http://trac.helenos.org/milestone/0.5.0"&gt;tickets planned&lt;/a&gt; for &lt;a href="http://www.helenos.org/"&gt;HelenOS&lt;/a&gt; 0.5.0, but judging only by that one quarter, the next release will be full of new and exciting features. This is mainly due to a quite favorable confluence of circumstances such as &lt;a href="http://helenos.org/go-gsoc"&gt;our participation&lt;/a&gt; in this years Google Summer of Code program or successful completion of several HelenOS projects at universities. We have not been sitting with our arms folded either.&lt;br /&gt;&lt;br /&gt;Just a brief enumeration of my favorite features (a little bit more complete list can be found in the &lt;a href="http://trac.helenos.org/wiki/ReleaseNotes/Mainline"&gt;release notes&lt;/a&gt; that are currently in the making):&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;USB stack and drivers&lt;/li&gt;&lt;li&gt;new file systems (read-only Ext2, exFAT, ISO 9660, MINIX FS, LFN for FAT)&lt;/li&gt;&lt;li&gt;C toolchain (GNU assembler and linker + Portable C Compiler)&lt;/li&gt;&lt;li&gt;support for device removal&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;And having roughly three quarters of work - features and bug fixes combined - still ahead of us, gives us hope to see even more heavy-duty goodies:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;RBAC based security scheme&lt;/li&gt;&lt;li&gt;support for NUMA &lt;/li&gt;&lt;li&gt;NIC framework and other networking improvements&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-4563687406829521847?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/4563687406829521847/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=4563687406829521847' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/4563687406829521847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/4563687406829521847'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2011/09/with-bobcat-will-come-features.html' title='With Bobcat will come the features'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>1</thr:total><georss:featurename>Politických vězňů 2, 266 01 Beroun-Město, Czech Republic</georss:featurename><georss:point>49.964693377565276 14.068679809570312</georss:point><georss:box>49.95447887756528 14.048938809570313 49.97490787756527 14.088420809570312</georss:box></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-2363863031190098961</id><published>2011-08-22T22:19:00.013+02:00</published><updated>2011-08-24T15:33:53.073+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HelenOS'/><category scheme='http://www.blogger.com/atom/ns#' term='Emerging Projects'/><title type='text'>My trace in HelenOS Camp 2011</title><content type='html'>The coding camp is over and it's time to look back a little and describe the things that went into the mainline. For my part, the most interesting and also the most time consuming bits were related to fixing ticket &lt;a href="http://trac.helenos.org/ticket/259"&gt;#259&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The gist of the ticket was to change the way how open files are passed from one task to another, typically when spawning a new task and passing it its standard input, output and error files. Previously, this was achieved by exporting VFS-internal information - the VFS triplet composed of the file system handle, device handle and file system index - to the donor task. The donor task then sent this triplet via IPC to the acceptor task which in turn used it to open the respective files.&lt;br /&gt;&lt;br /&gt;There were several problems with this approach, the most serious being the one that I didn't quite like it. But other than that, it was implemented as an afterthought in the absence of better alternatives. Reopening the file is not exactly the same thing as passing its open handle, because the file handle is associated with position, append on write flag and mode (not currently supported in HelenOS). If the donor closed its handle or did not even have the file open, the mechanism was susceptible to races.&lt;br /&gt;&lt;br /&gt;In ticket #259 I called for a first-class VFS operation for passing device handles. The result of the operation should be that VFS duplicates a donor's file handle in the acceptor's table of open files and informs the acceptor about the new handle. Now, the real problem of course is how VFS learns about the intentions of its two clients and how it locates their data. We also want to prevent VFS from injecting a file handle against the will of any respective acceptor and, vice versa, importing a file handle against the will of any respective donor.&lt;br /&gt;&lt;br /&gt;I started drafting the authorization protocol about a month before the camp during one of the rather frequent electricity blackouts. At that time I thought of introducing a specialized system IPC message for passing any sort of a handle in general between two clients of the same server. The message, something like &lt;span style="font-family:courier new;"&gt;IPC_M_PASS_HANDLE_AUTHORIZE&lt;/span&gt;, would be understood by the kernel (just like any other system IPC message). In this case, the kernel would be the trustworthy entity certifying that the donor task agreed with the acceptor task on passing a handle. I planned to store such a certificate, along with identification of both parties and the handle, in the donor's kernel address space, from where it would be later picked up by the donor sending another system message, for example &lt;span style="font-family:courier new;"&gt;IPC_M_PASS_HANDLE_REALIZE&lt;/span&gt;, to VFS. It was this second message which should make VFS perform the transfer. The only problematic question was how to organize such certifications within the donor. Should it be limited to a use-once right or rather should each task have a container for storing and managing certifications? Or should the kernel send the second message itself on behalf of the donor?&lt;br /&gt;&lt;br /&gt;With the basic idea and some unanswered questions, I joined the camp (technically the camp started while I was already there sitting at my dining table).&lt;br /&gt;&lt;br /&gt;I discussed my idea with Jiri and Martin to get some feedback. Jiri was traditionally skeptical and was frowning at me. Apart from having an alternative idea of turning HelenOS into a capability-based system (sigh), he also advised me to make the whole mechanism more generic. Instead of passing some sort of a handle, why not let the two sides agree on a protocol-specific change of externally kept state? I liked his idea so I moved from &lt;span style="font-family:courier new;"&gt;IPC_M_PASS_HANDLE_AUTHORIZE&lt;/span&gt; to &lt;span style="font-family:courier new;"&gt;IPC_M_STATE_CHANGE_AUTHORIZE&lt;/span&gt; and reserved the first three arguments of the message for the protocol-specific definition of the desired change of state. Martin was influential in solving the question of how the acceptor learns about the new state. I originally intended the donor would tell the acceptor, but there was a purely hypothetical risk of the donor intentionally misleading the acceptor by providing false information. Not so sure about why would the donor have bothered with such a mystification, but anyway, I came to realization that this final phase of the exchange is in fact an optional, protocol-specific synchronization between the acceptor and the server.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-aDU_NT81ulA/TlT4_LXk94I/AAAAAAAACxw/7Lk6AfDb2JY/s1600/passhandle.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 223px;" src="http://3.bp.blogspot.com/-aDU_NT81ulA/TlT4_LXk94I/AAAAAAAACxw/7Lk6AfDb2JY/s400/passhandle.jpg" alt="" id="BLOGGER_PHOTO_ID_5644409997269202818" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;At this point (or slightly before that), I started coding. I first implemented the &lt;span style="font-family:courier new;"&gt;IPC_M_STATE_CHANGE_AUTHORIZE&lt;/span&gt; and its kernel and async framework support. The donor sends this message to the acceptor, which may be (and usually is) the &lt;span style="font-style:italic;"&gt;child&lt;/span&gt; task. It packs the protocol-specific identification of the desired change of state into the message. Here comes one important detail: the donor also needs to identify the server process by presenting an open phone to it in the message. When sent, the kernel remembers the server phone and passes the message to the acceptor. The acceptor now has a chance to reject the offer or agree to it. If the acceptor agrees, it too needs to present an open phone to the same server in the answer. The kernel now checks that both the donor and the acceptor mean the same server task by looking at the two phones. If there is a match, it sends a per-task kernel event notification &lt;span style="font-family:courier new;"&gt;EVENT_TASK_STATE_CHANGE&lt;/span&gt; to the server task. Note that the use of a kernel notification here gets us rid of the problem with storing the certification in the donor task.&lt;br /&gt;&lt;br /&gt;For this to be possible, I had to implement support for per-task kernel event notifications as HelenOS only supported global kernel event notifications. The difference is that in the case of a global kernel notification only one task can subscribe it (i.e. one task receiving e.g. the &lt;span style="font-family:courier new;"&gt;EVENT_KLOG&lt;/span&gt; notification) while it is technically possible for each task to subscribe to any of its own per-task events. In this regard, per-task kernel events resemble POSIX signals.&lt;br /&gt;&lt;br /&gt;Back to the server task receiving the &lt;span style="font-family:courier new;"&gt;EVENT_TASK_STATE_CHANGE&lt;/span&gt; notification. The notification carries information necessary for the server to locate both the donor's and acceptor's client data and the description of the desired change of state. In connection with accessing some task's client data from the notification context, it was necessary to add functions for managing external references to the client connection tracking structures.&lt;br /&gt;&lt;br /&gt;In case of the VFS server, it handles the &lt;span style="font-family:courier new;"&gt;EVENT_TASK_STATE_CHANGE&lt;/span&gt; notification by looking up the donor's and acceptor's client data which contain the respective tables of open files. It performs several sanity checks to verify that the file handle exists in the donor's name space and that there is a free file descriptor in the acceptor's name space. If everything looks good, it clones the &lt;span style="font-family:courier new;"&gt;vfs_file_t&lt;/span&gt; structure and points it to the underlying VFS node. Finally, it enqueues the new file handle in the acceptor's client data and broadcasts its condition variable to wake up any clients that may be waiting for it.&lt;br /&gt;&lt;br /&gt;This brings us to the details of the acceptor-server synchronization. For this purpose, VFS implements a new interface &lt;span style="font-family:courier new;"&gt;VFS_IN_WAIT_HANDLE&lt;/span&gt; and libc makes it available to clients via the &lt;span style="font-family:courier new;"&gt;fd_wait()&lt;/span&gt; function. Clients invoking &lt;span style="font-family:courier new;"&gt;fd_wait()&lt;/span&gt; will simply block on their VFS client data condition variable until there appears the new file descriptor. VFS clients call &lt;span style="font-family:courier new;"&gt;fd_wait()&lt;/span&gt; after the reply to &lt;span style="font-family:courier new;"&gt;IPC_M_STATE_CHANGE_AUTHORIZE&lt;/span&gt; and before replying to the leading message such as &lt;span style="font-family:courier new;"&gt;LOADER_SET_FILES&lt;/span&gt;. Without a synchronization like this, the donor could exit before the server has a chance to duplicate its handle or it may be too early for the acceptor to query its new state.&lt;br /&gt;&lt;br /&gt;I tried to illustrate the whole communication in a picture above. As a whole, it may seem more complicated than the previous solution that simply passed VFS triplets around, but is definitely cleaner. Moreover, HelenOS now features a universal mechanism for achieving a change of externally kept state between two clients of an arbitrary server.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-2363863031190098961?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/2363863031190098961/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=2363863031190098961' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/2363863031190098961'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/2363863031190098961'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2011/08/my-trace-in-helenos-camp-2011.html' title='My trace in HelenOS Camp 2011'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-aDU_NT81ulA/TlT4_LXk94I/AAAAAAAACxw/7Lk6AfDb2JY/s72-c/passhandle.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-4156088151935717391</id><published>2011-08-12T12:57:00.005+02:00</published><updated>2011-08-12T13:12:19.388+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='refcount'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='seqlock'/><category scheme='http://www.blogger.com/atom/ns#' term='spinlock'/><category scheme='http://www.blogger.com/atom/ns#' term='rwlock'/><category scheme='http://www.blogger.com/atom/ns#' term='RCU'/><title type='text'>Family background of synchronization primitives</title><content type='html'>If you want to have some good Friday read about synchronization primitives and enjoy a couple of fitting analogies, make sure to read &lt;a href="http://lwn.net/Articles/453685/"&gt;&lt;/a&gt;&lt;a href="http://lwn.net/Articles/453685/"&gt;this &lt;/a&gt;&lt;a href="http://lwn.net/"&gt;LWN&lt;/a&gt; article. May be, you will want to learn more about  &lt;a href="http://lxr.linux.no/#linux+v3.0/include/linux/seqlock.h"&gt;Seqlock&lt;/a&gt;s, just as I did after reading the article.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-4156088151935717391?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/4156088151935717391/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=4156088151935717391' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/4156088151935717391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/4156088151935717391'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2011/08/family-background-of-synchronization.html' title='Family background of synchronization primitives'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-7256304107530752704</id><published>2011-07-29T11:54:00.003+02:00</published><updated>2011-07-29T12:04:45.562+02:00</updated><title type='text'>Find 10 differences</title><content type='html'>&lt;div style="text-align: center;"&gt;2011:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-Bo4CXEoLDDg/TjKErlAwZ2I/AAAAAAAACxA/ucDrqez9qC8/s1600/oracle.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 137px;" src="http://3.bp.blogspot.com/-Bo4CXEoLDDg/TjKErlAwZ2I/AAAAAAAACxA/ucDrqez9qC8/s400/oracle.gif" alt="" id="BLOGGER_PHOTO_ID_5634711967998437218" border="0" /&gt;&lt;/a&gt;1970:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-PN0YyMSKCNo/TjKFSphBO7I/AAAAAAAACxQ/b1bSh2wX3rQ/s1600/mao.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 276px;" src="http://4.bp.blogspot.com/-PN0YyMSKCNo/TjKFSphBO7I/AAAAAAAACxQ/b1bSh2wX3rQ/s400/mao.jpg" alt="" id="BLOGGER_PHOTO_ID_5634712639222397874" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-CdnFtk8r17U/TjKEr-jQmAI/AAAAAAAACxI/Ua-KUEleG-o/s1600/mao.jpg"&gt;&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-7256304107530752704?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/7256304107530752704/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=7256304107530752704' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/7256304107530752704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/7256304107530752704'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2011/07/find-10-differences.html' title='Find 10 differences'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-Bo4CXEoLDDg/TjKErlAwZ2I/AAAAAAAACxA/ucDrqez9qC8/s72-c/oracle.gif' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-6109464635909838145</id><published>2011-07-17T00:12:00.002+02:00</published><updated>2011-07-17T00:21:03.466+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Vita'/><title type='text'>Milestone accomplished</title><content type='html'>Yesterday my 22 month old son said the magic sentence &lt;span style="font-style: italic;"&gt;Ano, tati&lt;/span&gt; (&lt;span style="font-style: italic;"&gt;Yes, daddy&lt;/span&gt;) for the first time. This is a major progress from the previous series of &lt;span style="font-style: italic;"&gt;ne&lt;/span&gt; (&lt;span style="font-style: italic;"&gt;no&lt;/span&gt;), &lt;span style="font-style: italic;"&gt;[ne]chci&lt;/span&gt; (&lt;span style="font-style: italic;"&gt;I [don't] want&lt;/span&gt;) and combos like &lt;span style="font-style: italic;"&gt;nééééééé, mamáááá, néééééé!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-6109464635909838145?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/6109464635909838145/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=6109464635909838145' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/6109464635909838145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/6109464635909838145'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2011/07/milestone-accomplished.html' title='Milestone accomplished'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-8293137869910360754</id><published>2011-07-15T15:44:00.006+02:00</published><updated>2011-07-15T17:28:15.291+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HelenOS'/><category scheme='http://www.blogger.com/atom/ns#' term='Emerging Projects'/><category scheme='http://www.blogger.com/atom/ns#' term='Minix'/><category scheme='http://www.blogger.com/atom/ns#' term='Hurd'/><title type='text'>Losers assemble, real men compose</title><content type='html'>There are basically two approaches to software development. Assembling the code by cherry-picking pre-made components or writing nearly everything from scratch. As usually, both have their cons and pros.&lt;br /&gt;&lt;br /&gt;Assembling is suitable for undermanned, time-or-otherwise pressed projects or simply for projects with a rather narrow focus which is noticeable even on the base functionality level. By reusing third-party components, these projects avoid the Not-Invented-Here syndrome, which may be a good thing because it makes other people's work worthier and saves the project's own resources. On the other hand, it may be a bad thing too as the extensive use of non-homebrew base components destroys the identity of the accepting project and can introduce bloat in the form of various compatibility and glue layers, as well as the very much undesired burden of maintaining a large foreign codebase and its bugs.&lt;br /&gt;&lt;br /&gt;For example, it turns out that our companion multiserver projects, MINIX 3 and GNU Hurd, already have or soon will have some parts assembled from:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;old Linux networking stack (GNU Hurd)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;old Linux device drivers (GNU Mach)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;old Linux file system drivers (GNU Hurd)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;L4's DDE framework for using contemporary Linux drivers (GNU Hurd and MINIX 3)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;lwIP networking stack (MINIX 3)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;NetBSD standard C library and base utilities (MINIX 3)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;This bears questions like whether MINIX 3 without its traditional userland will still continue to be MINIX 3 or rather it becomes a NetBSD distro, and gives us some idea about why are some GNU Hurd's and GNU Mach's components stuck in times of Linux 2.2 or even older.&lt;br /&gt;&lt;br /&gt;The other extreme is HelenOS, also an undermanned multiserver OS project and one in which I am actually involved. We tend to be affected by NIH and often find ourselves to be reinventing the wheel, but at the end of the day, here we go with our own implementations of the above components (networking stack, filesystems, drivers and device driver framework, and libc). Sure, they may not be perfect today or tomorrow, but they are native and unique to HelenOS and remain under our control and in our custody.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-8293137869910360754?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/8293137869910360754/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=8293137869910360754' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/8293137869910360754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/8293137869910360754'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2011/07/losers-assemble-real-men-compose.html' title='Losers assemble, real men compose'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-7613408458389838220</id><published>2011-05-27T11:53:00.004+02:00</published><updated>2011-05-27T12:12:44.433+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Europe'/><category scheme='http://www.blogger.com/atom/ns#' term='GSoC'/><title type='text'>A European look at the incomplete GSoC student statistics</title><content type='html'>There is an interesting &lt;a href="http://google-opensource.blogspot.com/2011/05/google-summer-of-code-where-are.html"&gt;graph&lt;/a&gt; on the Google Open Source &lt;a href="http://google-opensource.blogspot.com/"&gt;blog&lt;/a&gt; showing the breakdown of this year's students by their country of origin. Even though the graph does not list countries with student participation below certain limit, it provides enough information to draw some interesting conclusions.&lt;br /&gt;&lt;br /&gt;At the first sight, it looks like the US(191) and India(182) are miles ahead the other countries when it comes to the number of participating GSoC students. But when we take a second look and add the few European countries that do show up individually in the graph, namely Germany, Poland, Romania and France, we see that just these few EU countries combined are on par with the US. The final EU number will be probably much higher than that if we add students from the remaining 23 members (for instance, at least 2 for the Czech Republic).&lt;br /&gt;&lt;br /&gt;Clearly, there is some great programming potential hiding in Europe. Now, if only Europe knew how to make use of it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-7613408458389838220?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/7613408458389838220/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=7613408458389838220' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/7613408458389838220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/7613408458389838220'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2011/05/european-look-at-incomplete-gsoc.html' title='A European look at the incomplete GSoC student statistics'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-4543556366146097234</id><published>2011-04-18T16:59:00.006+02:00</published><updated>2011-04-18T17:18:13.873+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='career'/><category scheme='http://www.blogger.com/atom/ns#' term='Avast'/><title type='text'>Hola, AVAST Software!</title><content type='html'>Today was my first day in a new job. As the title suggests, I joined &lt;a href="http://www.avast.com/"&gt;AVAST Software&lt;/a&gt;, the maker of the venerable antivirus program &lt;a href="http://en.wikipedia.org/wiki/Avast%21"&gt;avast!&lt;/a&gt;. I will be working on a x86 virtualization technology related to &lt;a href="https://dip.felk.cvut.cz/browse/pdfcache/gahurj1_2007dipl.pdf"&gt;this&lt;/a&gt;. Leaving the familiar grounds of C and Solaris seems a little dangerous at first. But hey, I will soon make my hands dirty from C++ and Windows kernel programming, which makes the risky business quite rewarding.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-4543556366146097234?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/4543556366146097234/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=4543556366146097234' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/4543556366146097234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/4543556366146097234'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2011/04/hola-avast-software.html' title='Hola, AVAST Software!'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-166080103049226143</id><published>2011-04-12T11:25:00.010+02:00</published><updated>2011-04-18T17:17:57.544+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sun'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenSolaris'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><category scheme='http://www.blogger.com/atom/ns#' term='career'/><title type='text'>No more Solaris fixes or Hasta la vista, Oracle!</title><content type='html'>I am not planning to make any more integrations to the Solaris source code repository in the near future, so I am glad that before my last day at work I managed to root cause and fix a couple of nasty race conditions in Solaris SPARC VM code.&lt;span style="font-style: italic;"&gt;&lt;/span&gt; Too bad I may not share more details on this blog, but perhaps I can use some analogy. If we view the TSBs (Translation Storage Buffers) as apples, the Solaris kernel as the railways and linked lists as trains, my last integration can be described as fixing a problem in which the railways suddenly attached an empty wagon to a moving train without first stopping it and letting the locoman know, or in which the locoman was expecting a wagon full of apples to be attached, but the railways attached an empty one instead. Sure, it would be more nourishing to describe the above issues in the native terms, but it appears that for that we will need to wait some time.&lt;br /&gt;&lt;br /&gt;Today was my last day in the office, even though technically, I will be  an Oracle employee until Friday's midnight. Companies change and so do  people. I am thus closing one chapter of my professional career. Stay tuned for an update regarding my new position.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-166080103049226143?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/166080103049226143/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=166080103049226143' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/166080103049226143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/166080103049226143'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2011/04/no-more-integrations-to-solaris-or.html' title='No more Solaris fixes or Hasta la vista, Oracle!'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-5838575671976809433</id><published>2011-03-18T21:32:00.004+01:00</published><updated>2011-03-19T00:31:36.898+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HelenOS'/><category scheme='http://www.blogger.com/atom/ns#' term='GSoC'/><category scheme='http://www.blogger.com/atom/ns#' term='Emerging Projects'/><title type='text'>We have been accepted!</title><content type='html'>After three years of trying, &lt;a href="http://www.helenos.org/gsoc2011"&gt;HelenOS&lt;/a&gt; has been finally accepted as a mentoring organization for &lt;a href="http://google-opensource.blogspot.com/2011/03/mentoring-organizations-for-google.html"&gt;Google Summer of Code 2011&lt;/a&gt;. Hurray! Hurray! Hurray!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-5838575671976809433?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/5838575671976809433/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=5838575671976809433' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/5838575671976809433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/5838575671976809433'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2011/03/we-have-been-accepted.html' title='We have been accepted!'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-8284423183881249618</id><published>2011-01-24T15:01:00.003+01:00</published><updated>2011-01-24T15:31:37.341+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Nationalism'/><category scheme='http://www.blogger.com/atom/ns#' term='Xenophobia'/><category scheme='http://www.blogger.com/atom/ns#' term='Europe'/><category scheme='http://www.blogger.com/atom/ns#' term='Freedoms'/><title type='text'>Fellow villain East-Europeans, mark your calendars!</title><content type='html'>In addition to our favorite extra-curricular activity of pillaging and conducting forays of German-speaking border country, which we have been freely enjoying, unlimited by any state borders, since December 2007, we will soon celebrate another triumph. In May of this year, our hordes will completely take over the German and Austrian ditch-digging job market and make millions of German and Austrian workers jobless. Beware, the barbarians from the East are clustering together!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-8284423183881249618?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/8284423183881249618/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=8284423183881249618' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/8284423183881249618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/8284423183881249618'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2011/01/fellow-villain-east-europeans-mark-your.html' title='Fellow villain East-Europeans, mark your calendars!'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-7231003157787410351</id><published>2011-01-02T13:16:00.006+01:00</published><updated>2011-01-03T22:24:21.274+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HelenOS'/><category scheme='http://www.blogger.com/atom/ns#' term='Emerging Projects'/><title type='text'>A decade of HelenOS</title><content type='html'>In 2011, the oldest HelenOS code will turn 10. Those who were watching during its first decade, have seen HelenOS grow from a one-man adventure to a truly multi-team project involving enough people to fill a bus. HelenOS has gained substance and infrastructure in places where other similar projects have put only gilded fluff and left void. Instead of taking the easier path of imitation, it has mostly gone down the more challenging road of independent design.&lt;br /&gt;&lt;br /&gt;Among others, the last decade has brought HelenOS:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;a multiplatform kernel, a foundation on top of which everything else is built&lt;/li&gt;&lt;li&gt;an asynchronous communication layer, which interconnects everything&lt;/li&gt;&lt;li&gt;a basic user interface which allows the system to be used in a simple way&lt;/li&gt;&lt;li&gt;a file system layer so that we can import and export data to and from HelenOS&lt;/li&gt;&lt;li&gt;a modular networking stack, so that we can ping &lt;span style="font-family:courier new;"&gt;localhost&lt;/span&gt; and serve a web page&lt;/li&gt;&lt;li&gt;a device driver framework to unify work with devices and manage differences amongst various platforms in a systematic way&lt;/li&gt;&lt;li&gt;an interpreter of a high-level object oriented language with which one can extend the capabilities of the system beyond those it gained during compilation&lt;/li&gt;&lt;/ul&gt;Behind the items above and also the items that I failed to list, there are people who dedicated many hours, days, weeks and months of their time to making HelenOS better in one or another way. They were somehow able to appreciate the constant &lt;span style="font-style: italic;"&gt;not-yet-finished&lt;/span&gt; quality of the system and could see the light at the end of the tunnel, which in turn got brighter and brighter. Without their help, HelenOS would remain just a one-man adventure it once was. I would like to thank all these creative and courageous people for what they have done so far.&lt;br /&gt;&lt;br /&gt;Looking into the next decade, there is still a lot of work left to be done. We may have laid the foundations, but there is still a house to be built on them. Moreover, as our understanding of the overall system requirements changes and refines, at times it will become necessary to touch these foundations and make modifications to them, without tearing down the entire house.&lt;br /&gt;&lt;br /&gt;At the beginning, I was suggesting that HelenOS has more substance and infrastructure where some other projects do not. But the opposite is true too. Also HelenOS has major functionality and, more importantly, usability gaps that need to be fixed.&lt;br /&gt;&lt;br /&gt;For example, I would like to see the system become self-hosting and installable. A basic set of tools for administration will have to be created. There are ongoing projects that aim to introduce common concepts, such as security, that we have been carefully neglecting so far. As a true multiplatform project, we need to make sure that the features we develop are eventually available on all applicable platforms that HelenOS supports.&lt;br /&gt;&lt;br /&gt;I am looking forward to the fruits of the research being done on HelenOS by others. This is something that I have always hoped to be doing myself, but unfortunately never had a good opportunity to do as the circumstances pushed me in a slightly different direction.&lt;br /&gt;&lt;br /&gt;I'd be very glad if we managed to keep and perhaps even increase the interest among students and other enthusiasts and form an even stronger HelenOS community. Hopefully, the community will slowly change into a community of users and developers instead of merely a community of its own developers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-7231003157787410351?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/7231003157787410351/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=7231003157787410351' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/7231003157787410351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/7231003157787410351'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2011/01/decade-of-helenos.html' title='A decade of HelenOS'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-1237468046169383668</id><published>2010-11-23T16:30:00.004+01:00</published><updated>2010-11-23T17:40:46.938+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GCC'/><title type='text'>GCC has gone mad</title><content type='html'>In my July &lt;a href="http://jakubsuniversalblog.blogspot.com/2010/07/prevention-or-post-integration-fire.html"&gt;post&lt;/a&gt; I praised the GCC ability to detect uninitialized variables, but now it seems I have to take this praise back. We discovered several cases of false negatives (i.e. missing warnings) about uninitialized variables in GCC 4.5.1 that look like regressions from the behavior of GCC 4.4.4 or perhaps were not detected even by the older version.&lt;br /&gt;&lt;br /&gt;Make your own picture of the situation. The following is an example of one use of an uninitialized variable that goes undetected by the new GCC at the -O3 optimization level:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;pre&gt;312 static int packet_reply(const packet_t packet)&lt;br /&gt;313 {&lt;br /&gt;314         ipc_callid_t callid;&lt;br /&gt;315         size_t size;&lt;br /&gt;316 &lt;br /&gt;317         if (!packet_is_valid(packet))&lt;br /&gt;318                 return EINVAL;&lt;br /&gt;319 &lt;br /&gt;320          if (size != packet-&gt;length)&lt;br /&gt;321                  return ENOMEM;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;And yes, &lt;span style="font-family: courier new;"&gt;packet&lt;/span&gt; is valid and line 320 is being reached. This and other examples can be found here:&lt;br /&gt;&lt;ul&gt;&lt;li style="font-style: italic;"&gt;&lt;a href="http://trac.helenos.org/trac.fcgi/changeset/mainline%2C634.1.96"&gt;Comparison&lt;/a&gt; with an uninitialized variable,&lt;/li&gt;&lt;li style="font-style: italic;"&gt;&lt;a href="http://trac.helenos.org/trac.fcgi/changeset/mainline%2C634.1.136"&gt;Passing&lt;/a&gt; an uninitialized variable to another function,&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Function leaves its &lt;/span&gt;&lt;a style="font-style: italic;" href="http://trac.helenos.org/trac.fcgi/ticket/270"&gt;output argument&lt;/a&gt;&lt;span style="font-style: italic;"&gt; uninitialized.&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;On the web I found the GCC &lt;a href="http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24639"&gt;meta-bug&lt;/a&gt; for these and related issues and it looks like this is currently a big problem in GCC. Perhaps I would get more warnings if I first built with -O. That's possible, maybe. But I don't want to run the compilation twice. I don't like arguments that say if we detected uninitialized variables more reliably, the compilation would get slower. I can wait a little longer if I get reliable warnings.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-1237468046169383668?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/1237468046169383668/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=1237468046169383668' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/1237468046169383668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/1237468046169383668'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2010/11/gcc-has-gone-mad.html' title='GCC has gone mad'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-2072682427315346724</id><published>2010-11-17T13:28:00.013+01:00</published><updated>2010-11-17T21:58:10.010+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MFF UK'/><category scheme='http://www.blogger.com/atom/ns#' term='HelenOS'/><category scheme='http://www.blogger.com/atom/ns#' term='recruitment'/><category scheme='http://www.blogger.com/atom/ns#' term='Emerging Projects'/><title type='text'>HelenOS gains momentum</title><content type='html'>I have just gone through the inventory of all active HelenOS student projects and was impressed by the actual finding. Not only that there have never been so many students working on HelenOS at the same time, but the current number is quite high so that HelenOS as an academic project compares favorably with similar, but heavily funded, projects like MINIX 3.&lt;br /&gt;&lt;br /&gt;    &lt;table style="text-align: left; margin-left: auto; margin-right: auto;" border="0" cellspacing="0" cols="3" frame="VOID" rules="NONE"&gt;  &lt;colgroup&gt;&lt;col width="153"&gt;&lt;col width="53"&gt;&lt;col width="61"&gt;&lt;/colgroup&gt;  &lt;tbody&gt;   &lt;tr&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="LEFT" height="17" width="153"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="LEFT" width="53"&gt;People&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="LEFT" width="61"&gt;Projects&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="LEFT" height="17"&gt;Semestral assignments&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="RIGHT"&gt;1&lt;br /&gt;&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="RIGHT"&gt;1&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="LEFT" height="17"&gt;Software projects&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="RIGHT"&gt;9&lt;br /&gt;&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="RIGHT"&gt;2&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="LEFT" height="17"&gt;Bachelor theses&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="RIGHT"&gt;1&lt;br /&gt;&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="RIGHT"&gt;1&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="LEFT" height="17"&gt;Master theses&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="RIGHT"&gt;8&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="RIGHT"&gt;8&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="LEFT" height="17"&gt;Doctoral theses&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="RIGHT"&gt;1&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="RIGHT"&gt;1&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0); font-weight: bold;" align="LEFT" height="17"&gt;Total&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0); font-weight: bold;" align="RIGHT"&gt;20&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0); font-weight: bold;" align="RIGHT"&gt;13&lt;/td&gt;   &lt;/tr&gt;  &lt;/tbody&gt; &lt;/table&gt; &lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;The total number of students is actually 19 because one student works both on a team Software project and his master thesis and the above table counted him twice. Most projects figuring in the table have started only recently, which means that we are not accumulating unfinished projects. Quite the opposite: we observe an increasing trend in the amount of defended master theses:&lt;br /&gt;&lt;br /&gt;    &lt;table style="text-align: left; margin-left: auto; margin-right: auto;" border="0" cellspacing="0" cols="2" frame="VOID" rules="NONE"&gt;  &lt;colgroup&gt;&lt;col width="41"&gt;&lt;col width="56"&gt;&lt;/colgroup&gt;  &lt;tbody&gt;   &lt;tr&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="LEFT" height="17" width="41"&gt;&lt;b&gt;Year&lt;/b&gt;&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="LEFT" width="56"&gt;&lt;b&gt;Theses&lt;/b&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="RIGHT" height="17"&gt;2006&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="RIGHT"&gt;1&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="RIGHT" height="17"&gt;2007&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="RIGHT"&gt;1&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="RIGHT" height="17"&gt;2008&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="RIGHT"&gt;2&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="RIGHT" height="17"&gt;2009&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="RIGHT"&gt;2&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="RIGHT" height="17"&gt;2010&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="RIGHT"&gt;3&lt;/td&gt;   &lt;/tr&gt;  &lt;/tbody&gt; &lt;/table&gt; &lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;I was wondering what is the reason for such a rise of interest in HelenOS among students and while there is probably no single correct answer, here are my suspects:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The project is in a stage in which it needs some larger frameworks to be developed; larger frameworks can be good fit for team projects of four or five students, such as the &lt;span style="font-style: italic;"&gt;Software project&lt;/span&gt; subject at Charles University.&lt;/li&gt;&lt;li&gt;We had some interesting and high-quality project ideas up in our sleeves originally intended for the Google Summer of Code 2010, but since we were not accepted as a mentoring organization, these projects are now being picked up by regular university students, including students from foreign universities.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;HelenOS is now a first-class project at &lt;a href="http://d3s.mff.cuni.cz/home/"&gt;D3S&lt;/a&gt;. The department's web site has recently undergone a major facelift and as a result of that, it mentions HelenOS in various places that are likely to be noticed by students looking for an interesting topic.&lt;/li&gt;&lt;li&gt;The whole HelenOS movement itself is like a black hole. With every successfully completed and integrated student project, it gets noticeably better and becomes more attractive to other students who in turn tend to start new projects.&lt;/li&gt;&lt;li&gt;&lt;a href="http://d3s.mff.cuni.cz/%7Edecky/"&gt;Martin&lt;/a&gt; has likely changed his recruiting practices so that they appear more efficient now. Even though it remains unclear what change he made, it appears to work in synergy with the above.&lt;/li&gt;&lt;/ul&gt;The message is clear: if you are a student and your project or thesis topic is not related to HelenOS, than I am afraid you are not currently &lt;span style="font-style: italic;"&gt;in&lt;/span&gt; :-)&lt;br /&gt;&lt;br /&gt;The list of &lt;a href="http://trac.helenos.org/trac.fcgi/wiki/StudentSoftwareProjects"&gt;student projects&lt;/a&gt; and &lt;a href="http://trac.helenos.org/trac.fcgi/wiki/CurrentTheses"&gt;theses&lt;/a&gt; in progress is available on our &lt;a href="http://trac.helenos.org/"&gt;wiki&lt;/a&gt;. If you actually happen to be looking for a topic, the same wiki contains various pointers to yet unassigned project ideas (&lt;a href="http://trac.helenos.org/trac.fcgi/query?status=accepted&amp;amp;status=assigned&amp;amp;status=new&amp;amp;status=reopened&amp;amp;order=priority&amp;amp;col=id&amp;amp;col=summary&amp;amp;col=status&amp;amp;col=type&amp;amp;col=priority&amp;amp;col=milestone&amp;amp;col=component&amp;amp;keywords=%7Esuggestion"&gt;here&lt;/a&gt;, &lt;a href="http://trac.helenos.org/trac.fcgi/wiki/AvailableTheses"&gt;here&lt;/a&gt; and &lt;a href="http://trac.helenos.org/trac.fcgi/report/14"&gt;here&lt;/a&gt;). Or simply just &lt;a href="http://www.helenos.org/list"&gt;drop us&lt;/a&gt; a line!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-2072682427315346724?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/2072682427315346724/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=2072682427315346724' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/2072682427315346724'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/2072682427315346724'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2010/11/helenos-gains-momentum.html' title='HelenOS gains momentum'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-2982875143019682233</id><published>2010-10-21T10:53:00.008+02:00</published><updated>2010-10-21T13:17:31.163+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Git'/><category scheme='http://www.blogger.com/atom/ns#' term='CVS'/><category scheme='http://www.blogger.com/atom/ns#' term='HelenOS'/><category scheme='http://www.blogger.com/atom/ns#' term='VCS'/><category scheme='http://www.blogger.com/atom/ns#' term='Bazaar'/><category scheme='http://www.blogger.com/atom/ns#' term='Subversion'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenSolaris'/><category scheme='http://www.blogger.com/atom/ns#' term='Emerging Projects'/><category scheme='http://www.blogger.com/atom/ns#' term='Mercurial'/><title type='text'>Switching to a new version control sytem is not easy</title><content type='html'>Today I read &lt;a href="http://lwn.net/Articles/409635/"&gt;this&lt;/a&gt; &lt;a href="http://lwn.net/"&gt;LWN&lt;/a&gt; article about the pains of&lt;a href="http://www.postgresql.org/"&gt; PostgreSQL&lt;/a&gt; switch from&lt;a href="http://www.nongnu.org/cvs/"&gt; CVS&lt;/a&gt; to &lt;a href="http://git-scm.com/"&gt;Git&lt;/a&gt;. It reminded me the lessons learned during a similar endeavor which happened about a year before the PostgreSQL move.&lt;br /&gt;&lt;br /&gt;When &lt;a href="http://www.helenos.org/"&gt;HelenOS&lt;/a&gt; was about to switch to&lt;a href="http://bazaar.canonical.com/en/"&gt; Bazaar&lt;/a&gt; in August 2009, its&lt;a href="http://subversion.tigris.org/"&gt; Subversion&lt;/a&gt; repository contained only some 4686 revisions, but our previous, rather unsuccessful, attempts to convert the repository to &lt;a href="http://mercurial.selenic.com/"&gt;Mercurial&lt;/a&gt; made us start with a brand new repository rather than a converted one.&lt;br /&gt;&lt;br /&gt;The fact is that we lost the continuity of our revision history, but on the other hand we did not end up with a twisted, possibly  damaged, or even missing history. For our reference, we still keep the old Subversion repository around and we also have the Mercurial &lt;a href="http://bitbucket.org/jermar/helenoshg/"&gt;convert&lt;/a&gt;, which documents the steps needed to turn a medium-size repository of a centralized version control system with a handful of branches into a repository of a distributed version control system.&lt;br /&gt;&lt;br /&gt;The conversion process using &lt;span style="font-family:courier new;"&gt;hg convert&lt;/span&gt; was very slow, tedious and error prone. &lt;span style="font-family:courier new;"&gt;hg convert&lt;/span&gt; is not to be blamed, however, because the problems stem from the fact that there is no apparent 1:1 mapping between Subversion and Mercurial repository entities. A couple of times, I had to stop in the middle of the conversion, create synthetic history (i.e. commits that never really happened) to emulate various repository events and then resume the conversion at the next revision. The events that were confusing the conversion software were:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;changes of the repository namespace, for example when we switched from the &lt;span style="font-family:courier new;"&gt;kernel/trunk&lt;/span&gt; naming scheme to &lt;span style="font-family:courier new;"&gt;trunk/kernel&lt;/span&gt;,&lt;br /&gt;&lt;/li&gt;&lt;li&gt;starting a new branch, and&lt;br /&gt;&lt;/li&gt;&lt;li&gt;merging an existing branch into trunk.&lt;/li&gt;&lt;/ul&gt;In fact, the process was so tedious, that I decided to only fake history for the first type of events and threw the rest over the board. The result is that the Mercurial convert repository does not contain revision history for any but the main branch and it does contain some synthetic commits that mimic the various main branch renames and shuffling that happened in the past.&lt;br /&gt;&lt;br /&gt;The convert is still useful though, because it at least serves as a backup for our old trunk history, but there is no doubt that some information was lost in translation.&lt;br /&gt;&lt;br /&gt;The LWN article also touches another interesting point: it takes some serious mind-quake to stop thinking in the centralized repository way and accept the distributed nature of the new system. PostgreSQL, perhaps temporarily, decided to use the repository in a rather centralized manner and does not permit merges. The same is true for the OpenSolaris Mercurial repository, where the history is artificially kept linear. In our case, we wanted to go distributed from day one, but our initial clumsiness in distributed thinking lead to several merges that unfortunately swapped the left-hand side branch (i.e. mainline) with the right-hand side branch, back and forth. We learned from our mistakes though, documented the process and developed a Bazaar &lt;a href="http://trac.helenos.org/trac.fcgi/browser/mainline/contrib/bazaar/mbprotect/__init__.py"&gt;plug-in&lt;/a&gt; which prevents us or anyone else from repeating the same error again.&lt;br /&gt;&lt;br /&gt;Erare humanum est, but there are also lessons to be learned from either the LWN article or, hopefully, this blog entry.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-2982875143019682233?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/2982875143019682233/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=2982875143019682233' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/2982875143019682233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/2982875143019682233'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2010/10/switching-to-new-version-control-sytem.html' title='Switching to a new version control sytem is not easy'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-6660553152226890854</id><published>2010-09-07T12:31:00.006+02:00</published><updated>2010-09-07T12:52:56.130+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spaghetti'/><title type='text'>What do kernel engineers eat for lunch (when they work from home)</title><content type='html'>Before (&lt;span style="font-style: italic;"&gt;spaghetti, garlic, chili pepper, extra virgin olive oil, water, salt, parmesan, sweet basil&lt;/span&gt;):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_g_YJBZMRYiw/TIYWc9fZ_cI/AAAAAAAAClE/q2HHNHIVvYQ/s1600/DSCF0001.JPG"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_g_YJBZMRYiw/TIYWc9fZ_cI/AAAAAAAAClE/q2HHNHIVvYQ/s400/DSCF0001.JPG" alt="" id="BLOGGER_PHOTO_ID_5514119480560188866" border="0" /&gt;&lt;/a&gt;After (Spaghetti aglio olio peperoncino alla Jacobo):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_g_YJBZMRYiw/TIYWxFOqs3I/AAAAAAAAClM/BPZQp_vpUuk/s1600/DSCF0007.JPG"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_g_YJBZMRYiw/TIYWxFOqs3I/AAAAAAAAClM/BPZQp_vpUuk/s400/DSCF0007.JPG" alt="" id="BLOGGER_PHOTO_ID_5514119826234848114" border="0" /&gt;&lt;/a&gt;Can you guess what was the only non-authentic  ingredient?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-6660553152226890854?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/6660553152226890854/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=6660553152226890854' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/6660553152226890854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/6660553152226890854'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2010/09/what-do-kernel-engineers-eat-for-lunch.html' title='What do kernel engineers eat for lunch (when they work from home)'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_g_YJBZMRYiw/TIYWc9fZ_cI/AAAAAAAAClE/q2HHNHIVvYQ/s72-c/DSCF0001.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-7199735892496234535</id><published>2010-08-31T17:09:00.003+02:00</published><updated>2010-08-31T17:23:20.658+02:00</updated><title type='text'>R.I.P. Sun Microsystems Czech s.r.o.</title><content type='html'>Tonight, Sun Microsystems Czech s.r.o. will see its last sunset. Tomorrow, it will be already preying in the happy hunting grounds with Sun Microsystems Inc.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_g_YJBZMRYiw/TH0ckPIE7WI/AAAAAAAACk8/KpBFOsRdM-4/s1600/img_6602.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 267px;" src="http://4.bp.blogspot.com/_g_YJBZMRYiw/TH0ckPIE7WI/AAAAAAAACk8/KpBFOsRdM-4/s400/img_6602.jpg" alt="" id="BLOGGER_PHOTO_ID_5511592927832632674" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Mourning and funeral rites will take place at dusk at &lt;a href="http://www.ilegenda.cz/"&gt;Legenda&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-7199735892496234535?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/7199735892496234535/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=7199735892496234535' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/7199735892496234535'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/7199735892496234535'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2010/08/rip-sun-microsystems-czech-sro.html' title='R.I.P. Sun Microsystems Czech s.r.o.'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_g_YJBZMRYiw/TH0ckPIE7WI/AAAAAAAACk8/KpBFOsRdM-4/s72-c/img_6602.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-5298833001080896921</id><published>2010-08-18T21:51:00.006+02:00</published><updated>2010-08-19T01:23:49.904+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HelenOS'/><category scheme='http://www.blogger.com/atom/ns#' term='Emerging Projects'/><title type='text'>FAT on a diet</title><content type='html'>Some time ago, we received a &lt;a href="http://trac.helenos.org/trac.fcgi/ticket/250"&gt;ticket&lt;/a&gt; that complained about large files taking too long to write to a FAT file system. Times of several minutes in a simulator were reported for writing a file which occupied a couple of megabytes. After some pondering about the problem, it became apparent that the problem is the FAT file system itself, more precisely the way it keeps track of blocks belonging to a file, and also the fact that HelenOS did not even try to do the smallest thing to alleviate the situation.&lt;br /&gt;&lt;br /&gt;Used blocks of each file on a FAT file system are tracked in a linked list of consecutive clusters, where a cluster represents a fixed number of adjacent blocks. The use of the linked list structure in the on-disk file system format constitutes an interesting problem for the operating system, especially when doing sequential I/O. Whenever someone writes to or reads from some offset within the file, the operating system needs to find the block for that offset. Without any optimizations, this means walking the linked list from its beginning until the cluster and the block with the wanted offset is reached. In the worst case, one needs to walk the entire list until the last block number is found. Thus the algorithm for looking up the block with a single file offset in a file of &lt;span style="font-style: italic;"&gt;n&lt;/span&gt; blocks has &lt;span style="font-style: italic;"&gt;&lt;/span&gt;time complexity &lt;span style="font-style: italic;"&gt;O(n)&lt;/span&gt;. Now imagine that the application does not do this once, but searches the linked list repeatedly such as during sequential I/O like when loading an executable, creating an empty file, and copying or printing out an existing file. In these scenarios, the naive implementation will be traversing the list multiple times, starting from the beginning over and over again. Since each traversal is &lt;span style="font-style: italic;"&gt;O(n)&lt;/span&gt;, repeating it &lt;span style="font-style: italic;"&gt;n&lt;/span&gt; times in the worst case gives us an &lt;span style="font-style: italic;"&gt;O(n^2)&lt;/span&gt; algorithm where &lt;span style="font-style: italic;"&gt;n&lt;/span&gt; is the number of blocks.&lt;br /&gt;&lt;br /&gt;In comparison, for most disk file systems it is usually possible to devise a constant time  algorithm for looking up a single block thanks to the on-disk index of used blocks. FAT as such, as I derived above, allows only for a linear algorithm because it only has the linked list.&lt;br /&gt;&lt;br /&gt;The test case scenario in the ticket made me realize how unfortunate the situation was (I hereby admit that I was knowingly underestimating and derogating the issue prior to this experience, as Jiri can attest) so I resolved to fix it at least for the most common cases.&lt;br /&gt;&lt;br /&gt;The fixes were actually two quite straightforward optimizations, both merged in changeset:mainline,624. The first optimization works by remembering the last cluster used by the file, making thus the append operation work in constant time. This comes handy when e.g. creating an empty file or making a copy of another. The second optimization is similar, but instead of the last cluster, it remembers the cluster where the last I/O took place. This is useful for reading the whole file in linear instead of quadratic time with respect to the size of the file. The first optimization works independently from the second one, while the second optimization can still be very useful for forward-going non-sequential I/O (i.e. when reads and writes are mixed with forward seeks) as the linked list traversal will start at the remembered cluster and not at the very beginning of the linked list. Of course, this second optimization will not be that much helpful anymore when multiple clients do sequential I/O at different offsets in the file, but let's face it (I am now going to derogate this issue again), this is not a common use case for a FAT file system anyway. When I wrote that both optimizations remember some cluster, it is also possible for both of them to forget that information under some circumstances, so don't forget these are mere optimizations that will help most of the time, but not always.&lt;br /&gt;&lt;br /&gt;Below is a table and a chart that present some data I have collected in order to measure and visualize the expected improvement. I basically did a couple of experiments using a 10M FAT file system created using the mkfat HelenOS utility. For file sizes 1, 3, 5, 7 and 9 megabytes, I tried to measure the time to create a file of that size and also the time required to read the same file in its entirety. All times are in seconds and the commands I used to generate the desired workload were something like &lt;span style="font-family:courier new;"&gt;mkfile --size 5m /data/test&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;cat /data/test&lt;/span&gt;, respectively.&lt;br /&gt;&lt;br /&gt;&lt;table frame="VOID" rules="NONE" border="0" cellspacing="0" cols="13"&gt;  &lt;colgroup&gt;&lt;col width="86"&gt;&lt;col width="86"&gt;&lt;col width="86"&gt;&lt;col width="86"&gt;&lt;col width="86"&gt;&lt;col width="86"&gt;&lt;col width="86"&gt;&lt;col width="86"&gt;&lt;col width="86"&gt;&lt;col width="86"&gt;&lt;col width="86"&gt;&lt;col width="86"&gt;&lt;col width="86"&gt;&lt;/colgroup&gt;  &lt;tbody&gt;   &lt;tr&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" height="17" width="86" align="LEFT"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" width="86" align="LEFT" bgcolor="#ff6309"&gt;Write A1&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" width="86" align="LEFT" bgcolor="#ff6309"&gt;Write A2&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" width="86" align="LEFT" bgcolor="#ff6309"&gt;Write A3&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" width="86" align="LEFT" bgcolor="#ff6309"&gt;Write B1&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" width="86" align="LEFT" bgcolor="#ff6309"&gt;Write B2&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" width="86" align="LEFT" bgcolor="#ff6309"&gt;Write B3&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" width="86" align="LEFT" bgcolor="#ff6309"&gt;Read A1&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" width="86" align="LEFT" bgcolor="#ff6309"&gt;Read A2&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" width="86" align="LEFT" bgcolor="#ff6309"&gt;Read A3&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" width="86" align="LEFT" bgcolor="#ff6309"&gt;Read B1&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" width="86" align="LEFT" bgcolor="#ff6309"&gt;Read B2&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" width="86" align="LEFT" bgcolor="#ff6309"&gt;Read B3&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" height="17" align="LEFT" bgcolor="#ffb515"&gt;1MiB&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="6" sdnum="1033;" align="RIGHT"&gt;6&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="6" sdnum="1033;" align="RIGHT"&gt;6&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="6" sdnum="1033;" align="RIGHT"&gt;6&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="8" sdnum="1033;" align="RIGHT"&gt;8&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="8" sdnum="1033;" align="RIGHT"&gt;8&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="9" sdnum="1033;" align="RIGHT"&gt;9&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="5" sdnum="1033;" align="RIGHT"&gt;5&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="5" sdnum="1033;" align="RIGHT"&gt;5&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="5" sdnum="1033;" align="RIGHT"&gt;5&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="9" sdnum="1033;" align="RIGHT"&gt;9&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="9" sdnum="1033;" align="RIGHT"&gt;9&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="9" sdnum="1033;" align="RIGHT"&gt;9&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" height="17" align="LEFT" bgcolor="#ffb515"&gt;3MiB&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="21" sdnum="1033;" align="RIGHT"&gt;21&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="22" sdnum="1033;" align="RIGHT"&gt;22&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="24" sdnum="1033;" align="RIGHT"&gt;24&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="40" sdnum="1033;" align="RIGHT"&gt;40&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="41" sdnum="1033;" align="RIGHT"&gt;41&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="42" sdnum="1033;" align="RIGHT"&gt;42&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="18" sdnum="1033;" align="RIGHT"&gt;18&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="20" sdnum="1033;" align="RIGHT"&gt;20&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="17" sdnum="1033;" align="RIGHT"&gt;17&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="38" sdnum="1033;" align="RIGHT"&gt;38&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="37" sdnum="1033;" align="RIGHT"&gt;37&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="38" sdnum="1033;" align="RIGHT"&gt;38&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" height="17" align="LEFT" bgcolor="#ffb515"&gt;5MiB&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="36" sdnum="1033;" align="RIGHT"&gt;36&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="35" sdnum="1033;" align="RIGHT"&gt;35&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="34" sdnum="1033;" align="RIGHT"&gt;34&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="94" sdnum="1033;" align="RIGHT"&gt;94&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="90" sdnum="1033;" align="RIGHT"&gt;90&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="101" sdnum="1033;" align="RIGHT"&gt;101&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="29" sdnum="1033;" align="RIGHT"&gt;29&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="28" sdnum="1033;" align="RIGHT"&gt;28&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="28" sdnum="1033;" align="RIGHT"&gt;28&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="106" sdnum="1033;" align="RIGHT"&gt;106&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="99" sdnum="1033;" align="RIGHT"&gt;99&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="101" sdnum="1033;" align="RIGHT"&gt;101&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" height="17" align="LEFT" bgcolor="#ffb515"&gt;7MIB&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="51" sdnum="1033;" align="RIGHT"&gt;51&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="52" sdnum="1033;" align="RIGHT"&gt;52&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="51" sdnum="1033;" align="RIGHT"&gt;51&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="219" sdnum="1033;" align="RIGHT"&gt;219&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="202" sdnum="1033;" align="RIGHT"&gt;202&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="230" sdnum="1033;" align="RIGHT"&gt;230&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="39" sdnum="1033;" align="RIGHT"&gt;39&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="39" sdnum="1033;" align="RIGHT"&gt;39&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="39" sdnum="1033;" align="RIGHT"&gt;39&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="LEFT"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="LEFT"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="LEFT"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" height="17" align="LEFT" bgcolor="#ffb515"&gt;9MIB&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="66" sdnum="1033;" align="RIGHT"&gt;66&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="69" sdnum="1033;" align="RIGHT"&gt;69&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="67" sdnum="1033;" align="RIGHT"&gt;67&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="LEFT"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="LEFT"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="LEFT"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="53" sdnum="1033;" align="RIGHT"&gt;53&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="53" sdnum="1033;" align="RIGHT"&gt;53&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" sdval="52" sdnum="1033;" align="RIGHT"&gt;52&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="LEFT"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="LEFT"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="LEFT"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;/tr&gt;  &lt;/tbody&gt; &lt;/table&gt;&lt;br /&gt;Note that I did all my experiments using Qemu and HelenOS mainline revisions 623 (Reads/Writes B1 - B3) and 624 (Reads/Writes A1 - A3). As you can see, for most file sizes I did three repeated measurements while for some combinations of file size and operation there is no data. The lack of data after Write B3 for a 7MiB file is caused by a reboot I was forced to do by my wife who started to threaten me as it was getting late and I was still behind the computer instead of being in our bed. I tried to resume my tests after the reboot on the other day, but I was not able to repeat the results from the previous day, so I rather stopped the experiment there avoiding non-consistent data (the new measurements were consistent with each other, as were the older measurements, but unfortunately the two groups of measurements were not consistent together).  I think I could not repeat the previous day results simply because of a different load on my host system where the Qemu simulator with the experiments was running. By the way, I never said I was going to do a scientifically correct experiment, ok? And when I am at it, the times measured need to be taken with a grain of salt as I basically used a slightly jerky stopwatch provided by my Linux box.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_g_YJBZMRYiw/TGxelh2z1DI/AAAAAAAACjo/6vJtl4nr9S0/s1600/fattrend.gif"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 289px;" src="http://4.bp.blogspot.com/_g_YJBZMRYiw/TGxelh2z1DI/AAAAAAAACjo/6vJtl4nr9S0/s400/fattrend.gif" alt="" id="BLOGGER_PHOTO_ID_5506880443203703858" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Knowing the weaknesses of my measurement method, I still think I got some usable and persuasive results as can be seen in the chart above. It clearly shows the quadratic behavior of both operations in revision 623 and the linear behavior in the fixed revision 624. Note that the lines were added and smoothed by the chart drawing software to better illustrate the trends. The points in the chart correspond to the values found in the table above.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-5298833001080896921?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/5298833001080896921/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=5298833001080896921' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/5298833001080896921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/5298833001080896921'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2010/08/fat-on-diet.html' title='FAT on a diet'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_g_YJBZMRYiw/TGxelh2z1DI/AAAAAAAACjo/6vJtl4nr9S0/s72-c/fattrend.gif' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-1734016649874794752</id><published>2010-07-23T14:47:00.003+02:00</published><updated>2010-07-23T16:38:57.850+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Europe'/><title type='text'>Being politically correct when talking to Jakub</title><content type='html'>So you happen to be in a situation which involves talking to me. That is fine. I like to talk to people. There are, however, certain phrases that can easily alienate you as a speaker from me during a dialogue. If you use them you lose all my sympathies and you are basically done. Specifically, these include referring to the Czech Republic as to Eastern Europe or a post-communist country. While the latter simply feels annoyingly outdated 20+ years after the communists have lost it here and is a similar faux pas as referring to Germany or Austria as to post-Nazi countries (now or in 1965), the former is plainly wrong on all scale.&lt;br /&gt;&lt;br /&gt;Geographically speaking, Czech Republic surely belongs to the western half of the continent. Looking on the map, the geographical border between western and eastern Europe is somewhere on the line connecting Finland in the north and Greece in the south, passing through Estonia, Latvia, Lithuania, Belarus, Ukraine, Romania and Bulgaria.&lt;br /&gt;&lt;br /&gt;Historically and culturally, Czech Republic has been one of the countries in the Central European region. This was long before and now also after the Cold War, when the Iron Curtain and the communist orientation of Czechoslovakia put it to Eastern Europe. However this period was relatively short - only some 40 years - in comparison with the Central European cultural tradition of the country originating in the 17th century.&lt;br /&gt;&lt;br /&gt;Politically, Czech Republic is no doubt in the western part of the continent as a full member of NATO and EU.&lt;br /&gt;&lt;br /&gt;I prefer referring to my country as to a Central European country and am glad that some organizations, for example CIA, do the same. Unfortunately, there are also organizations, UN for instance, who get it completely wrong and do a favor to the &lt;a href="http://www.radio.cz/en/article/113186"&gt;increasingly self-confident Russian foreign policy&lt;/a&gt;. I am always ready to advocate for using the politically and geographically correct term Central Europe instead of Eastern Europe as I did and encountered partial success when BBC kept on using "Eastern Europe" in this context. On the other hand, I have recently heard some Czechs employed by one large American IT company to deliberately go with the Eastern European classification of their own country. I simply could not understand that.&lt;br /&gt;&lt;br /&gt;Don't get me wrong - I think it is perfectly okay to refer to a  geographically Eastern European country, such as Russia, Romania or  Greece, as to an Eastern European country. But I can't stand when the  term Eastern European is used inappropriately. When used in this way to  refer to the countries that were once to the east of the Iron Curtain it  has a very stigmatizing connotation which is very politically incorrect from today's perspective. Why  should two similarly located Central European countries - Austria and  the Czech Republic - be classified differently?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-1734016649874794752?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/1734016649874794752/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=1734016649874794752' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/1734016649874794752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/1734016649874794752'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2010/07/being-politically-correct-when-talking.html' title='Being politically correct when talking to Jakub'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-8736839590129193817</id><published>2010-07-02T10:52:00.005+02:00</published><updated>2010-11-23T17:42:13.174+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HelenOS'/><category scheme='http://www.blogger.com/atom/ns#' term='GCC'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenSolaris'/><category scheme='http://www.blogger.com/atom/ns#' term='Emerging Projects'/><title type='text'>Prevention or post-integration fire-fighting?</title><content type='html'>I've recently integrated fixes for the following four Solaris bugs:&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;6957730 &lt;a href="http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6957730"&gt;cpuid_amd_getids()   uses uninitialized variable coreidsz&lt;/a&gt;&lt;br /&gt;6957751 &lt;a href="http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6957751"&gt;nb_fini()   leaks memory&lt;/a&gt;&lt;br /&gt;6957783 &lt;a href="http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6957783"&gt;nb_dev_reinit()  leaks memory&lt;/a&gt;&lt;br /&gt;6957795 &lt;a href="http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6957795"&gt;Use-after-free  in fm_nvlist_create()&lt;/a&gt;&lt;br /&gt;&lt;/blockquote&gt;which were found, along the following one:&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;6957739 &lt;a href="http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6957739"&gt;rankaddr_to_chanaddr()  may return undefined value&lt;/a&gt;&lt;/blockquote&gt;using the &lt;a href="http://www.coverity.com/products/static-analysis.html"&gt;Coverity static checker&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The interesting observation here is that four of the above five bugs (only the use-after-free bug having a good excuse) would not most likely make it to the source gate at all, had the build process utilized all possible and available ways of checking for problems like that. In other words, it looks like that during the build process, we are deliberately suppressing some of the most useful warnings and errors such as those about uninitialized variables and code which has no effect. Of course, there is a feeble justification for it. The compilers are sometimes stupid and produce false-positives. So we rather silence those warnings and give no false-positive a chance to spoil our build logs that could stop our integration attempt.&lt;br /&gt;&lt;br /&gt;The above bugs are mostly harmless as they appear in de facto unreachable code or in very rarely executed error paths, but two of my older blog entries (&lt;a href="http://jakubsuniversalblog.blogspot.com/2009/04/source-of-interesting-solaris-bugs.html"&gt;here&lt;/a&gt; and &lt;a href="http://jakubsuniversalblog.blogspot.com/2008/10/two-interesting-solaris-vm-bugs.html"&gt;here&lt;/a&gt;) prove my case with real crashes caused by uninitialized variables.&lt;br /&gt;&lt;br /&gt;And the solution? Utilize all the warnings, of course. Impossible you say? Certainly not. If you take a look for example at HelenOS, you will see its code base, say 150 000 LOC, being compiled with all warnings on (&lt;span style="font-family:courier new;"&gt;-Wall&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;-Wextra&lt;/span&gt; gcc switches) and all warnings turned into errors (&lt;span style="font-family:courier new;"&gt;-Werror&lt;/span&gt; gcc switch). Any warning thus has the power to fail the build, forcing the developer to either fix it if it is a real bug or work around it if it is a false positive. I am firmly convinced that working around the false positives is the bearable necessary evil, which many times outweighs the real evils described above.&lt;br /&gt;&lt;br /&gt;Even though a time consuming task, enabling the warnings in Solaris (or at least in the &lt;span style="font-family:courier new;"&gt;onnv&lt;/span&gt; consolidation) and fixing what needs to be fixed in order to be able to build again will bring some long-term benefits, such as code quality improvements and software engineers not wasting their time by root causing and fixing bugs that were obvious and should not have been overlooked upon integration.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-8736839590129193817?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/8736839590129193817/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=8736839590129193817' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/8736839590129193817'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/8736839590129193817'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2010/07/prevention-or-post-integration-fire.html' title='Prevention or post-integration fire-fighting?'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-464524091262426766</id><published>2010-06-03T00:09:00.003+02:00</published><updated>2010-06-03T00:28:02.280+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HelenOS'/><category scheme='http://www.blogger.com/atom/ns#' term='QEMU'/><category scheme='http://www.blogger.com/atom/ns#' term='Emerging Projects'/><title type='text'>Qemu, OpenBIOS improve support for sparc64</title><content type='html'>Qemu is firmly on the trajectory to become an emulator for everything. We are already using it to emulate amd64, arm32, ia32 and ppc32. It would not be hard to make use of its mips32 support too. Thanks to Igor Kovalenko, it very recently became the first open source emulator which can do pre-Niagara UltraSPARCs. The picture shows &lt;a href="http://www.qemu.org/"&gt;Qemu&lt;/a&gt;/sparc64 current with &lt;a href="http://www.openbios.org/"&gt;OpenBIOS&lt;/a&gt; current running &lt;a href="http://www.helenos.org"&gt;HelenOS&lt;/a&gt; current:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_g_YJBZMRYiw/TAbZv5yh0nI/AAAAAAAACIw/xsxXuPvqDls/s1600/Screenshot-QEMU.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 308px;" src="http://1.bp.blogspot.com/_g_YJBZMRYiw/TAbZv5yh0nI/AAAAAAAACIw/xsxXuPvqDls/s400/Screenshot-QEMU.png" com="" img="" gifalt="" id="BLOGGER_PHOTO_ID_5478305413732618866" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;P.S.: It looks like someone is already working on Qemu/ia64, so before too long, all HelenOS ports will be able to run on Qemu, which is just great!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-464524091262426766?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/464524091262426766/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=464524091262426766' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/464524091262426766'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/464524091262426766'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2010/06/qemu-openbios-improve-support-for.html' title='Qemu, OpenBIOS improve support for sparc64'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_g_YJBZMRYiw/TAbZv5yh0nI/AAAAAAAACIw/xsxXuPvqDls/s72-c/Screenshot-QEMU.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-7217838285452498964</id><published>2010-05-31T21:46:00.006+02:00</published><updated>2010-05-31T22:19:31.240+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='HelenOS'/><category scheme='http://www.blogger.com/atom/ns#' term='C99'/><category scheme='http://www.blogger.com/atom/ns#' term='Emerging Projects'/><title type='text'>Mixed declarations and code sucks</title><content type='html'>C99 allows arbitrary interleaving of code and declarations inside one block. The previous versions of the language demanded that declarations are all at the beginning of the block, followed by the code which uses those declarations. Now, why on Earth did this change? When dealing with some eagerly C99-tified code such as unfortunately in HelenOS, I have to face several inconveniences:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;the function looks ugly, not quite like the good old C, disturbed and it makes me feel like vomiting&lt;br /&gt;&lt;/li&gt;&lt;li&gt;if the function is a bit longer, it is difficult to find out where a variable is declared&lt;/li&gt;&lt;li&gt;likewise, it is much easier to declare a variable of the same name as is the variable which exists a couple of lines below&lt;/li&gt;&lt;li&gt;in general, it is difficult to keep track of all the variable declarations scattered all over the function's body&lt;/li&gt;&lt;li&gt;bigger maintainance overhead caused by moving the declaration up if it needs to be used by some code added before its declaration (think of a simple &lt;span style="font-family: courier new;"&gt;int rc&lt;/span&gt; variable)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Who said that a variable must be declared close to its first use, especially closer than is the beginning of the entire block? I am inevitably in deep disagreement with that person and want my good old-style declarations back!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-7217838285452498964?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/7217838285452498964/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=7217838285452498964' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/7217838285452498964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/7217838285452498964'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2010/05/mixed-declarations-and-code-sucks.html' title='Mixed declarations and code sucks'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-8524590281943817377</id><published>2010-03-30T13:42:00.006+02:00</published><updated>2010-04-21T10:52:58.785+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HelenOS'/><category scheme='http://www.blogger.com/atom/ns#' term='Sysel'/><category scheme='http://www.blogger.com/atom/ns#' term='Emerging Projects'/><title type='text'>Experimental version of Sysel integrated into HelenOS</title><content type='html'>HelenOS now features a prototype version of the &lt;a href="https://launchpad.net/sysel"&gt;Sysel&lt;/a&gt; programming language interpreter developed by &lt;a href="http://jiri-svoboda.blogspot.com/"&gt;Jiri Svoboda&lt;/a&gt;. What advantage will Sysel bring to HelenOS?&lt;br /&gt;&lt;br /&gt;In the first place, it is a language which was designed specifically for HelenOS (even though it runs on POSIX systems too), so there are no problems with meeting its build dependencies. The language has / will have similar features as some popular high-level languages like C#, but is incomparably easier to deploy on HelenOS. Just imagine the heroic effort and tons of bloat needed to port Mono to our system...&lt;br /&gt;&lt;br /&gt;Additionally, using an expressive and high-level language like Sysel will enable us to write our system software on the appropriate level of abstraction, focusing on the business logic of the server processes themselves and avoiding low-level stuff like manipulating strings in C. As a consequence, the code should contain fewer stupid bugs and should take less time to write.&lt;br /&gt;&lt;br /&gt;While we certainly do not plan to abandon C, Sysel will hopefully prove itself as a high-level language suitable for HelenOS system programming. The expectations are high, so let's see how the Sysel scene evolves.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-8524590281943817377?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/8524590281943817377/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=8524590281943817377' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/8524590281943817377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/8524590281943817377'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2010/03/experimental-version-of-sysel.html' title='Experimental version of Sysel integrated into HelenOS'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-6880316242425030800</id><published>2010-03-15T22:30:00.004+01:00</published><updated>2010-03-15T23:02:38.828+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HelenOS'/><category scheme='http://www.blogger.com/atom/ns#' term='Humour'/><category scheme='http://www.blogger.com/atom/ns#' term='Emerging Projects'/><category scheme='http://www.blogger.com/atom/ns#' term='Minix'/><category scheme='http://www.blogger.com/atom/ns#' term='Hurd'/><title type='text'>Join #minix!</title><content type='html'>No, I have not deserted to the worshipers of the old Raccoon. Instead, I have done something really bold which truly exercises one's courage and also tries one's survival instinct. On IRC, I entered the chat room used by the followers of the Herd of Gnus, also known as &lt;span style="font-family: courier new;"&gt;#hurd&lt;/span&gt;. Then I felt like visiting &lt;span style="font-family: courier new;"&gt;#minix&lt;/span&gt; too, so I entered the IRC command used to enter new rooms:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family: courier new;"&gt;/join #minix&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;The problem was that I accidentally omitted the leading slash. This resulted in inviting all the on-line Hurd developers and followers to join perhaps their biggest rival (besides HelenOS :-), the MINIX 3 project. I realized my mistake soon enough and corrected myself so that I was not stoned. They actually reacted with something I would describe as slight amusement, which was good.&lt;br /&gt;&lt;br /&gt;As an epilogue to this short story, I found out that my deed raised me an apprentice, who boldly repeated the same invitation today. Looks like they are slowly getting used to it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-6880316242425030800?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/6880316242425030800/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=6880316242425030800' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/6880316242425030800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/6880316242425030800'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2010/03/join-minix.html' title='Join #minix!'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-5957664830421125563</id><published>2010-02-04T19:57:00.003+01:00</published><updated>2010-02-05T10:26:43.513+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HelenOS'/><category scheme='http://www.blogger.com/atom/ns#' term='Emerging Projects'/><category scheme='http://www.blogger.com/atom/ns#' term='networking'/><title type='text'>The most modular ever</title><content type='html'>This Tuesday I attended Lukas Mejdrech's defense of his master thesis &lt;a href="http://docs.google.com/viewer?url=http%3A%2F%2Fwww.helenos.org%2Fdoc%2Ftheses%2Flm-thesis.pdf"&gt;&lt;em&gt;Networking and TCP/IP stack for HelenOS system&lt;/em&gt;&lt;/a&gt;. Lukas literally did an excellent job presenting his work, which was credited accordingly by the committee.&lt;br /&gt;&lt;br /&gt;One benefit of Lukas's thesis is that the same networking code can be built using either monolithic architecture or modular architecture. The former refers to a setup with one userspace server task handling the network interface and the network interface access protocol, and another userspace server task for handling ARP, IP, ICMP, UDP and TCP. The latter modular model has a separate server task for each network stack layer. While the monolithic design performs about twice as good, the modular has the potential to be more robust in case of programming errors. Lukas did some research and investigated the other common microkernel-based operating systems out there and found that all have a monolithic networking stack (e.g. MINIX 3 and its INET server). We are yet to merge the networking branch into our mainline and the TCP module still needs a little bit of coding, but with this in mind, HelenOS can be thought of as the most modular multiserver operating system on the planet and also the first to achieve the goal of coming with a fully modular unprivileged  networking stack.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://docs.google.com/viewer?url=http%3A%2F%2Fwww.helenos.org%2Fdoc%2Ftheses%2Flm-thesis.pdf"&gt;&lt;em&gt;&lt;/em&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-5957664830421125563?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/5957664830421125563/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=5957664830421125563' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/5957664830421125563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/5957664830421125563'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2010/02/most-modular-ever.html' title='The most modular ever'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-2546573292077436224</id><published>2010-01-19T23:33:00.006+01:00</published><updated>2010-08-20T15:08:00.239+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HelenOS'/><category scheme='http://www.blogger.com/atom/ns#' term='Emerging Projects'/><title type='text'>I like to draw diagrams on whiteboard</title><content type='html'>&lt;div style="text-align: left;"&gt;Before implementing the unmount feature, I need to have a plan for the battle.&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_g_YJBZMRYiw/TG5-Gh3agZI/AAAAAAAACkA/kZwtV9N_Q7A/s1600/battleplan.JPG"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_g_YJBZMRYiw/TG5-Gh3agZI/AAAAAAAACkA/kZwtV9N_Q7A/s400/battleplan.JPG" alt="" id="BLOGGER_PHOTO_ID_5507478044955804050" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;I could actually appreciate a way bigger whiteboard hanging in my home office, this small one is just a temporary fallback.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-2546573292077436224?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/2546573292077436224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=2546573292077436224' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/2546573292077436224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/2546573292077436224'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2010/01/i-like-to-draw-diagrams-on-whiteboard.html' title='I like to draw diagrams on whiteboard'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_g_YJBZMRYiw/TG5-Gh3agZI/AAAAAAAACkA/kZwtV9N_Q7A/s72-c/battleplan.JPG' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-4519282271780322454</id><published>2010-01-03T17:49:00.006+01:00</published><updated>2010-01-05T13:58:17.557+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cars'/><title type='text'>Why I am (not) in love with my car</title><content type='html'>When it comes to cars, I think I am somehow attracting bad luck. Before my current car, I managed to basically destroy two cars, both in a similar way. That is not in an accident but by exploiting some hidden material fatigue. The first was an older Opel to which my driving on a high way burned a hole in one of the engine cylinders and the other was an older Hyunday Lantra which ran out of fuel at 150 km/hour and died. I must admit I knew I was going to run out of fuel and therefore I drove at 150 km/hour in a hope that I will make it to a gas station on the top of a hill. The irony is that I really made it  there, but just before I took the exit from the high way, something cracked and irreversibly broke in the engine so that the car had to be scrapped as the repair would not pay off.&lt;br /&gt;&lt;br /&gt;Then I bought my current car - a second-hand, but practically unused VW Polo. I have had it for two years now, but the list of issues I had with it looks more like twenty years. It all started when we were returning from a trip to Vienna. It was December 2007 (only three weeks after I bought it) and it was rather cold outside. The reason I mention the cold temperature is that it had its share in the extent of the damage that I am going to describe. I think we were already on a highway from Brno to Prague when we suddenly hit a hare. The animal must have been killed instantly, but it managed to blow out the front left fog light and the surrounding overcooled plastic grid and the fender. The repair cost me EUR 300, but only because I opted for non-original replacement parts. The original ones would have cost five times that much. Then I had a series of parts malfunctions: replacement of two ignition coils (EUR 150), switching device for the rear brake lights (EUR 42), oil pressure pump seal (EUR 33) and, finally, the servo unit (EUR 720) which broke on the Christmas day 2009. After the two ignition coils had died, I took the car to a periodic check (EUR 416). Between the switching device and oil pressure pump failures, my left rear view mirror was knocked off while waiting on an intersection by a truck in the neighboring lane (EUR 104).&lt;br /&gt;&lt;br /&gt;Each month, I have driven about 1600 km only by commuting to work and back. One may therefore think that I have been using the car quite intensively, but still, I have the feeling that the car is causing me troubles intentionally. I am curious what will be the next malfunction and thrilled about the time it shows. The car is like a vampire - it just sucks money instead of blood.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-4519282271780322454?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/4519282271780322454/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=4519282271780322454' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/4519282271780322454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/4519282271780322454'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2010/01/why-i-am-not-in-love-with-my-car.html' title='Why I am (not) in love with my car'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-1212571397747354367</id><published>2009-11-05T20:04:00.005+01:00</published><updated>2009-11-06T14:55:23.633+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HelenOS'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenSolaris'/><category scheme='http://www.blogger.com/atom/ns#' term='Emerging Projects'/><category scheme='http://www.blogger.com/atom/ns#' term='Minix'/><title type='text'>Reincarnation server for HelenOS?</title><content type='html'>Some operating systems have the capability to restart a server process after it unexpectedly turns up its toes. In MINIX 3, there is the reincarnation server (RS) to restart dead or hung services. In Solaris 10, the Service Management Facility (SMF) can do basically the same thing (see &lt;a href="http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6533008"&gt;6533008&lt;/a&gt; for more on the planned feature for detecting unresponsive services). Now, when asked whether a similar feature should be implemented in HelenOS, I have to say: "No, thank you!".&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Besides my belief that these reliability features may lead to system software of poorer quality because the software writers will simply rely on the restart, I have also seen too many bugs with the potential to render the system unusable especially thanks to the restarting.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In my case, these were all bugs in the start-up phase of the fault management daemon (fmd), which I happen to be sustaining as part of my job. You can find similar reports &lt;a href="http://bugs.opensolaris.org/"&gt;here&lt;/a&gt; by searching for "fmd full". The problem with fmd is that when it starts, it tries to process a backlog of unprocessed events, which is a non-trivial task. As with any complex tasks, there inevitably are bugs. So when fmd hits a bug in this phase, it dumps core and SMF restarts it. Then fmd starts to process the unprocessed events again and it dumps core again. This goes on and on until the core files fill up the /var file system and the customer calls Sun.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-1212571397747354367?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/1212571397747354367/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=1212571397747354367' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/1212571397747354367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/1212571397747354367'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2009/11/reincarnation-server-for-helenos.html' title='Reincarnation server for HelenOS?'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-2814474942746508292</id><published>2009-10-21T17:29:00.007+02:00</published><updated>2009-10-21T18:25:36.885+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HelenOS'/><category scheme='http://www.blogger.com/atom/ns#' term='alcohol'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenSolaris'/><category scheme='http://www.blogger.com/atom/ns#' term='Emerging Projects'/><title type='text'>What a productive day</title><content type='html'>Today looks like one of those more productive days. In the morning, the ONNV gate opened for me so that I was able to push two FMA fixes:&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;&lt;a href="http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6883092"&gt;6883092&lt;/a&gt; mem scheme's fmd_fmri_unusable uses the err1 variable in a wrong way&lt;br /&gt;&lt;a href="http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6889457"&gt;6889457&lt;/a&gt; Bogus error messages can be generated when both 'offset' and 'physaddr' are present in a mem FMRI&lt;br /&gt;&lt;/blockquote&gt;In the afternoon, I switched from the fix integration mode into bug finding mode and found and filed the following two x86 VM bugs:&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;&lt;a href="http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6893736"&gt;6893736&lt;/a&gt; htable_reap() always reaps only 10 page tables&lt;br /&gt;&lt;a href="http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6893744"&gt;6893744&lt;/a&gt; ptable_alloc() does not track active_ptables reliably&lt;br /&gt;&lt;/blockquote&gt;To be honest, I found these two because I simply had to find something VM-related in order to justify integration of a low-priority bug that I found some time ago:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-style: italic;"&gt;&lt;a href="http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6835500"&gt;6835500&lt;/a&gt; Superfluous ASSERT(ht-&gt;ht_lock_cnt == 0) in htable_release()&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;Sometimes things cannot be done and bugs cannot be fixed in a straightforward way, but this time the extra effort and the bug-hunt payed-off.&lt;br /&gt;&lt;br /&gt;Finally, I decided to create the following HelenOS ticket:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-style: italic;"&gt;&lt;a href="http://trac.helenos.org/trac.fcgi/ticket/136"&gt;#136&lt;/a&gt; Autodetect support for SYSENTER on ia32&lt;/span&gt;&lt;/blockquote&gt;because I have been thinking of fixing it for some time now. Unfortunately, I won't be able to work it this evening, because I am going to a &lt;a href="http://www.gastroinfo.cz/pivoklub/index.php?content=uvod&amp;amp;lang=eng"&gt;pub&lt;/a&gt; with the folks from Prague's Solaris RPE to do some Pivo (Beer) Quality Assurance.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-2814474942746508292?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/2814474942746508292/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=2814474942746508292' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/2814474942746508292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/2814474942746508292'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2009/10/what-productive-day.html' title='What a productive day'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-1941194698168086018</id><published>2009-10-04T23:47:00.006+02:00</published><updated>2009-10-06T16:05:43.360+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HelenOS'/><category scheme='http://www.blogger.com/atom/ns#' term='Emerging Projects'/><title type='text'>Cannot play MP3, but can ping localhost</title><content type='html'>&lt;blockquote&gt;&lt;/blockquote&gt;I have just updated my working copy of the HelenOS networking branch, which is now being exclusively hacked by Lukas Mejdrech, built it, booted it and... pinged localhost! To me, this is a real break-through comparable to the moment when HelenOS read from a file for the first time about two years ago.&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-1941194698168086018?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/1941194698168086018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=1941194698168086018' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/1941194698168086018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/1941194698168086018'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2009/10/cannot-play-mp3-but-can-ping-localhost.html' title='Cannot play MP3, but can ping localhost'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-906907946977247088</id><published>2009-09-17T11:11:00.004+02:00</published><updated>2009-09-17T11:26:52.505+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Vita'/><title type='text'>Next Generation Jermar</title><content type='html'>The Next Generation Jermar is called Víťa (short form of Vítězslav) and was born on September 16, 2009 at 3:17 AM.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_g_YJBZMRYiw/SrIAAfxvPvI/AAAAAAAAB-U/OtdlAz8BGFg/s1600-h/DSCF0016.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_g_YJBZMRYiw/SrIAAfxvPvI/AAAAAAAAB-U/OtdlAz8BGFg/s400/DSCF0016.JPG" alt="" id="BLOGGER_PHOTO_ID_5382364513191280370" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The picture of Vita and his happy mother. Welcome to our world, Vita!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-906907946977247088?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/906907946977247088/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=906907946977247088' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/906907946977247088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/906907946977247088'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2009/09/next-generation-jermar.html' title='Next Generation Jermar'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_g_YJBZMRYiw/SrIAAfxvPvI/AAAAAAAAB-U/OtdlAz8BGFg/s72-c/DSCF0016.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-4663536657118205709</id><published>2009-09-10T12:40:00.005+02:00</published><updated>2009-09-10T13:27:00.457+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MFF UK'/><category scheme='http://www.blogger.com/atom/ns#' term='L4'/><title type='text'>Great technical read for clock-cycle tuners</title><content type='html'>Yesterday I found a great paper by Vlastimil Babka and Petr Tuma, both from &lt;span class="Affiliation"&gt;Department of Software Engineering Faculty of Mathematics and Physics, Charles University (yes I am feeling very proud of my alma mater now :-). The paper is titled &lt;a href="http://www.springerlink.com/content/1180h7p14nuk72p8/?p=790ae35a38c54afb9932f8b2dfca7dba&amp;amp;pi=4"&gt;&lt;span style="font-style: italic;"&gt;Investigating Cache Parameters of x86 Family Processors&lt;/span&gt;&lt;/a&gt; and via sophisticated benchmarking and use of hardware performance and event counters provides gory details about the internal structure of contemporary Intel and AMD processors' TLBs and memory caches, including precise estimates of the respective miss penalties in clock cycles. What is so cool about the information provided in the paper is that it is not publicly available from elsewhere (including vendor documentation) and that the estimates are provided for the individual parts that form the TLB and the cache.&lt;br /&gt;&lt;br /&gt;Although the paper itself concludes that the presented data is probably too low-level for general software development,  I can imagine that for example the L4 people may be interested in using it to update their 1993 paper &lt;a href="http://i30www.ira.uka.de/research/publications/papers/index.php?lid=en&amp;amp;docid=639"&gt;&lt;span style="font-style: italic;"&gt;Improving IPC by Kernel Design&lt;/span&gt;&lt;/a&gt; with todays clock cycle counts.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-4663536657118205709?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/4663536657118205709/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=4663536657118205709' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/4663536657118205709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/4663536657118205709'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2009/09/great-technical-read-for-clock-cycle.html' title='Great technical read for clock-cycle tuners'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-7073319799613988180</id><published>2009-08-21T11:08:00.003+02:00</published><updated>2009-08-21T12:16:26.421+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenSolaris'/><title type='text'>Who is holding this RW-lock?</title><content type='html'>In Solaris, the kernel Readers-Writer locks are instances of the &lt;span style="font-style: italic;"&gt;rwlock_impl_t&lt;/span&gt; type. The type is defined like this:&lt;br /&gt;&lt;pre&gt;&lt;b&gt;        typedef&lt;/b&gt; &lt;b&gt;struct&lt;/b&gt; &lt;a class="d" name="rwlock_impl"&gt;&lt;/a&gt;&lt;a href="http://src.opensolaris.org/source/s?refs=rwlock_impl&amp;amp;project=/onnv" class="d"&gt;rwlock_impl&lt;/a&gt; {&lt;br /&gt;&lt;a class="l" name="45"&gt;                &lt;/a&gt;&lt;a href="http://src.opensolaris.org/source/s?defs=uintptr_t&amp;amp;project=/onnv"&gt;uintptr_t&lt;/a&gt; &lt;a class="d" name="rw_wwwh"&gt;&lt;/a&gt;&lt;a href="http://src.opensolaris.org/source/s?refs=rw_wwwh&amp;amp;project=/onnv" class="d"&gt;rw_wwwh&lt;/a&gt;; &lt;span class="c"&gt;/* waiters, write wanted, hold count */&lt;/span&gt;&lt;br /&gt;&lt;a class="l" name="46"&gt;        &lt;/a&gt;} &lt;a class="d" name="rwlock_impl_t"&gt;&lt;/a&gt;&lt;a href="http://src.opensolaris.org/source/s?refs=rwlock_impl_t&amp;amp;project=/onnv" class="d"&gt;rwlock_impl_t&lt;/a&gt;;&lt;br /&gt;&lt;/pre&gt;As you can see, it is a mere 32-bit or 64-bit word, depending on the platform. Solaris uses all bits quite extensively. The lowest three bits indicate whether there are threads waiting for this lock, if some of them wants it for writing and whether the lock is held by a writer. The remaining 29 or 61 bits are used either to hold the address of the single writer holder or the number of readers already in the critical section. The reason why 29 or 61 bits are enough to hold a thread address is that thread structures are guaranteed to be aligned on at least 8-byte boundary, so the 3 &lt;span style="font-style: italic;"&gt;missing&lt;/span&gt; bits will always be zero.&lt;br /&gt;&lt;br /&gt;Now, while it is straightforward to determine the address of the thread who owns the lock as a writer, there is nothing like a list of threads that own it for reading. Which is worse, the current implementation does not even provide means to determine the address of a sole reader owner in cases when the lock is locked by one thread for reading and the next thread wants it for writing (and all consecutive threads, no matter whether writers or readers, are blocked until the sole reader exits the critical section). No need to say that exactly this kind of information may play an essential role when analyzing a crash dump of a hung machine.&lt;br /&gt;&lt;br /&gt;Some time ago, I was involved in analyzing a hang of over 200 threads out of which the majority blocked on several RW-locks that were all held for reading:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;a href="http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6842265"&gt;&lt;span style="font-style: italic;"&gt;6842265&lt;/span&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;&lt;span&gt;&lt;span style="font-style: italic;"&gt;lots of threads transitively waiting for scsi_flag_nointr_cv in scsi_transport()&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span&gt;In my analysis, I manage to identify all the reader holders of those locks using a technique, which is unfortunately not universal, but can be repeated in other similar cases. In my case, the data structure is a device tree, where each device node has a RW-lock. Besides a suitable data structure (e.g. a tree), the essence of success was also the knowledge of the functions that got hung: I knew that some of them will always attempt to read-lock a parent node and one of its children. Thus, when I found a thread waiting for e.g&lt;/span&gt; &lt;span style="font-style: italic;"&gt;/pci@5c,600000&lt;/span&gt;, at a certain offset in &lt;span style="font-style: italic;"&gt;dv_find()&lt;/span&gt;, I knew that it must be the thread which locked the root node for reading.&lt;span&gt; To see how I identified the remaining reader-holders, I encourage you to see the above mentioned CR.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-7073319799613988180?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/7073319799613988180/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=7073319799613988180' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/7073319799613988180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/7073319799613988180'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2009/08/who-is-holding-this-rw-lock.html' title='Who is holding this RW-lock?'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-6569987173616257883</id><published>2009-07-26T13:18:00.016+02:00</published><updated>2009-09-02T13:07:07.800+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='L4'/><category scheme='http://www.blogger.com/atom/ns#' term='IPC'/><category scheme='http://www.blogger.com/atom/ns#' term='microkernels'/><title type='text'>Synchronous vs. Asynchronous, Part 1</title><content type='html'>&lt;span style="font-style: italic;"&gt;Asynchronous Communication Using Synchronous IPC Primitives&lt;/span&gt; is Stefan Götz's master thesis that I have been recently reading through. In his thesis, the author designs asynchronous communication on top of L4's synchronous model. I think this paper is rather unique because it is the only L4 thesis (that I know of) which attributes some merit to asynchronous IPC. Other relevant L4 papers seem to neglect asynchronous communication with the typical microkernel-done-right dogmas.&lt;br /&gt;&lt;br /&gt;Reading this thesis, especially the introductory chapter, was like pouring water on my microkernel antidogmatic mill because it clearly reveals a major drawback of purely synchronous IPC: increased number of address space switches. The rationale behind this claim is that with synchronous IPC, two address space switches must happen per one IPC request. The first happens on send, during a switch from the sender to the recipient and the second takes place on reply, during a switch from the recipient to the original sender. This happens per request due to the inevitable synchronous rendezvous of both communicating parties. If the communication protocol is a little bit more complicated, there will likely be several consecutive IPC sub-requests made by the sender and thus twice that number of address space switches.&lt;br /&gt;&lt;br /&gt;Now, why there is not going to be so many address space switches with asynchronous IPC? Simply because the sender and the recipient do not have to wait for each other during each IPC. The message is stored in the recipient's mailbox without the need to switch to the recipient. Of course, in case of one IPC request, the number of address space switches will eventually be the same as the recipient needs to be switched to to read the message and the sender needs to be rescheduled in order to read the reply. However, in the case of more complex protocols, both the sender can push all sub-requests to the recipient's mailbox and the recipient can drain the mailbox without any additional address space switches. The asynchronous IPC will start to have diminishing returns as the dependency among consecutive sub-requests increases and the sender needs to wait for the results of previous requests prior to making new requests (and the communication becomes de facto synchronous).&lt;br /&gt;&lt;br /&gt;&lt;div&gt;The increased number of address space switches is a problem predominantly on processors that do not have tagged TLBs such as all IA-32 architecture and AMD64 architecture processors. The TLB, standing for Translation Look-aside Buffer, is a fast cache of recently used virtual-to-physical memory mappings. Without TLBs, the computer industry would probably have taken a different direction because the use of virtual memory would be so expensive (just imagine at least &lt;i&gt;N&lt;/i&gt; physical memory accesses per page table walk incurred by a single instruction fetch on architectures with &lt;i&gt;N&lt;/i&gt;-level page tables) that no one would like to use it (I think I have this observation from Andrew Tanenbaum's &lt;span style="font-style: italic;"&gt;Modern Operating Systems&lt;/span&gt;, but my memory is weak so I might be wrong). With non-tagged TLBs, each TLB can contain mappings for only one address space, which has the unpleasant implication that non-tagged TLBs must be flushed on an address space switch. Flushed TLBs are gradually repopulated with the new address space's working set, which takes some time. Until the working set is completely restored, the TLB is not fully utilized and the system performance suffers the cost of all the page table walks.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The preceding paragraphs combined speak against massive and zealous use of synchronous IPC. The L4 developers came up with several architecture-specific tricks how to work around this problem. For example, in &lt;span style="font-style: italic;"&gt;Improved Address-Space Switching on Pentium by Transparently Multiplexing User Address Spaces&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; Jochen Liedtke describes a way how to switch "small" address spaces without flushing the TLB on IA-32. No need to hold the surprise any longer, for address spaces of certain small size, they use segmentation. On AMD64, though, the segmentation has been practically removed from the processor, so this trick cannot be used.&lt;br /&gt;&lt;br /&gt;All in all, it looks like asynchronous communication does indeed have some advantages over the synchronous communication. If taken ad absurdum, it is possible to devise IPC protocols which will linearly increase the number of address space switches with the number of requests made using the synchronous IPC.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-6569987173616257883?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/6569987173616257883/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=6569987173616257883' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/6569987173616257883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/6569987173616257883'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2009/07/synchronous-vs-asynchronous-part-1.html' title='Synchronous vs. Asynchronous, Part 1'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-3804352364631868168</id><published>2009-06-22T21:18:00.000+02:00</published><updated>2009-06-22T22:03:44.826+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HelenOS'/><category scheme='http://www.blogger.com/atom/ns#' term='Emerging Projects'/><title type='text'>Christmas time in June</title><content type='html'>If you have followed the HelenOS development mailing list lately, you might have come to a conclusion that it must be Christmas again.&lt;div&gt;&lt;br /&gt;It all started with me committing support for non-root file system mounts. As the name suggests, this feature allows people to mount more than one file system at a time and to create a file system hierarchy as we know it from other operating systems. With this feature, it was finally possible to boot off a FAT file system ramdisk and mount an empty TMPFS file system under &lt;span class="Apple-style-span" style="font-style: italic;"&gt;/tmp&lt;/span&gt;. Actually even better is booting off a TMPFS file system ramdisk and mounting a FAT (or any other) file system from permanent block device. The design is such that the mount point data is not stored centrally in e.g. the VFS task, but is distributed across the endpoint file systems. Each node in the endpoint file system server is a potential mount point. When something gets mounted under it, the mount point data containing an open connection to the mounted file system server is recorded in it. I was quite surprised and delighted when I found out that homogeneous mounts (e.g. mounting FAT on FAT) do not need any special treatment other than a little bit of locking discipline in the kernel when cloning the VFS connection to the mountee for the mounter. The figure below depicts how VFS and the endpoint file systems are interconnected (displaying only connections along which file system requests can be sent).&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_g_YJBZMRYiw/Sj9Qn0Ib1EI/AAAAAAAABes/jUn_j8LLdRI/s1600-h/fscon.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 181px;" src="http://4.bp.blogspot.com/_g_YJBZMRYiw/Sj9Qn0Ib1EI/AAAAAAAABes/jUn_j8LLdRI/s320/fscon.png" alt="" id="BLOGGER_PHOTO_ID_5350083527278580802" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Non-root mounts are essential not only for mounting file systems on real block devices, but also for seemingly unrelated features such as console inheritance between e.g. the &lt;span class="Apple-style-span" style="font-style: italic;"&gt;bdsh&lt;/span&gt; shell and a newly spawned task. This is where Martin got involved. He added a new file system called DEVFS, which roughly speaking associates file system nodes with IPC services such as console. Each virtual console has a corresponding node under &lt;span class="Apple-style-span" style="font-style: italic;"&gt;/dev&lt;/span&gt; (for instance &lt;span class="Apple-style-span" style="font-style: italic;"&gt;/dev/vc0&lt;/span&gt;).  When spawning a new task, the shell application passes it its &lt;span class="Apple-style-span" style="font-style: italic;"&gt;stdin&lt;/span&gt;, &lt;span class="Apple-style-span" style="font-style: italic;"&gt;stdout&lt;/span&gt; and &lt;span class="Apple-style-span" style="font-style: italic;"&gt;stderr&lt;/span&gt;.  When the application writes its standard output, the &lt;span class="Apple-style-span" style="font-style: italic;"&gt;write&lt;/span&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;()&lt;/span&gt; request first goes to DEVFS, which in turn sends it to the console server.&lt;/div&gt;&lt;div&gt;Jiri spotted the opportunity and created three block device drivers: &lt;span class="Apple-style-span" style="font-style: italic;"&gt;gxe_bd&lt;/span&gt;, &lt;span class="Apple-style-span" style="font-style: italic;"&gt;ata_bd&lt;/span&gt; and &lt;span class="Apple-style-span" style="font-style: italic;"&gt;file_bd&lt;/span&gt;. The first one is to be used with the arm32 and mips32 ports on the GXemul simulator. It controls the simple GXemul disk device. The second one is a simple driver for the ATA disks and can be used in the Qemu simulator with the ia32 and amd64 ports. Note that Jiri now warns against using it on real systems with real disks. The last block device driver, &lt;span class="Apple-style-span" style="font-style: italic;"&gt;file_bd&lt;/span&gt;, is a loopback block device. It creates a new block device backed by a file. If the file contains an image of a file system, it can be mounted as though it was located on a real block device.&lt;/div&gt;&lt;div&gt;In parallel with the trunk changes, Lukas Mejdrech committed his IP bits to the networking branch. These changes allow HelenOS running in the Qemu simulator to receive data  from the web browser running on the localhost. True, it still cannot answer the HTTP request (for that there would have to be more of the TCP module and some simple HTTP server), but it nicely demonstrates the progress.&lt;/div&gt;&lt;div&gt;To give this blog some real meat and to show that there are problems too, consider the following diagram:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_g_YJBZMRYiw/Sj9Qnn4IeBI/AAAAAAAABek/_o_S5uyJZe0/s1600-h/fsdeadlock.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 242px;" src="http://4.bp.blogspot.com/_g_YJBZMRYiw/Sj9Qnn4IeBI/AAAAAAAABek/_o_S5uyJZe0/s320/fsdeadlock.png" alt="" id="BLOGGER_PHOTO_ID_5350083523988977682" border="0" /&gt;&lt;/a&gt;It illustrates the sequence of requests made when trying to mount a file system image stored in a regular file located on an already mounted TMPFS file system. What is notable is that there is a cycle in the diagram, because FILE_BD is both a block device driver and also a client of the VFS server. For some time, there has been exactly one open connection between VFS and each endpoint file system, and one connection fibril to handle it. So what do we make of it? It's a clear deadlock situation: the sole fibril will be waiting for answers to requests made along the cycle while VFS will wait for the same fibril to process a new &lt;span style="font-style: italic;"&gt;read()&lt;/span&gt; request.&lt;br /&gt;&lt;br /&gt;A similar situation occurred when one task blocked in &lt;span style="font-style: italic;"&gt;read()&lt;/span&gt; waiting for a character to be read. This put the sole DEVFS fibril to sleep and delayed consequent requests to &lt;span style="font-style: italic;"&gt;write()&lt;/span&gt; a character on the remaining virtual consoles.&lt;br /&gt;&lt;br /&gt;It took us some serious thinking before we realized that we are hitting exactly this problem. Eventually I fixed it for now by allowing VFS to open multiple connections to the endpoint file systems.&lt;br /&gt;&lt;br /&gt;So to sum this writing up, the next upcoming HelenOS release will be full of (hopefully well debugged) new interesting features.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-3804352364631868168?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/3804352364631868168/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=3804352364631868168' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/3804352364631868168'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/3804352364631868168'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2009/06/christmas-time-in-june.html' title='Christmas time in June'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_g_YJBZMRYiw/Sj9Qn0Ib1EI/AAAAAAAABes/jUn_j8LLdRI/s72-c/fscon.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-6602060342520949512</id><published>2009-06-02T10:31:00.005+02:00</published><updated>2009-06-02T15:08:56.000+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='FMA'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenSolaris'/><title type='text'>OpenSolaris 2009.06 is out!</title><content type='html'>The new release of OpenSolaris was &lt;a href="http://www.sun.com/aboutsun/pr/2009-06/sunflash.20090601.1.xml"&gt;released&lt;/a&gt; yesterday and if I count right, it contains two fixes of mine:&lt;br /&gt;&lt;blockquote&gt;&lt;a style="font-style: italic;" href="http://bugs.opensolaris.org/view_bug.do?bug_id=6747539" target="_top"&gt;6747539&lt;/a&gt;&lt;span style="font-style: italic;"&gt; hati_pte_map() should undo HTABLE_LOCK_INC(ht) on LPAGE_ERROR&lt;/span&gt;&lt;br /&gt;&lt;a style="font-style: italic;" href="http://bugs.opensolaris.org/view_bug.do?bug_id=6743475" target="_top"&gt;6743475&lt;/a&gt;&lt;span style="font-style: italic;"&gt; Some MCA banks are skipped too fearlessly&lt;/span&gt; &lt;blockquote&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;I have already blogged about the first fix in one of my previous &lt;a href="http://jakubsuniversalblog.blogspot.com/2008/10/two-interesting-solaris-vm-bugs.html"&gt;blogs&lt;/a&gt;. The second fix slightly improves OpenSolaris MCA (Machine Check Architecture) code by adhering more closely to the Intel and AMD specifications and, by virtue of that, supporting more error detectors.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-6602060342520949512?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/6602060342520949512/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=6602060342520949512' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/6602060342520949512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/6602060342520949512'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2009/06/opensolaris-200906-is-out.html' title='OpenSolaris 2009.06 is out!'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-2718260018832836569</id><published>2009-05-22T11:35:00.004+02:00</published><updated>2009-05-25T16:43:50.917+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MFF UK'/><category scheme='http://www.blogger.com/atom/ns#' term='HelenOS'/><category scheme='http://www.blogger.com/atom/ns#' term='Lestes'/><category scheme='http://www.blogger.com/atom/ns#' term='Emerging Projects'/><category scheme='http://www.blogger.com/atom/ns#' term='SPAD'/><title type='text'>Idea: MFF UK almanac</title><content type='html'>A couple of years ago, I had a great idea of putting together the greatest software created at my alma mater - Faculty of Mathematics and Physics, Charles University in Prague (&lt;a href="http://www.mff.cuni.cz/"&gt;MFF UK&lt;/a&gt;) - and releasing it on a CD in the form of an almanac. At that time, the idea was presented to the academic senate by my complice &lt;a href="http://www.decky.cz/"&gt;Martin Decky&lt;/a&gt; where it received some positive feedback. Unfortunately, the idea died shortly after that due to the lack of further momentum and support.&lt;br /&gt;&lt;br /&gt;Nevertheless, it still seems to me worth doing even on a longer than yearly basis. So what is the general characteristics of projects created at MFF UK that I have on my mind?&lt;br /&gt;&lt;br /&gt;Most of them would be fruits of a subject called &lt;a href="http://is.cuni.cz/eng/studium/predmety/index.php?do=predmet&amp;amp;kod=NPRG023"&gt;Software project&lt;/a&gt;. During my university years, it used to be a multi-semester enterprise, which usually spanned several years and involved from 4 to 7 students. Projects like &lt;a href="http://lestes.jikos.cz/"&gt;Lestes&lt;/a&gt; (C++ compiler), &lt;a href="http://www.helenos.org/"&gt;HelenOS&lt;/a&gt; (operating system) and Ultimate Racer (car racing game) would be good examples. Most of these projects were abandoned by their authors shortly after they had received credits for the subject, and were never finished.&lt;br /&gt;&lt;br /&gt;Another group of projects are random cool projects that I know of. From the older ones, these are the ECCE C compiler and the T3 operating system and its distributed successor T4, all produced by the &lt;a href="http://ulita.ms.mff.cuni.cz/%7Eulita/"&gt;Ulita&lt;/a&gt; group. Nowadays, I am afraid, you can find only technical papers about these systems. From the new ones it is &lt;a href="http://artax.karlin.mff.cuni.cz/%7Emikulas/"&gt;Mikulas Patocka&lt;/a&gt;'s &lt;a href="http://www.jikos.cz/%7Emikulas/spad"&gt;SPAD&lt;/a&gt; operating system and its file system &lt;a href="http://artax.karlin.mff.cuni.cz/%7Emikulas/vyplody/spadfs/"&gt;SpadFS&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Thanks to my personal bias, the almanac would be mostly composed of operating systems and compilers (already five in total), but I would leave some space for other projects such as the &lt;a href="http://links.sourceforge.net/"&gt;Links&lt;/a&gt; web browser, the &lt;a href="http://ronja.twibright.com/about.php"&gt;Ronja&lt;/a&gt; datalink or the &lt;a href="http://aa-project.sourceforge.net/index.html"&gt;AA-lib&lt;/a&gt; graphics library. Of course, I don't know all the cool MFF UK projects out there, so if you have a tip, feel free to post it to the comments.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-2718260018832836569?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/2718260018832836569/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=2718260018832836569' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/2718260018832836569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/2718260018832836569'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2009/05/idea-mff-uk-almanac.html' title='Idea: MFF UK almanac'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-2383556011899941499</id><published>2009-04-22T15:28:00.005+02:00</published><updated>2009-04-22T16:04:37.495+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HelenOS'/><category scheme='http://www.blogger.com/atom/ns#' term='Emerging Projects'/><title type='text'>Time to go embedded</title><content type='html'>It looks like we will need to optimize HelenOS for embedded systems because it is getting too big for some machines. One particular machine, which has been causing us problems is the Simics Serengeti system, a close relative of &lt;a href="http://www.sun.com/servers/midrange/sunfire6800/"&gt;this&lt;/a&gt; half-ton UltraSPARC III-based baby. The problem which puts Serengeti into the embedded category is that its OpenFirmware is for some reason unable to allocate enough contiguous space to accommodate the HelenOS boot image and/or the ramdisk. One therefore needs to be somewhat picky when configuring the system for Serengeti, which results in a reduced set of features that can be used on this system.&lt;br /&gt;&lt;br /&gt;I am planning to change the build and configuration system in a way which would support optimizing for size. This ranges from using &lt;span style="font-family:courier new;"&gt;-Os&lt;/span&gt; instead of &lt;span style="font-family:courier new;"&gt;-O3&lt;/span&gt; and stripping the binaries to cherry-picking what binaries will be part of the ramdisk and deploying the hopefully-soon-to-be-completed dynamic linker.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-2383556011899941499?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/2383556011899941499/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=2383556011899941499' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/2383556011899941499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/2383556011899941499'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2009/04/time-to-go-embedded.html' title='Time to go embedded'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-8027726006538674919</id><published>2009-04-01T15:03:00.006+02:00</published><updated>2009-04-01T16:26:21.231+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenSolaris'/><title type='text'>Source of interesting Solaris bugs</title><content type='html'>In one of my  previous &lt;a href="http://jakubsuniversalblog.blogspot.com/2008/10/two-interesting-solaris-vm-bugs.html"&gt;blogs&lt;/a&gt;, I talked about how I accidentally discovered two new VM bugs in Solaris 10 when I had done regression testing of my own fix for some unrelated problem. A couple of weeks ago, I found myself in a similar situation. This time, I did regression tests for a Solaris 10 backport of one of those two VM bugs (I had to fix it in Solaris Nevada first) and one of the tests resulted in kernel heap corruption. I was lucky, because the crash occurred on a debug kernel which runs with the &lt;a href="http://src.opensolaris.org/source/search?q=&amp;amp;defs=kmem_flags&amp;amp;refs=&amp;amp;path=kmem.c"&gt;&lt;span style="font-family: courier new;"&gt;kmem_flags&lt;/span&gt;&lt;/a&gt; variable set to &lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;0xf&lt;/span&gt;. Besides other things, this setting enables buffer transaction logging and detection of writes past the end of a buffer. With this aid and the crash dump, I was able to root cause this bug. Exactly as in the previous case, the culprit here was an uninitialized variable. If you are interested, have a look at the following CR:&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;&lt;span &gt;&lt;a href="http://bugs.opensolaris.org/view_bug.do?bug_id=6823941"&gt;6823941&lt;/a&gt; &lt;/span&gt;&lt;span &gt;sendvec_chunk() uses uninitialized variables&lt;/span&gt;&lt;/blockquote&gt;&lt;span &gt;&lt;/span&gt;&lt;span &gt;What is striking is that neither of these uninitialized variables was discovered in compile-time or lint-time. Well, it's not that striking when we notice what options are used to build Solaris. Among others, the Solaris compiler wrapper utility turns on &lt;span style="font-family: courier new;"&gt;-Wno-uninitialized&lt;/span&gt;, which explains why GCC does not complain.&lt;br /&gt;&lt;br /&gt;The morale of the story is threefold:&lt;br /&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;do regression testing of debug binaries too or they become source of fun for someone else&lt;br /&gt;&lt;/li&gt;&lt;li&gt;do not write functions that span over 14 standard terminals in the height dimension&lt;/li&gt;&lt;li&gt;compiler warnings can be useful&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-8027726006538674919?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/8027726006538674919/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=8027726006538674919' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/8027726006538674919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/8027726006538674919'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2009/04/source-of-interesting-solaris-bugs.html' title='Source of interesting Solaris bugs'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-4633243356436185773</id><published>2009-03-19T16:39:00.005+01:00</published><updated>2009-03-19T19:27:42.941+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HelenOS'/><category scheme='http://www.blogger.com/atom/ns#' term='Emerging Projects'/><title type='text'>How big is HelenOS? How small it can get?</title><content type='html'>After some discussion with Jiri, I thought it would be useful to know how big is the HelenOS kernel. I've done several measurements and obtained interesting and surprising results. For each architecture, I have built the system using the default configuration, and a configuration with all options disabled. Both these builds would use the -O3 optimization. Then I changed the -O3 to -Os and rebuilt the minimal configuration. On some platforms, the -Os could not be used right away due to missing parts of the softint library, so I used -O2 instead. The HelenOS build system does not strip the kernel.raw binary so I did that manually and wrote down the final size obtained. These are my results:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_g_YJBZMRYiw/ScJxxA_tW5I/AAAAAAAABXA/rDtoSy_sHN0/s1600-h/ks.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 265px;" src="http://2.bp.blogspot.com/_g_YJBZMRYiw/ScJxxA_tW5I/AAAAAAAABXA/rDtoSy_sHN0/s400/ks.png" alt="" id="BLOGGER_PHOTO_ID_5314935597145349010" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;What is immediately clear from the chart is that there is something wrong with amd64 as it gives a kernel which is about three times as big as the other kernels. We'll clearly need to investigate this.&lt;br /&gt;&lt;br /&gt;All 32-bit kernels and all 64-bit kernels except the amd64 kernel are comparable in size. The ia32 kernel is the smallest one, even though it would be interesting to know how small would be the arm32 kernel with the &lt;span style="font-family:courier new;"&gt;-Os&lt;/span&gt; optimization. When the minimal configuration is optimized for size and stripped, the ia32 binary is only 116 KiB. When I alter the kernel Makefile, I can get additional 4 KiB away by not using frame pointers (&lt;span style="font-family:courier new;"&gt;-fomit-frame-pointer&lt;/span&gt;). Even though not supported right now, further 27 KiB can be shook off by not including the &lt;span style="font-family:courier new;"&gt;.bss&lt;/span&gt; section in the kernel image. This will give us quite respectable kernel size of just 84 KiB! This 84 KiB kernel would be completely headless (almost no drivers compiled in) and trimmed down (e.g. without SMP support), but it would do its job well. I believe further improvements are still possible, but the continued effort will most likely start to have diminishing results soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-4633243356436185773?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/4633243356436185773/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=4633243356436185773' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/4633243356436185773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/4633243356436185773'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2009/03/how-big-is-helenos-how-small-it-can-get.html' title='How big is HelenOS? How small it can get?'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_g_YJBZMRYiw/ScJxxA_tW5I/AAAAAAAABXA/rDtoSy_sHN0/s72-c/ks.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-147804890067673373</id><published>2009-03-13T18:11:00.021+01:00</published><updated>2009-03-14T12:56:33.413+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HelenOS'/><category scheme='http://www.blogger.com/atom/ns#' term='HID'/><category scheme='http://www.blogger.com/atom/ns#' term='Emerging Projects'/><title type='text'>Interfacing with the user in HelenOS</title><content type='html'>For about a month, Martin, Jiri and me have been torturing HelenOS sources in a distributed attempt to improve the subsystems responsible for processing user's input and output. Things are still not perfect now, but before these changes, this part of HelenOS was a complete disaster. Here are few examples of how badly designed this part of HelenOS was:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;There was no layering between the hardware drivers and the code which interpreted characters received using these drivers - everything would happen inside the driver itself. With this setup it was not possible to support different hardware configurations in a clean and generic way. For instance, the ns16550 driver assumed a Sun keyboard attached to the ns16550 serial port. This was, of course, something which complicated the use of the driver for plain serial communication between two computers interconnected with a serial cable.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Neither the kernel nor the userspace drivers supported more than one instance of each character device (e.g. i8042, ns16550, z8530).&lt;/li&gt;&lt;li&gt;Because of only one instance was supported, each driver inferred its role as stdin or stdout without asking.&lt;/li&gt;&lt;li&gt;The way how interrupts were sent to userspace device drivers required a little brother kernel driver for the same device which would accept the interrupt and send it to the userspace server.&lt;/li&gt;&lt;li&gt;Both kernel and userspace drivers were rather platform specific, either using memory mapped accesses to device's registers or separate I/O instructions.&lt;/li&gt;&lt;li&gt;There was also some duplication of code, both on the physical device level (e.g. duplicate ns16550 driver) and also on the character interpretation level (e.g. several occurrences of code which processed serial line input).&lt;/li&gt;&lt;/ul&gt;Jiri was the first to do something about it. He focused on the userspace &lt;span style="font-family:courier new;"&gt;kbd&lt;span style="font-family:georgia;"&gt; server and introduced layering into it. In his design (see the picture below), &lt;/span&gt;&lt;/span&gt;there are &lt;span class="Apple-style-span" style="font-style: italic;"&gt;port&lt;/span&gt; drivers, that control the physical devices such as the i8042 or z8530. In combination with my later changes, the port drivers use generic PIO operations to directly interact with the device. Each port driver would typically register an interrupt handler for the device's interrupt and provide an interrupt top-half pseudocode. Upon interrupt, the port driver reads data from the device and pushes it to the next layer. The next layer in this case is the &lt;span class="Apple-style-span" style="font-style: italic;"&gt;controller&lt;/span&gt; layer. It assumes a PC keyboard data on input. If the input data does not come from a PC keyboard but, for example, a serial line, the &lt;span class="Apple-style-span" style="font-style: italic;"&gt;controller&lt;/span&gt; layer driver transforms the stream of ASCII characters into PC keyboard scan codes using a scan code simulator. This layer would also convert other forms of input such as that coming from the Sun keyboard to the set of PC keyboard scan codes. Thus, the PC keyboard scan codes form a common representation of data coming from the lower layers. In order to support multiple keyboard layouts and to distinguish physical location of the pressed key from its label, the common representation is referred to as to key codes rather than scan codes. Key codes are further pushed to the next layer called the &lt;span class="Apple-style-span" style="font-style: italic;"&gt;event&lt;/span&gt; layer. The &lt;span class="Apple-style-span" style="font-style: italic;"&gt;event&lt;/span&gt; layer keeps track of the status of the Shift, Ctrl, Alt and the Lock keys and performs the layout translation. So far, two layouts are supported:&lt;div&gt;&lt;ul&gt;&lt;li&gt;US QWERTY&lt;/li&gt;&lt;li&gt;US Dvorak&lt;/li&gt;&lt;/ul&gt;After the layout translation is done, the key event is sent via IPC to the only consumer of &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;kbd&lt;/span&gt; - the &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;console&lt;/span&gt; server.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_g_YJBZMRYiw/SbuRDhfvLzI/AAAAAAAABWw/hogxtO8gomI/s1600-h/kbd.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 293px;" src="http://3.bp.blogspot.com/_g_YJBZMRYiw/SbuRDhfvLzI/AAAAAAAABWw/hogxtO8gomI/s400/kbd.png" alt="" id="BLOGGER_PHOTO_ID_5312999675130752818" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Encouraged and inspired by Jiri's success, I wanted to fix the layering and all the other above mentioned problems in the kernel too. I started by converting the kernel drivers to the PIO (Programmed I/O) interface. The PIO functions abstract the implementation of the machine's I/O space away and allow the drivers to be written in a generic way, regardless of the fact whether the device is in a separate I/O space or is memory mapped. Once I had PIO for all platforms, I started to convert all character device drivers to it. That was probably the easiest part. In parallel, I began to slowly move away from the one-instance per device driver model and free the kernel drivers from the duty to notify their userspace counterparts about interrupts via IPC. That was probably the hardest part as it required:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;extend the interrupt top-half pseudocode to support independent userspace drivers, and&lt;/li&gt;&lt;li&gt;rewrite the way how interrupts are dispatched in the kernel, and&lt;/li&gt;&lt;li&gt;fix the userspace drivers to use the new pseudocode.&lt;/li&gt;&lt;/ul&gt;Extending the pseudocode was rather fun. I took the chance and fixed the existing pseudocode to only make use of PIO when accessing the device and added operations for testing bits, conditional execution of blocks of pseudocode commands and accepting the interrupt.&lt;/div&gt;&lt;div&gt;Rewriting interrupt dispatching looked like a real teaser to me because the kernel interrupt structures are never deallocated while the userspace interrupt structures need to be allocated and deallocated dynamically on demand. It was also interesting from the synchronization point of view as I didn't want to deallocate a userspace interrupt structure while the interrupt is in progress. In the end, I came up with a solution with separate hash tables for userspace and kernel interrupts. My change broke some things such as &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;klog&lt;/span&gt; and &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;kconsole&lt;/span&gt; notifications as well as switching between kernel and userspace drivers. The latter used to work thanks to the &lt;span class="Apple-style-span" style="font-style: italic;"&gt;grab&lt;/span&gt; and &lt;span class="Apple-style-span" style="font-style: italic;"&gt;release&lt;/span&gt; methods in each kernel driver. But since the kernel driver became a distinct entity and these functions were removed, the driver toggling had to be solved in another way. This is were Martin got involved and implemented a clever fix:&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;if the &lt;span class="Apple-style-span" style="font-style: italic;"&gt;silent&lt;/span&gt; variable is &lt;span class="Apple-style-span" style="font-style: italic;"&gt;true,&lt;/span&gt; search the userspace hash table first and the kernel  hash table second&lt;/blockquote&gt;&lt;blockquote&gt;if the &lt;span class="Apple-style-span" style="font-style: italic;"&gt;silent&lt;/span&gt; variable is &lt;span class="Apple-style-span" style="font-style: italic;"&gt;false&lt;/span&gt;, search the kernel hash table first and the userspace hash table second&lt;/blockquote&gt;This gives a userspace driver a chance to process the interrupt if the kernel console is inactive, but if there is no userspace driver to claim the interrupt, the kernel can still react to it, and vice versa.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Having freed the kernel drivers from the burden of interrupt notifications for userspace brothers, I could finally proceed to fix the other problems and layer the kernel input subsystem into several components. At the lowest level, there are serial controller drivers, much like the &lt;span class="Apple-style-span" style="font-style: italic;"&gt;port&lt;/span&gt; drivers in the case of the userspace &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;kbd&lt;/span&gt; server.  Each driver connects either to a keyboard input module or a serial line input module. Contrary to the userspace server, the kernel input modules convert raw data from the serial controller drivers to a stream of ASCII characters and feed it the connected component, which is most likely the kernel console.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;After my change, Martin noticed that the data structure which has been used to pass characters between various components - &lt;span class="Apple-style-span" style="font-style: italic;"&gt;chardev_t&lt;/span&gt; - is bidirectional in nature, even though it is mostly used for one direction only. After some 30 commits, the whole kernel and all drivers and input modules were converted to use &lt;span class="Apple-style-span" style="font-style: italic;"&gt;indev_t&lt;/span&gt; for input devices and &lt;span class="Apple-style-span" style="font-style: italic;"&gt;outdev_t&lt;/span&gt; for output devices instead.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;On the userspace side, the &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;kbd&lt;/span&gt; server is still a monolithic piece of software with a limited hardware support and flexibility configured during compile time. We are considering changing this towards a more modular scheme in which there would be one running &lt;span class="Apple-style-span" style="font-style: italic;"&gt;port&lt;/span&gt; driver task per device instance. That would allow us to move the configuration from compile time to runtime.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-147804890067673373?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/147804890067673373/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=147804890067673373' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/147804890067673373'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/147804890067673373'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2009/03/interfacing-with-user-in-helenos.html' title='Interfacing with the user in HelenOS'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_g_YJBZMRYiw/SbuRDhfvLzI/AAAAAAAABWw/hogxtO8gomI/s72-c/kbd.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-6072630399747517266</id><published>2009-02-14T17:18:00.007+01:00</published><updated>2009-02-14T17:44:58.191+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenBSD'/><category scheme='http://www.blogger.com/atom/ns#' term='HelenOS'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenSolaris'/><category scheme='http://www.blogger.com/atom/ns#' term='Emerging Projects'/><title type='text'>Interesting discovery about HelenOS/sparc64</title><content type='html'>In the newly released HelenOS 0.4.0, we deliver improved support for 64-bit SPARC machines. This improved support is not so much interesting because of the higher number of peripherals supported (even though that number has also gone up), but mainly because of the higher number of individual SPARC processor models on which HelenOS can run. When I go through the processor list on &lt;a href="http://www.helenos.org/ports/sparc64"&gt;this&lt;/a&gt; page, and count the UltraSPARC T1 processor, which we will soon officially cover too, I inevitably come to the conclusion that HelenOS has the best support for SPARC V9 processors, right after Solaris, OpenBSD and Linux.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-6072630399747517266?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/6072630399747517266/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=6072630399747517266' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/6072630399747517266'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/6072630399747517266'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2009/02/interesting-discovery-about.html' title='Interesting discovery about HelenOS/sparc64'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-6953571295277531691</id><published>2009-01-30T09:45:00.008+01:00</published><updated>2009-01-30T12:11:47.175+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HelenOS'/><category scheme='http://www.blogger.com/atom/ns#' term='PearPC'/><category scheme='http://www.blogger.com/atom/ns#' term='Ski'/><category scheme='http://www.blogger.com/atom/ns#' term='Emerging Projects'/><title type='text'>First contact pictures</title><content type='html'>Over the time, I collected photographs of several exotic (i.e. non-x86) machines booting HelenOS for the first time. Below you'll find pictures of SGI Indy, Sun Ultra 60, Dell PowerEdge 3250 and iMac G4 all booting HelenOS in some point of its evolution. Some of the pictures are in a very poor quality as they were taken using a cell phone.&lt;br /&gt;&lt;br /&gt;The first picture was taken by Ondrej Palkovsky and depicts the early mips32 port running on SGI Indy. The Indy support has been removed from the trunk some time ago as part of some cleanup, but continues to live in our memories and, in the first place, in our repository history. I believe the picture predates the userspace support in HelenOS and therefore you can only see the kernel having passed some sort of test followed by the kinit kernel thread printing "kinit..." in 1-second delays over and over again.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_g_YJBZMRYiw/SYLf5PKNDwI/AAAAAAAABVk/BNdKcwAOT0o/s1600-h/indy.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 300px; height: 400px;" src="http://2.bp.blogspot.com/_g_YJBZMRYiw/SYLf5PKNDwI/AAAAAAAABVk/BNdKcwAOT0o/s400/indy.jpg" alt="" id="BLOGGER_PHOTO_ID_5297042286155992834" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The next picture illustrates one sparc64 email debugging session attended by me and Martin Decky. I believe the picture shows the first successful boot on Sun Ultra 60 in Martin's office. The picture was taken using a cell phone when Martin wanted to share his view with me. Note that at that picture, the visual for the Ultra 60 framebuffer is still wrong and the kernel panics due to a bad fast_data_access_mmu fault.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_g_YJBZMRYiw/SYLP0mmbcvI/AAAAAAAABVc/O5g9BSGbvIU/s1600-h/ultra60_01.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_g_YJBZMRYiw/SYLP0mmbcvI/AAAAAAAABVc/O5g9BSGbvIU/s400/ultra60_01.jpg" alt="" id="BLOGGER_PHOTO_ID_5297024614363001586" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;On the next picture taken and sent by Jakub Vana, you can see one of the first successfull boots on a dual Itanium II system. Even though the ia64 port was long able to run entire userspace in the Ski simulator, the real world Itanium was something quite different and required additional work to reach a comparable level of usability.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_g_YJBZMRYiw/SYLgFcn3bqI/AAAAAAAABVs/Qtuv-MKuZN0/s1600-h/itanium.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_g_YJBZMRYiw/SYLgFcn3bqI/AAAAAAAABVs/Qtuv-MKuZN0/s400/itanium.jpg" alt="" id="BLOGGER_PHOTO_ID_5297042495928495778" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The last picture (so far) motivated me to write this blog entry. It's only several hours old and shows an astonishing progress on a real-hardware support for the ppc32 port. It was taken by the same Martin in the same office, I believe, using the same cell phone as the sparc64 pictures. HelenOS/ppc32 runs in the PearPC simulator, but seeing it run on real hardware after lots of failed attempts was very rewarding, even though the full credit goes to Martin.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_g_YJBZMRYiw/SYLgVYjMR4I/AAAAAAAABV0/dwE8bgWaP-I/s1600-h/imac.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_g_YJBZMRYiw/SYLgVYjMR4I/AAAAAAAABV0/dwE8bgWaP-I/s400/imac.jpg" alt="" id="BLOGGER_PHOTO_ID_5297042769713055618" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-6953571295277531691?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/6953571295277531691/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=6953571295277531691' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/6953571295277531691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/6953571295277531691'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2009/01/first-contact-pictures.html' title='First contact pictures'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_g_YJBZMRYiw/SYLf5PKNDwI/AAAAAAAABVk/BNdKcwAOT0o/s72-c/indy.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-9159638342404918504</id><published>2009-01-13T15:10:00.003+01:00</published><updated>2009-01-13T16:27:49.764+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Machinery'/><category scheme='http://www.blogger.com/atom/ns#' term='French'/><category scheme='http://www.blogger.com/atom/ns#' term='Russians'/><title type='text'>How the Russians renamed my wife and confused the French</title><content type='html'>Sometime in October 2008, my wife's Russian passport was about to expire. Because of that, she visited the Russian embassy in Prague in order to get it renewed. Because you never know what documents and in what form will the Russian authorities need (and how much it will cost), it took four visits in total: Marina initially forgot to bring a couple of her photographs with her, on her second visit they decided they needed our wedding certificate again (they've already had it since after our wedding when they official changed her name to Jermářová) and on her third visit, she successfully submitted the passport renewal form plus a negligible fee of CZK 3000, at that time an equivalent of roughly EUR 125 or USD 176. On the fourth visit, it was the embassy's turn. Because perhaps it would be considered a bad form in Russia to let the holder of the newly issued passport verify if everything is alright with it, they let her sign the completion certificate and let her go with the precious document. What a surprise when I found out that along with a new travel document, she has also received a new name! After the marriage, the old passport was altered to spell her new last name Jermářová (both in the Cyrillic and the Latin alphabet). In Cyrillic, the closest transcription from Czech would be Ермаржова (which translates back to Czech as Jermaržova), while the preferred transcription to mere Latin alphabet is simply Jermarova. Now,  the problem is that in the new passport, they used a different transcription which is neither Czech nor mere Latin alphabet. It reads as: Ermarzhova, which is quite far from what I have in my passport: Jermář, and can confuse people with lack of imagination.&lt;br /&gt;&lt;br /&gt;I suspected future problems, but the Czech authorities, despite all worries, did not have any problems with this and continued to call my wife using her Czech last name. They even managed to fix the name on the Czech/EU permanent-stay enclosure in the Russian passport, so I hoped that it is safe to travel with Marina at least across Europe. In December, we went to Paris and &lt;a href="http://picasaweb.google.com/jermj0bm/Paris2008#"&gt;spent few days there&lt;/a&gt;. Right before our home flight, the French airport authority, who served at the check-in, diligently and compulsorily identified the name mismatch and called a more knowledgeable colleague to help. It took me by surprise that the French authorities, the true candid Europeans, would not consult the EU enclosure of the passport, but would accept the bigger challenge and try to decipher the national page which is half in Cyrillic and half a Latin transcription from Cyrillic. After some explanation from my side, the French were eventually able to find some lexical similarity between the two last names (the &lt;a href="http://en.wikipedia.org/wiki/Levenshtein_distance"&gt;Levenshtein distance&lt;/a&gt; between Ermarzhova and Jermář is 7 and 4 between Ermarzhova and Jermarova).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-9159638342404918504?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/9159638342404918504/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=9159638342404918504' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/9159638342404918504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/9159638342404918504'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2009/01/how-russians-renamed-my-wife-and.html' title='How the Russians renamed my wife and confused the French'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-7583168128661061126</id><published>2009-01-04T15:30:00.004+01:00</published><updated>2009-01-04T15:43:42.402+01:00</updated><title type='text'>Time for a new survey</title><content type='html'>Two months have passed since I published the &lt;a href="http://jakubsuniversalblog.blogspot.com/2008/11/big-microkernel-survey-on-my-blog.html"&gt;microkernel survey&lt;/a&gt;. The survey is now closed, but I saved the results &lt;a href="http://jakubsuniversalblog.blogspot.com/2008/11/big-microkernel-survey-on-my-blog.html?showComment=1231078500000#c5228846205106330409"&gt;here&lt;/a&gt;. Even though interesting, so few people took part in it that it does not reveal any trends. I need to give a serious thought to how to attract more readers to my blog. I can either improve the contents or have better surveys :-) Hopefully I'll have a little more visitors after the next release of HelenOS, which is still not here, but is definitely approaching.&lt;br /&gt;&lt;br /&gt;This month, I decided to let you vote for your favorite processor architecture. There is nothing tricky in that question. If you miss your favorite one on the list, just feel free to post a comment and tell me what you think. I never vote in my own polls, but if I did, I would have voted for ia64 and sparc64...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-7583168128661061126?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/7583168128661061126/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=7583168128661061126' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/7583168128661061126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/7583168128661061126'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2009/01/time-for-new-survey.html' title='Time for a new survey'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-789464482329060565</id><published>2008-12-30T11:52:00.010+01:00</published><updated>2009-01-03T16:23:24.090+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HelenOS'/><category scheme='http://www.blogger.com/atom/ns#' term='Emerging Projects'/><title type='text'>History of the HelenOS repository in 230 seconds</title><content type='html'>&lt;div style="text-align: left;"&gt;Last night I played with &lt;a href="http://vis.cs.ucdavis.edu/%7Eogawa/codeswarm/"&gt;code swarm&lt;/a&gt; and generated a short movie depicting the history of the HelenOS project repository in 230 seconds. The video below utilizes four frames per day. I have obtained slightly different results with one frame per day and also eight frames per day, but this one seems to be the best.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;object width="320" height="266" class="BLOG_video_class" id="BLOG_video-a8a7274d58ab0505" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="movie" value="http://www.youtube.com/get_player"&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="flashvars" value="flvurl=http://v7.nonxt1.googlevideo.com/videoplayback?id%3Da8a7274d58ab0505%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1330352361%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D7A8A42C71BD82D1FAC35717B5CA18A230D194D09.10447CA51E27B7BA3CA6030A152ABF6CFD0E6F89%26key%3Dck1&amp;amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3Da8a7274d58ab0505%26offsetms%3D5000%26itag%3Dw160%26sigh%3DVxbrsJolY2mINS19am-V1sVEJEM&amp;amp;autoplay=0&amp;amp;ps=blogger"&gt;&lt;embed src="http://www.youtube.com/get_player" type="application/x-shockwave-flash"width="320" height="266" bgcolor="#FFFFFF"flashvars="flvurl=http://v7.nonxt1.googlevideo.com/videoplayback?id%3Da8a7274d58ab0505%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1330352361%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D7A8A42C71BD82D1FAC35717B5CA18A230D194D09.10447CA51E27B7BA3CA6030A152ABF6CFD0E6F89%26key%3Dck1&amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3Da8a7274d58ab0505%26offsetms%3D5000%26itag%3Dw160%26sigh%3DVxbrsJolY2mINS19am-V1sVEJEM&amp;autoplay=0&amp;ps=blogger"allowFullScreen="true" /&gt;&lt;/object&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;Things get interesting around the times when there was a HelenOS camp and also when people worked intensively on a branch as part of their University assignment.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Update: Here are download links for the &lt;a href="http://www.jermar.eu/download/helenos-1fpd.avi"&gt;one-frame-per-day video&lt;/a&gt;, &lt;a href="http://jermar.eu/download/helenos-4fpd.avi"&gt;four-frames-per-day video&lt;/a&gt; and &lt;a href="http://jermar.eu/download/helenos-8fpd.avi"&gt;eight-frames-per-day video&lt;/a&gt;. &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-789464482329060565?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='enclosure' type='video/mp4' href='http://www.blogger.com/video-play.mp4?contentId=2d3cc6a2410a35a8&amp;type=video%2Fmp4' length='0'/><link rel='enclosure' type='video/mp4' href='http://www.blogger.com/video-play.mp4?contentId=a8a7274d58ab0505&amp;type=video%2Fmp4' length='0'/><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/789464482329060565/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=789464482329060565' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/789464482329060565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/789464482329060565'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2008/12/history-of-helenos-repo-in-230-seconds.html' title='History of the HelenOS repository in 230 seconds'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-4202887369400539006</id><published>2008-11-26T21:52:00.004+01:00</published><updated>2008-11-28T10:28:46.727+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HelenOS'/><category scheme='http://www.blogger.com/atom/ns#' term='QEMU'/><category scheme='http://www.blogger.com/atom/ns#' term='GDB'/><category scheme='http://www.blogger.com/atom/ns#' term='Emerging Projects'/><title type='text'>Debugging HelenOS with QEMU and GDB</title><content type='html'>It is possible to use the combination of QEMU and GDB to debug live HelenOS system. You need to have the respective cross-GDB ready if you intend to debug the system on a non-native architecture. You start by running QEMU like this:&lt;br /&gt;&lt;blockquote&gt;$ qemu -cdrom image.iso -s -S&lt;/blockquote&gt;The lower-case -s tells QEMU to wait for the GDB session at port 1234. The capital -S instructs QEMU not to start the simulation before you enter &lt;span style="font-style: italic;"&gt;c&lt;/span&gt; from the GDB prompt.&lt;br /&gt;&lt;br /&gt;Once you have QEMU waiting for a connection at port 1234, do the following:&lt;br /&gt;&lt;blockquote&gt;(gdb) target remote localhost:1234&lt;/blockquote&gt;After that, you should see something like this:&lt;br /&gt;&lt;blockquote&gt;Remote debugging using localhost:1234&lt;br /&gt;0x0000fff0 in ?? ()&lt;br /&gt;(gdb)&lt;br /&gt;&lt;/blockquote&gt;GDB is now ready and you can start the simulation, but you still don't have any symbols. GDB allows you to load the symbol information using the &lt;span style="font-style: italic;"&gt;symbol&lt;/span&gt; command:&lt;br /&gt;&lt;blockquote&gt;(gdb) symbol kernel/kernel.raw&lt;/blockquote&gt;Instead of the kernel symbols, you can load symbols of any of the userspace ELF binaries, but bare in mind that you can have only one set of symbols loaded at a time. Now you are ready to proceed and can start the simulation:&lt;br /&gt;&lt;blockquote&gt;(gdb) c&lt;br /&gt;&lt;/blockquote&gt;Later you can break back to the debugger by pressing Ctrl+C in the GDB window.&lt;br /&gt;&lt;br /&gt;This method gives you a nice debugging features for QEMU targets on which HelenOS runs. One problem is that the simulator cannot separate the execution of the kernel from the execution of the separate userspace tasks so if you single step long enough, there will be some context switches that you won't be able to filter out. In this light, the debugging approach seems to be most suitable for debugging the kernel.&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-4202887369400539006?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/4202887369400539006/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=4202887369400539006' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/4202887369400539006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/4202887369400539006'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2008/11/debugging-helenos-with-qemu-and-gdb.html' title='Debugging HelenOS with QEMU and GDB'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-2555504278641737699</id><published>2008-11-08T12:30:00.013+01:00</published><updated>2008-11-26T10:21:19.323+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HelenOS'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenSolaris'/><category scheme='http://www.blogger.com/atom/ns#' term='TRAPTRACE'/><category scheme='http://www.blogger.com/atom/ns#' term='observability'/><title type='text'>Thoughts about observability</title><content type='html'>My English language spell-checker tells me that there is no such word as observability. In the Solaris technical parlance, we use this term to refer to the software features that allow one to have a pretty good idea about what was the system doing sometimes in the past, be it in the time of a crash or in the history of the running system, and also what is the system doing right now. There are many observability tools and techniques, some more sophisticated than others.&lt;br /&gt;&lt;br /&gt;For instance, Linus Torvalds, as well as a great deal of his fellow Linux kernel developers and also Linux users, expressed himself, and this is not an exact quotation, that real men use debug prints and their brain to debug something as complex as the Linux kernel. I last saw someone else to use these words yesterday on the Czech Linux site &lt;a href="http://root.cz/"&gt;root.cz&lt;/a&gt;. Linus has also said, at least &lt;a href="http://lkml.org/lkml/2007/5/25/267"&gt;once&lt;/a&gt;, that Solaris is a piece of crap mainly because it has observability features that go far beyond the debug print-brain technology.  According to Linus, the holy grail of debugging is:&lt;br /&gt;&lt;blockquote&gt;So forget about it. The whole model is totally broken. We need to make&lt;br /&gt;bug-reports short and sweet, enough so that random people can&lt;br /&gt;copy-and-paste them into an email or take a digital photo. Anything else&lt;br /&gt;IS TOTALLY INSANE AND USELESS!&lt;/blockquote&gt;Frankly, sometimes it is too early for the crash dump to be generated so we occasionally also receive digital photos of the panic messages from our customers or from the OpenSolaris community members, but you hardly ever get enough information from a photo. What you really want to have is a crash dump, because in 99.999% cases it contains all the state which lead to the crash.&lt;br /&gt;&lt;br /&gt;In Solaris the debugger is called &lt;span class="Apple-style-span" style="font-style: italic;"&gt;mdb&lt;/span&gt; or &lt;span class="Apple-style-span" style="font-style: italic;"&gt;kmdb&lt;/span&gt;, depending on whether you are looking into a coredump, a crashdump, a running system or a running system in single-stepping mode. Solaris has had a kernel debugger for ages and for my job, it is the ultimate tool without which I would be condemned to looking into a crystal sphere^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H digital photos.&lt;br /&gt;&lt;br /&gt;A colleague of mine, Vineeth Pillai, is sustaining Sun's SAM QFS product. Besides the Solaris modules, he also has some Linux kernel modules to take care of. Whenever there is a problem with the Linux kernel module, he is out of luck, because he doesn't get the usual Solaris crash goodies and must resort to the &lt;span class="Apple-style-span" style="font-style: italic;"&gt;printk&lt;/span&gt;() workaround. True, there has been a kernel debugger in Linux since 2.6.26, but the customers are not running that version yet.&lt;br /&gt;&lt;br /&gt;My last root-caused bug is a good example of usefulness of crash dumps. Last week, I worked on a bug which was occurring somewhere between OBP and the kernel. The usual observability tool - &lt;span class="Apple-style-span" style="font-style: italic;"&gt;kmdb&lt;/span&gt; and &lt;span class="Apple-style-span" style="font-style: italic;"&gt;dtrace&lt;/span&gt; - were not an option here due to the special restricted context of the OBP's callback_handler environment. Luckily, I was able to use a feature of Solaris debug kernels called &lt;span class="Apple-style-span" style="font-style: italic;"&gt;TRAPTRACE&lt;/span&gt;. With this feature enabled, the kernel records essential data about each trap which occurs on the system into a kernel buffer. When the system later crashed due to CR &lt;a href="http://bugs.opensolaris.org/view_bug.do?bug_id=6750765"&gt;6750765&lt;/a&gt;, I was able to successfully reconstruct the flow of events that resulted in the crash using that data and &lt;span class="Apple-style-span" style="font-style: italic;"&gt;mdb&lt;/span&gt;'s &lt;span class="Apple-style-span" style="font-style: italic;"&gt;::ttrace&lt;/span&gt; dcmd which presents them in a human readable form. There was no way I could do without the crashdump and the &lt;span class="Apple-style-span" style="font-style: italic;"&gt;TRAPTRACE &lt;/span&gt;data in this case.&lt;br /&gt;&lt;br /&gt;I'd definitely like to see similar observability features in HelenOS one day. So far, we were using the simulator features to replace the role of the kernel debugger, but that is going to be unsustainable in the future, as the project focus shifts more towards real metal. The trend is looking good though, we already have the trace task, which can be best described as a variant of the &lt;span class="Apple-style-span" style="font-style: italic;"&gt;strace&lt;/span&gt; command on Linux or the &lt;span class="Apple-style-span" style="font-style: italic;"&gt;truss&lt;/span&gt; command on Solaris.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-2555504278641737699?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/2555504278641737699/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=2555504278641737699' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/2555504278641737699'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/2555504278641737699'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2008/11/thoughts-about-observability.html' title='Thoughts about observability'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-883755541052262103</id><published>2008-11-03T22:08:00.006+01:00</published><updated>2008-11-03T23:02:29.310+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HelenOS'/><category scheme='http://www.blogger.com/atom/ns#' term='Emerging Projects'/><title type='text'>HelenOS Camp '08 Pictures</title><content type='html'>The first picture was taken in a restaurant/cafe called Alenka. We chose Alenka because they make good coffee and have free wireless Internet access. It was Saturday morning and we were warming up before we'd climb up to the base camp.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_g_YJBZMRYiw/SQ9snd1v5nI/AAAAAAAABLQ/EtywJH8JWNg/s1600-h/img_4171.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 150px;" src="http://2.bp.blogspot.com/_g_YJBZMRYiw/SQ9snd1v5nI/AAAAAAAABLQ/EtywJH8JWNg/s200/img_4171.jpg" alt="" id="BLOGGER_PHOTO_ID_5264545914700162674" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The next picture shows the part of the camp with commit access in the base camp. We already have Vineeth amongst us, so it must be Monday afternoon.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_g_YJBZMRYiw/SQ9snkuvDyI/AAAAAAAABLY/oE-gedVcTvc/s1600-h/img_4205.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 150px;" src="http://3.bp.blogspot.com/_g_YJBZMRYiw/SQ9snkuvDyI/AAAAAAAABLY/oE-gedVcTvc/s200/img_4205.jpg" alt="" id="BLOGGER_PHOTO_ID_5264545916549795618" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This is not Yetti, but our Itanium guru Jakub.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_g_YJBZMRYiw/SQ9soP_snQI/AAAAAAAABLg/jIBeyWA0O3E/s1600-h/img_4207.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 150px;" src="http://2.bp.blogspot.com/_g_YJBZMRYiw/SQ9soP_snQI/AAAAAAAABLg/jIBeyWA0O3E/s200/img_4207.jpg" alt="" id="BLOGGER_PHOTO_ID_5264545928163663106" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Martin, most likely dealing with nonpoisonous snakes like Python.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_g_YJBZMRYiw/SQ9soyv8o3I/AAAAAAAABLo/ptcc1WNAELY/s1600-h/img_4208.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 150px;" src="http://1.bp.blogspot.com/_g_YJBZMRYiw/SQ9soyv8o3I/AAAAAAAABLo/ptcc1WNAELY/s200/img_4208.jpg" alt="" id="BLOGGER_PHOTO_ID_5264545937492845426" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;And this is me, trying to put on some weight and FATten a little more.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_g_YJBZMRYiw/SQ9s6-UgoAI/AAAAAAAABL4/Ayl1YWKfckA/s1600-h/img_4209.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 150px;" src="http://1.bp.blogspot.com/_g_YJBZMRYiw/SQ9s6-UgoAI/AAAAAAAABL4/Ayl1YWKfckA/s200/img_4209.jpg" alt="" id="BLOGGER_PHOTO_ID_5264546249836634114" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;And here's Vineeth, raising his ARM.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_g_YJBZMRYiw/SQ9spPfQQDI/AAAAAAAABLw/ySSsEs33ZxA/s1600-h/img_4211.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 150px;" src="http://2.bp.blogspot.com/_g_YJBZMRYiw/SQ9spPfQQDI/AAAAAAAABLw/ySSsEs33ZxA/s200/img_4211.jpg" alt="" id="BLOGGER_PHOTO_ID_5264545945207455794" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-883755541052262103?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/883755541052262103/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=883755541052262103' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/883755541052262103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/883755541052262103'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2008/11/helenos-camp-08-pictures.html' title='HelenOS Camp &apos;08 Pictures'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_g_YJBZMRYiw/SQ9snd1v5nI/AAAAAAAABLQ/EtywJH8JWNg/s72-c/img_4171.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-6489324023903145321</id><published>2008-11-03T20:55:00.005+01:00</published><updated>2008-11-03T21:31:33.121+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HelenOS'/><category scheme='http://www.blogger.com/atom/ns#' term='config'/><category scheme='http://www.blogger.com/atom/ns#' term='Emerging Projects'/><title type='text'>Netbooting HelenOS on Sun Ultra 60</title><content type='html'>This is the setup for netbooting HelenOS on Sun Ultra 60 which worked for me. The image server is currently Ubuntu 8.10 Linux box.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Install and setup &lt;span style="font-style: italic;"&gt;tftpd&lt;/span&gt;. This is what my /etc/inetd.conf looks like (make sure it remains on one line):&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;tftp dgram udp    wait    nobody    /usr/sbin/tcpd    /usr/sbin/in.tftpd -s /tftpboot&lt;br /&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-style: italic;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;&lt;span&gt;&lt;span&gt;Install and setup &lt;span style="font-style: italic;"&gt;rarpd&lt;/span&gt;; I assume that the Linux box will be on network 192.168.1.0 and the HelenOS/sparc64 box will be given address 192.168.1.2&lt;/span&gt;&lt;/span&gt;&lt;span&gt;. In my case, the MAC address of the Ultra is 08:00:20:CD:BD:67. My /etc/ethers is as follows:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-style: italic;"&gt;08:00:20:CD:BD:67 192.168.1.2&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Create world-readable /tftpboot and copy the sparc64 image.boot there as file C0A80102. The number corresponds to 192.168.1.2 and is what the HelenOS host will be looking for at that directory.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Interconnect the Ultra with the Linux box using a switch or a cross-cable. Then power on the Ultra and when you reach the &lt;span style="font-weight: bold;"&gt;ok&gt;&lt;/span&gt; prompt, type:&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;span style="font-style: italic;"&gt; boot net&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;If something goes wrong, I suggest that you use &lt;span style="font-style: italic;"&gt;tcpdump&lt;/span&gt; to monitor the network traffic on your NIC.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-6489324023903145321?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/6489324023903145321/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=6489324023903145321' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/6489324023903145321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/6489324023903145321'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2008/11/netbooting-helenos-on-sun-ultra-60.html' title='Netbooting HelenOS on Sun Ultra 60'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-3596916096854770691</id><published>2008-11-01T16:11:00.012+01:00</published><updated>2008-11-01T17:19:52.015+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HelenOS'/><category scheme='http://www.blogger.com/atom/ns#' term='L4'/><category scheme='http://www.blogger.com/atom/ns#' term='QNX'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenSolaris'/><category scheme='http://www.blogger.com/atom/ns#' term='microkernels'/><category scheme='http://www.blogger.com/atom/ns#' term='XNU'/><category scheme='http://www.blogger.com/atom/ns#' term='Minix'/><title type='text'>Big microkernel survey</title><content type='html'>I have just started a new survey on this blog so that I can have a better idea of what features people value the most in microkernels. I hope to receive more feedback than for my previous survey which asked if people would consider contributing to HelenOS.&lt;br /&gt;&lt;br /&gt;This time, I provide eleven different options. Because these are mere one, two or three-word labels, I'd like to give some explanation on what I meant by each. Hopefully, people will feel encouraged to comment their choices in the survey by attaching comments to this entry.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;p&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;erformance&lt;/span&gt;&lt;span style="font-weight: normal;"&gt; - some microkernels (e.g. L4 variants) seem to be focused on maximizing the IPC performance and reducing the number of different kinds of switches, sometimes the assembly is used as the implementation language;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;robustness&lt;/span&gt; - some microkernels (e.g. Minix) have the ability to detect failures of system services. In case of a failure the service is restarted.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;small memory footprint&lt;/span&gt; - microkernels tend to be smaller than other operating systems' kernels. As such, they take up smaller size of the computer's memory and can be cache-hot most of the time;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;real-time features&lt;/span&gt; - RTOS are often implemented as microkernels; &lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;observability&lt;/span&gt; - ability to find out what is/was the system doing; e.g. Solaris is very good in this;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;component design&lt;/span&gt; - separation and isolation of individual functional components such as the file system services in HelenOS. The components can only communicate via a well-defined protocol;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;desktop features&lt;/span&gt; - some microkernels (e.g. QNX or XNU) could have been used as a desktop operating system;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;high-end features&lt;/span&gt; - things like SMP support, but also hot-swap, hardware fault management etc.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;portability&lt;/span&gt; - the ability to run on multiple processor architectures and the ease of porting to a new architecture;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;security&lt;/span&gt; - smaller trusted code base should be more secure by virtue of having fewer LOC and thus fewer security bugs;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;standard compliance&lt;/span&gt; - compliance with POSIX or any other operating system API standard&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-3596916096854770691?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/3596916096854770691/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=3596916096854770691' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/3596916096854770691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/3596916096854770691'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2008/11/big-microkernel-survey-on-my-blog.html' title='Big microkernel survey'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-6283861439273143266</id><published>2008-10-31T10:13:00.012+01:00</published><updated>2008-11-03T21:33:31.204+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CDA'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenSolaris'/><title type='text'>Two interesting Solaris VM bugs</title><content type='html'>I ran into two interesting virtual memory bugs while testing some  bugfixes for our customers about a month ago. The problem was occurring on some older 32-bit machines when running debug builds of Solaris 10. When running one of our test suites, the system would hit an assert() and panic like this:&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;assertion failed: ht-&gt;ht_lock_cnt == 0 || ht-&gt;ht_valid_cnt &gt; 0, file: ../../i86pc/vm/htable.c, line: 994&lt;br /&gt;&lt;/blockquote&gt;Searching our bug database quickly revealed the possible culprit:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-style: italic;"&gt;&lt;a href="http://bugs.opensolaris.org/view_bug.do?bug_id=6607917"&gt;6607917&lt;/a&gt; &lt;/span&gt;&lt;span&gt;&lt;span style="font-style: italic;"&gt;assertion failed: ht-&gt;ht_lock_cnt == 0 || ht-&gt;ht_valid_cnt &gt; 0&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;This is a bug, which was already fixed in Nevada, but not in Solaris 10. Moreover, it can only happen with debug kernels, so there is no need to worry about it in case of our production release, i.e. Solaris 10. Right?&lt;br /&gt;&lt;br /&gt;Wrong. Besides the fact, that a test suite running with user privileges was panicking the test machines on which I and a handful of my colleagues did our pre-integration testing, I discovered, that this is certainly not &lt;span&gt;&lt;a href="http://bugs.opensolaris.org/view_bug.do?bug_id=6607917"&gt;6607917.&lt;/a&gt;&lt;/span&gt;&lt;span style="text-decoration: underline;"&gt; &lt;/span&gt;The bug requires two threads to be calling htable_release() on one htable_t structure at a time, while the crashdump I received from the PIT machine showed only one thread.&lt;br /&gt;&lt;br /&gt;You can see the analysis of the crashdump in the description of the new bug I have filed for it:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-style: italic;"&gt;&lt;a href="http://bugs.opensolaris.org/view_bug.do?bug_id=6747539"&gt;6747539&lt;/a&gt; &lt;/span&gt;&lt;span style="font-style: italic;"&gt;hati_pte_map() should undo HTABLE_LOCK_INC(ht) on LPAGE_ERROR&lt;/span&gt;&lt;/blockquote&gt;&lt;span&gt;In this case, the kernel detects a collision between a new large page mapping and the current contents of a page table. While this conflict is handled by the system, it forgets to unlock the respective htable_t structure when it bails out in hati_pte_map(). There is no way a debug kernel could not panic afterwards, because the very next call after the failed hati_pte_map() is htable_release() - the function where the assert is hit.&lt;br /&gt;&lt;br /&gt;But wait, there's more to it. From my crashdump, I noticed that the htable_t in question was empty - there were no entries in the corresponfing page table, so how come there could have been some conflict between a new large page mapping and the base size old mapping? Impossible.&lt;br /&gt;&lt;/span&gt;&lt;pre&gt;&lt;a class="l" name="1321"&gt;&lt;/a&gt;&lt;blockquote&gt;&lt;a class="l" name="1321"&gt;&lt;/a&gt;&lt;span class="c"&gt;/*&lt;br /&gt;&lt;a class="l" name="1322"&gt;&lt;/a&gt; * Set the new pte, retrieving the old one at the same time.&lt;br /&gt;&lt;a class="l" name="1323"&gt;&lt;/a&gt; */&lt;/span&gt;&lt;br /&gt;&lt;a class="l" name="1324"&gt;&lt;/a&gt;&lt;span class="mf"&gt;old_pte&lt;/span&gt; = &lt;a href="http://src.opensolaris.org/source/s?defs=x86pte_set"&gt;x86pte_set&lt;/a&gt;(&lt;span class="mf"&gt;ht&lt;/span&gt;, &lt;span class="mf"&gt;entry&lt;/span&gt;, &lt;span class="mf"&gt;pte&lt;/span&gt;, &lt;span class="mf"&gt;pte_ptr&lt;/span&gt;);&lt;br /&gt;&lt;a class="l" name="1325"&gt;&lt;br /&gt;&lt;/a&gt;&lt;a class="l" name="1326"&gt;&lt;/a&gt;&lt;span class="c"&gt;/*&lt;br /&gt;&lt;a class="l" name="1327"&gt;&lt;/a&gt; * did we get a large page / page table collision?&lt;br /&gt;&lt;a class="l" name="1328"&gt;&lt;/a&gt; */&lt;/span&gt;&lt;br /&gt;&lt;a class="l" name="1329"&gt;&lt;/a&gt;&lt;b&gt;if&lt;/b&gt; (&lt;span class="mf"&gt;old_pte&lt;/span&gt; == &lt;a href="http://src.opensolaris.org/source/s?defs=LPAGE_ERROR"&gt;LPAGE_ERROR&lt;/a&gt;) {&lt;br /&gt;&lt;a class="hl" name="1330"&gt;&lt;/a&gt; &lt;span class="mf"&gt;rv&lt;/span&gt; = -&lt;span class="n"&gt;1&lt;/span&gt;;&lt;br /&gt;&lt;a class="l" name="1331"&gt;&lt;/a&gt; &lt;b&gt;goto&lt;/b&gt; &lt;a href="http://src.opensolaris.org/source/s?defs=done"&gt;done&lt;/a&gt;;&lt;br /&gt;&lt;a class="l" name="1332"&gt;&lt;/a&gt;}&lt;/blockquote&gt;&lt;/pre&gt;This snippet above shows how the collision is detected - via a return value from x86pte_set(). So maybe there is something wrong with that function and we should not have detected the collision in the first place. And really, there is a regression introduced into Solaris 10:&lt;br /&gt;&lt;span&gt;&lt;a href="http://bugs.opensolaris.org/view_bug.do?bug_id=6747627"&gt;&lt;/a&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-style: italic;"&gt;&lt;a href="http://bugs.opensolaris.org/view_bug.do?bug_id=6747627"&gt;6747627&lt;/a&gt; &lt;/span&gt;&lt;span&gt;&lt;span style="font-style: italic;"&gt;x86pte_set() uses uninitialized variable "prev" when PAE is not enabled&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span&gt;So the first bug was actually assisted by the second bug - a piece of uninitialized memory confused x86pte_set() which in turn signalized an LPAGE_ERROR, which caused hati_pte_map() to bail out too quickly, leading to a kernel panic.&lt;br /&gt;&lt;br /&gt;I wanted to post about these two new bugs earlier, but I also wanted to use them during the CDA course I delivered last week in Prague Sun office, so excuse the delay.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-6283861439273143266?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/6283861439273143266/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=6283861439273143266' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/6283861439273143266'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/6283861439273143266'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2008/10/two-interesting-solaris-vm-bugs.html' title='Two interesting Solaris VM bugs'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-6001632588510059566</id><published>2008-09-29T15:55:00.006+02:00</published><updated>2008-09-29T16:24:03.855+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MFF UK'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='CDA'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenSolaris'/><category scheme='http://www.blogger.com/atom/ns#' term='observability'/><title type='text'>New subject at Charles University</title><content type='html'>It looks like I'll be teaching &lt;a href="http://is.cuni.cz/eng/studium/predmety/index.php?do=predmet&amp;amp;kod=NPRG050"&gt;this&lt;/a&gt; course at Charles University in the summer semester. The course is basically an extension of the mini &lt;a href="http://jakubsuniversalblog.blogspot.com/2008/04/mini-amd64-cda-training-at-mff-uk.html"&gt;CDA&lt;/a&gt; course that I and my two colleagues delivered at MFF UK in April. It is also an extension to the internal Sun x86 CDA training, that I am going to deliver with my companions this October.&lt;br /&gt;&lt;br /&gt;In addition to the mini version, the full-fledged university course will cover 32-bit x86 architecture too and compared to both the mini and the internal courses, we'll also venture into CDA on SPARC. We don't want people to suspect us that we are using this university subject to market Solaris based on its superior observability features, so the course shall teach people how to tackle crashes on Linux and Windows as well, even though at least in the Windows case we plan to invite an expert in that area.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-6001632588510059566?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/6001632588510059566/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=6001632588510059566' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/6001632588510059566'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/6001632588510059566'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2008/09/new-subject-at-charles-university.html' title='New subject at Charles University'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-8049544978820902461</id><published>2008-09-03T21:35:00.004+02:00</published><updated>2008-09-03T22:18:40.003+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HelenOS'/><category scheme='http://www.blogger.com/atom/ns#' term='Emerging Projects'/><title type='text'>Keeping the balance right</title><content type='html'>In order to balance my previous blog, I decided to sum up some recent achievements on the HelenOS front. These things are well known to people who follow our mailing list, but I suspect that the majority of people out there are not even subscribed.&lt;br /&gt;&lt;br /&gt;I scratched two of my long time kernel itches: the infamous "Sleep not implemented" panic and the kernel's inability to allocate memory from a low-memory region.&lt;br /&gt;&lt;br /&gt;The "Sleep not implemented" panic occurred every time when the kernel invoked &lt;span style="font-style: italic;"&gt;frame_alloc&lt;/span&gt;() in its blocking mode under very low memory conditions. That happened when the (virtual) machine had less memory than what the system required. After my modification, &lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;the offending thread would be simply put to sleep instead of panicing the kernel. When there is enough memory, the thread can complete the allocation request. The catch is that when all of the threads just allocate and none of them frees memory, all the threads will be put to sleep and none will run. You still have the possibility to break into &lt;span style="font-style: italic;"&gt;kconsole &lt;/span&gt;and kill some of the tasks so that its allocated memory is freed and others can run. You are out of luck when the one which went to sleep is the &lt;span style="font-style: italic;"&gt;kconsole&lt;/span&gt; thread itself (that could happen when running the kernel tests which allocate lots of memory). The situation can be further improved when we have support for paging pages out and back in. Btw, this improvement finally found good use for condition variables.&lt;br /&gt;&lt;br /&gt;As mentioned above, the kernel can now theoretically allocate memory from the lowest 4G (contrary to allocating from all memory available). This is necessary, for example, for allocation of secondary processors' GDT on amd64. The fix works in the following way. When a memory zone is created, it is associated with flags that describe it. The frame allocator was slightly altered to  only consider zones matching flags passed along with the request, if some were specified by the caller. What remains to be done is to change the way how memory zones are created in the architecture specific initialization code. In particular, it is necessary to avoid merging zones with incompatible flags.&lt;br /&gt;&lt;br /&gt;My biggest achievement, however, is the read-only support for FAT16 as the root file system. Together with Tim Post's addition of a simple command line interface, Martin Decky's boot-from-ramdisk infrastructure and Jiri Svoboda's task loader, the system is now much more usable than before. The biggest differentiator is that you can now interactively walk the file system (either FAT or TMPFS) and spawn as many new tasks (located on the file system) as you want. Due to ramdisk size issues, the FAT filesystem is now usable only on ia32 and amd64, but this is likely to change soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-8049544978820902461?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/8049544978820902461/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=8049544978820902461' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/8049544978820902461'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/8049544978820902461'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2008/09/keeping-balance-right.html' title='Keeping the balance right'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-8761304094155705173</id><published>2008-09-02T23:30:00.007+02:00</published><updated>2008-09-03T00:43:20.507+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lestes'/><category scheme='http://www.blogger.com/atom/ns#' term='Emerging Projects'/><title type='text'>My failure to implement &amp;&amp;</title><content type='html'>I spent half of the past weekend implementing support for the logical AND operator for the Lestes compiler. I should say right at the beginning that I still haven't succeeded, but I decided to share the details of my struggle with you, the kind reader.&lt;br /&gt;&lt;br /&gt;The state of the current &amp;amp;&amp;amp; and || support is that the parser recognizes these constructs and generates semantic structures for them. The problem is that the part of the compiler which is supposed to generate the respective pseudo code is currently a mere assert() saying that these operators are not yet implemented.&lt;br /&gt;&lt;br /&gt;The particular problem of implementing these two is their short-circuit evaluation. When you have, for example, A &amp;amp;&amp;amp; B, you first need to evaluate A and if it evaluates to true, only then you can start evaluating B. Without this special feature of C/C++, I'd be able to implement &amp;amp;&amp;amp; and || in half a minute, using the already existing template for binary operands. With short-circuit evaluation in place, I need to insert a couple of extra pseudo instructions in the right order:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;psp:&lt;br /&gt;&lt;/li&gt;&lt;li&gt;psp(A):&lt;/li&gt;&lt;li&gt;    L = evaluate(A)&lt;/li&gt;&lt;li&gt;nsp(A):&lt;br /&gt;&lt;/li&gt;&lt;li&gt;    PI_BF(L, msp2) /* skip evaluation of B */&lt;br /&gt;&lt;/li&gt;&lt;li&gt;psp(B)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;    R = evaulate(B)&lt;/li&gt;&lt;li&gt;nsp(B)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;    DEST = PI_LAND(L, R) /* logical AND */&lt;br /&gt;&lt;/li&gt;&lt;li&gt;msp1:&lt;br /&gt;&lt;/li&gt;&lt;li&gt;    PI_BA(nsp)&lt;/li&gt;&lt;li&gt;msp2:&lt;/li&gt;&lt;li&gt;    PI_MOV(L, DEST)&lt;/li&gt;&lt;li&gt;nsp:&lt;/li&gt;&lt;/ol&gt;In the pseudo code snippet above, &lt;span style="font-style: italic;"&gt;psp&lt;/span&gt; stands for &lt;span style="font-style: italic;"&gt;previous sequence point&lt;/span&gt; and  &lt;span style="font-style: italic;"&gt;nsp&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;stands for &lt;span style="font-style: italic;"&gt;next sequence point&lt;/span&gt;. You can see that the sequence points figure as destinations for branch instructions &lt;span style="font-style: italic;"&gt;PI_BF &lt;/span&gt;and &lt;span style="font-style: italic;"&gt;PI_BA&lt;/span&gt; and that each expression is surrounded by the &lt;span style="font-style: italic;"&gt;psp&lt;/span&gt;-&lt;span style="font-style: italic;"&gt;nsp &lt;/span&gt;pair. &lt;span style="font-style: italic;"&gt;nsp(A)&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;psp(B)&lt;/span&gt; are essential in that I must place the &lt;span style="font-style: italic;"&gt;PI_BF&lt;/span&gt; instruction somewhere between the two, enforcing thus the order of evaluation to start with subexpression A. I added two extra sequence points &lt;span style="font-style: italic;"&gt;msp1 &lt;/span&gt;and &lt;span style="font-style: italic;"&gt;msp2&lt;/span&gt; to help me to enforce order on the pseudo instructions in steps 9 through 14.&lt;br /&gt;&lt;br /&gt;While I am quite successful in generating code for the end of the sequence, I can't figure out how to place the &lt;span style="font-style: italic;"&gt;PI_BF&lt;/span&gt; pseudo instruction without generating an infinite loop. My guess is that somewhere in the Lestes code, something enforces the opposite order of evaluation of A and B. That would, of course, made the topological sort algorithm spin forever. I've tried to place the instruction between &lt;span style="font-style: italic;"&gt;psp&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;nsp&lt;/span&gt; of the entire expression. That got me rid of the infinit loop, but I didn't get the right order.&lt;br /&gt;&lt;br /&gt;I also can't figure out how to express the above 14 steps in the SSA form so that th&lt;span style="font-style: italic;"&gt;&lt;/span&gt;e DEST register is assigned to only once and there exists a single pseudo instruction which can be denoted as the origin of the register value.&lt;br /&gt;&lt;br /&gt;Well, I guess I need to keep on trying. Every failure like this teaches me something new from Lestes and maybe it's worth the trouble just because of that.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-8761304094155705173?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/8761304094155705173/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=8761304094155705173' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/8761304094155705173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/8761304094155705173'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2008/09/my-failure-to-implement.html' title='My failure to implement &amp;&amp;'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-7544200197483288169</id><published>2008-05-07T10:48:00.016+02:00</published><updated>2008-05-13T22:38:17.428+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MFF UK'/><category scheme='http://www.blogger.com/atom/ns#' term='CDA'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenSolaris'/><category scheme='http://www.blogger.com/atom/ns#' term='amd64'/><title type='text'>Report from the AMD64 mini CDA training at MFF UK</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_g_YJBZMRYiw/SCFtXSc3CXI/AAAAAAAAAAM/LSuQxc4bTkY/s1600-h/IMG_7052.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_g_YJBZMRYiw/SCFtXSc3CXI/AAAAAAAAAAM/LSuQxc4bTkY/s200/IMG_7052.jpg" alt="" id="BLOGGER_PHOTO_ID_5197555691819567474" border="0" /&gt;&lt;/a&gt;In my previous post, I announced the AMD64 crash dump analysis course that me, Vita Batrla and Vlada Marek delivered at the Faculty of Mathematics and Physics, Charles University in Prague (MFF UK) last week. From our point of view, the three-day event was a success. We explained the AMD64 stack layout in detail, taught how to use mdb to analyze core dumps and kernel crash dumps, and let the trainees work on pre-prepared crash dumps showing different kind of kernel problems. In particular, we've looked at crashes caused by some garbage pointer value stored in a kernel variable, problems with the AMD64 stack red-zone, memory corruption bugs, deadlocks and hangs. We had 23 people registered, out of which 20 really showed up. Those people were mostly from MFF UK, but there were also people from other universities, namely FEL CVUT and FJFI, as well as people from Czech IT companies.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-7544200197483288169?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/7544200197483288169/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=7544200197483288169' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/7544200197483288169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/7544200197483288169'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2008/05/report-from-amd64-mini-cda-training-at.html' title='Report from the AMD64 mini CDA training at MFF UK'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_g_YJBZMRYiw/SCFtXSc3CXI/AAAAAAAAAAM/LSuQxc4bTkY/s72-c/IMG_7052.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-449411475177099794</id><published>2008-04-23T14:04:00.003+02:00</published><updated>2008-04-23T14:10:34.952+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MFF UK'/><category scheme='http://www.blogger.com/atom/ns#' term='CDA'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenSolaris'/><category scheme='http://www.blogger.com/atom/ns#' term='amd64'/><title type='text'>Mini AMD64 CDA training at MFF UK</title><content type='html'>I am excited about the three-day course that I and two colleagues of mine are going to deliver at the Faculty of Mathematics and Physics, Charles University in Prague, next week. The course will be dedicated to crash dump analysis of amd64 OpenSolaris kernels. If you speak Czech, you can check out the invitation &lt;a href="http://dsrg.mff.cuni.cz/cda.phtml"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-449411475177099794?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/449411475177099794/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=449411475177099794' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/449411475177099794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/449411475177099794'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2008/04/mini-amd64-cda-training-at-mff-uk.html' title='Mini AMD64 CDA training at MFF UK'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-1097977200761288227</id><published>2008-04-17T03:39:00.008+02:00</published><updated>2008-04-17T04:31:25.685+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='USA'/><category scheme='http://www.blogger.com/atom/ns#' term='alcohol'/><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><title type='text'>Show me your ID!</title><content type='html'>I am currently to be found in Sunnyvale, California, USA.  The weather and people here are warm and I am generally enjoying my stay.  What I especially appreciate, and I am becoming a little sarcastic now, is that in 2/4 attempts to buy beer I was asked to show ID. Being European, I obviously don't have the Californian ID, so I would always show my Czech/European passport instead. The first guy who had not believed me being 27 was satisfied when he saw my passport and kindly explained why was it necessary that me and other two of my colleagues, aged around 30, had to show ID as well. Today, while I was shopping in a supermarket, I bought myself two bottles of European beer - (Guinness and Heineken; had they had Czech beer, I would have gone with that instead). The cashier was very very reluctant to accept my passport as a proof of my entitlement to buy alcohol in US so I was beginning to despair - I've been a little thirsty in the last couple of evenings. Fortunately, the validity of my passport was eventually ACK'ed by the cashier's boss and my alcohol purchase could proceed.&lt;div&gt;&lt;div&gt;The good news is that I must look much younger than I actually am. Even though I am married and I already have traces of silver in my hair, people still think I am no older than 20. Maybe the years of sitting behind a computer have preserved me for future generations of US cashiers :-)&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-1097977200761288227?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/1097977200761288227/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=1097977200761288227' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/1097977200761288227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/1097977200761288227'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2008/04/show-me-your-id.html' title='Show me your ID!'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-1823010753388398457</id><published>2008-03-21T10:16:00.002+01:00</published><updated>2008-03-21T10:26:55.250+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='coreboot'/><category scheme='http://www.blogger.com/atom/ns#' term='HelenOS'/><category scheme='http://www.blogger.com/atom/ns#' term='Emerging Projects'/><title type='text'>Coreboot project uses bits of HelenOS</title><content type='html'>I've just found out that the coreboot project (formerly known as LinuxBIOS), more precisely its libpayload, contains small portions of HelenOS libc. So far, they've taken our memory string operations and also the whole printf subsystem. This is a good sign that other projects can, and actually do, pick up parts of HelenOS and modify them for their own needs. Hopefully, this trend will continue.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-1823010753388398457?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/1823010753388398457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=1823010753388398457' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/1823010753388398457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/1823010753388398457'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2008/03/coreboot-project-uses-bits-of-helenos.html' title='Coreboot project uses bits of HelenOS'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-2315032866337101791</id><published>2008-03-20T23:40:00.004+01:00</published><updated>2008-03-21T00:36:40.853+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HelenOS'/><category scheme='http://www.blogger.com/atom/ns#' term='QEMU'/><category scheme='http://www.blogger.com/atom/ns#' term='GCC'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenSolaris'/><category scheme='http://www.blogger.com/atom/ns#' term='Emerging Projects'/><title type='text'>Dangerous Direction Flag</title><content type='html'>In a news message on root.cz, someone has confused the newly introduced GCC 4.3 optimization of not including the extra CLD isntruction in front of each string instruction with a GCC bug. The title of the news read:&lt;br /&gt;&lt;br /&gt;GCC 4.3 contains a bug&lt;br /&gt;&lt;br /&gt;After reading the news, I figured out that it is not GCC which contains a bug, but the Linux kernel. I am not going to talk about this bug in this post (read more about it &lt;a href="http://lwn.net/Articles/272048/"&gt;here&lt;/a&gt;). What I will talk about is, however, very related.&lt;br /&gt;&lt;br /&gt;Learning more about the Linux bug made me realize how dangerous the seemingly innocent DF flag can be to the kernel. Without preventive measures, the reversed direction of string operations could cause severe kernel memory corruption. I also realized that we don't probably take those preventive measures (i.e. clearing DF upon entering the kernel) in HelenOS/ia32 and HelenOS/amd64. Quick check of the respective sources confirmed my worries.&lt;br /&gt;&lt;br /&gt;Later at home, I did basicaly two things. The first was that I modified HelenOS libc to always do STD before doing a syscall and verified that the problem was real. The second thing was implementing the fix for this HelenOS bug.&lt;br /&gt;&lt;br /&gt;On ia32, I inserted one CLD into the interrupt handler macro and one CLD into the syscall handler macro and that was it. On amd64, I used the CLD instruction for the interrupt handler macro as well, but wanted to make use of the amd64's SFMASK MSR for the syscall path instead of the boring CLD. The SFMASK register contains a mask that will be applied to the RFLAGS register during the SYSCALL instruction. In other words, a man can program it to clear arbitrary RFLAGS bits. When I was done with amd64, I wanted to test the fix in QEMU. To my surprise, fixed HelenOS/amd64 didn't function well in QEMU. I repeated the same test with Simics, where everything worked fine. Hm, a bug in QEMU? Looks like it (and today I found out what was &lt;a href="http://lists.gnu.org/archive/html/qemu-devel/2008-03/msg00337.html"&gt;wrong).&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;To top the DF story off, I have to confess that for some (rather short) time I believed that there was a similar bug in amd64 version of Solaris. Contrary to the ia32 version, there is no CLD at the beginning of the respective interrupt handler (i.e. cmntrap) and the syscall handler. In case of the syscall handler I noticed that the SFMASK MSR is only programed to clear the IF and TF, but not DF. Eager to find a bug, I even started to build a crafted Solaris libc, that would demonstrate the bug as I did with HelenOS. But then I finally got it: Solaris brings RFLAGS into a known state by pushing a pre-defined RFLAGS value onto the stack followed by the POPF instruction. I was so focused on the CLD which wasn't there and the insufficient SFMASK that I didn't see what was there all the time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-2315032866337101791?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/2315032866337101791/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=2315032866337101791' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/2315032866337101791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/2315032866337101791'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2008/03/dangerous-direction-flag.html' title='Dangerous Direction Flag'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-1911144425279260554</id><published>2008-02-06T22:54:00.000+01:00</published><updated>2008-02-07T15:10:03.542+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lestes'/><category scheme='http://www.blogger.com/atom/ns#' term='Emerging Projects'/><title type='text'>Lestes wishlist</title><content type='html'>This is an incomplete list of things I would like to see in the Lestes project, sorted in the order of achievability (i.e. as I can achieve them):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;integration of my GAS assembler generator patches&lt;/li&gt;&lt;li&gt;retarget the compiler to mips32&lt;/li&gt;&lt;li&gt;remove unnecessary frontend dependencies on backend from the frontend&lt;br /&gt;&lt;/li&gt;&lt;li&gt;make use of the branch delay slots for useful instructions&lt;br /&gt;&lt;/li&gt;&lt;li&gt;support for 64-bit long long type&lt;/li&gt;&lt;li&gt;retarget the compiler to amd64&lt;br /&gt;&lt;/li&gt;&lt;li&gt;full support for ia32's and amd64's disp(base, index, scale) addressing in the generated code&lt;/li&gt;&lt;li&gt;fix semantic errors (e.g. long long long long type)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;implement the missing logical operators (i.e. || and &amp;amp;&amp;amp;)&lt;/li&gt;&lt;li&gt;implementation of the 'cee' frontend&lt;/li&gt;&lt;li&gt;retarget the compiler to other processors, especially those supported by HelenOS&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-1911144425279260554?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/1911144425279260554/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=1911144425279260554' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/1911144425279260554'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/1911144425279260554'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2008/02/lestes-wishlist.html' title='Lestes wishlist'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-3199367866369191035</id><published>2008-02-03T17:28:00.000+01:00</published><updated>2008-02-03T18:04:40.412+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HelenOS'/><category scheme='http://www.blogger.com/atom/ns#' term='Emerging Projects'/><title type='text'>File system support for HelenOS</title><content type='html'>I feel we are close to a new &lt;a href="http://www.helenos.eu"&gt;HelenOS&lt;/a&gt; release which will bring basic file system support. So what has been brewing in the repository for some time already? We basically have two or three components that will be ready for a review by releasing it. Namely, we have VFS, which is the place where all information about registered file systems and open files live. VFS also provides a single interface to the rest of the world through which it is possible to communicate with the underlying file system implementations. We also have a prototype implementation, TMPFS, which is a file system that lives completely in virtual memory and has no disk layout. I have also started FAT support, but it is now resting in favor of work that needs to be done on TMPFS. Finally, we have DEVMAP, which will register and provide connection services to registered block devices.&lt;br /&gt;&lt;br /&gt;So what is already working? We can do simple mounts of TMPFS as a root file system. We can look up files and directories on TMPFS. We also can open(), read(), write(), lseek() and ftrunc() files and opendir(), readdir(), rewinddir(), closedir() and mkdir() directories.&lt;br /&gt;&lt;br /&gt;It's already better to say what functionality is missing. We don't yet support rmdir(), rename(), unlink() and close().&lt;br /&gt;&lt;br /&gt;You may say so what, TMPFS will lose data on next reboot, it's like having no file system support at all. The reason of doing TMPFS first is, of course, developing VFS and libfs frameworks so that other file systems can be added faster and with more ease. It will also help to blunt the sharp edges of the current implementation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-3199367866369191035?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/3199367866369191035/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=3199367866369191035' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/3199367866369191035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/3199367866369191035'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2008/02/file-system-support-for-helenos.html' title='File system support for HelenOS'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-2855783367095501545</id><published>2008-02-03T15:50:00.000+01:00</published><updated>2008-02-03T18:05:34.978+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenSolaris'/><title type='text'>Fixing tmpfs in Solaris</title><content type='html'>A year ago, I started to work on a problem one of our customers had with the tmpfs file system. Since the problem has been already fixed in all relevant Solaris and &lt;a href="http://www.opensolaris.org"&gt;OpenSolaris&lt;/a&gt; releases, I feel I can share some of the more interesting technical bits.&lt;br /&gt;&lt;br /&gt;The problem, as laid by the customer, was that the system would hang if an attempt to fill a tmpfs filesystem (e.g. /tmp) is made. In other words, a mere:&lt;br /&gt;&lt;br /&gt;dd if=/dev/zero of=/tmp/testfile&lt;br /&gt;&lt;br /&gt;would slowly hang the system.&lt;br /&gt;&lt;br /&gt;During the course of investigation, we actually found two bugs that contributed to this hang, even though the system would be usually only extremely slow and non-responsive, but not completely hung.&lt;br /&gt;&lt;br /&gt;The first bug showed when one process held the majority of all available memory pages in the dirty state and wanted to allocate yet another page for itself. When there were no more available pages, this process got blocked waiting for the pageout thread to pageout the dirty pages to swap and make them available again. The pageout daemon walks the pages and when it finds a dirty page, it uses the respective vnode's putpage routine to do the actual pageout. In case of tmpfs, the putpage routine has a check that verifies that the tn_contents rwlock (i.e. the lock protecting the contents of the tmpnode to which the dirty page belongs) is not being held. If it is, putpage simply gives up this page and moves on to another one. Now, the problem was that when the dd process went to sleep, it held the tn_contents lock of /tmp/testfile from our example command. Moreover, almost every single page in the system belonged to this file and was dirty. The result? The pageout daemon could not do any forward progress as it had to give up paging out majority of pages due to the held tn_contents lock and the dd process could not unlock the tn_contents lock because it wanted another page.&lt;br /&gt;&lt;br /&gt;This bug got fixed by modifying the wrtmp() routine, which is on the write(2) execution call path. The fix simply dropped the tn_contents lock before the thread in wrtmp() would get blocked waiting for a page and reacquired it later. Nevertheless, the problem didn't go away completely and we learned we only cured half of it (for the side effects of this cure, read on), but maybe the more serious half.&lt;br /&gt;&lt;br /&gt;It turned out that a fix for large ISM segments on systems with ZFS introduced a change in the reservation of anonymous memory which was a regression for tmpfs and the second half of the required solution. After the addition of ZFS , databases which needed to create large shared mappings started to fail (i.e. were unable to create these large shared mappings) due to ZFS caching memory, which would otherwise be necessary for the shared segment. This was fixed by inserting a call that reaped several different caches in front of the test in anon_resvmem() that checks the amount of reservable memory (i.e. availrmem) and fails if the anon_resvmem() request cannot be satisfied. The problem with this is that this fix made it actually much harder for a tmpfs allocation to fail. Additionally, the procedure which reaped the caches was pretty heavyweight and contained a loop, which could delay every anon_resvmem() by as much as by 60 seconds! What? I said the theoretical maximum delay per request was 60 seconds. In the lab, I was able to reproduce this and using a clever dtrace script, I measured the maximum delay of 13 seconds, which is still pretty horrible.&lt;br /&gt;&lt;br /&gt;I fixed this by selectively disabling the cache-reap for tmpfs completely so that now when there is no reservable memory, the dd command above will fail. Users can still guarantee tmpfs reservations by creating disk swap of sufficient size. Everything which is beyond the disk swap size, is not guaranteed and the reservation may fail. Note that this behaviour is consistent with the documentation for swap.&lt;br /&gt;&lt;br /&gt;As it turned out, the fix for the latter bug was sufficient because it prevented the former bug from occurring. But it was difficult to see the latter bug without first fixing the former one. Moreover, the customer didn't make use of the possibility to crop the tmpfs size by the "size" mount option, which would have also solved the problem.&lt;br /&gt;&lt;br /&gt;Finally, let me go back to the side effects of dropping the tn_contents lock. Due to the implementation of wrtmp(), the act of increasing the file's size and creating the new portion of its content was no longer atomic as seen from the perspective of a process which writes to a tmpfs file and mmaps its end and tries to read it at a time. Although documented and forbidden, such a behaviour was a nuisance. So I slightly reordered wrtmp() and putback the fix for this last Tuesday.&lt;br /&gt;&lt;br /&gt;As of now, I am still not completely done with tmpfs and will come back to this topic later, when there is a little more to add.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-2855783367095501545?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/2855783367095501545/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=2855783367095501545' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/2855783367095501545'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/2855783367095501545'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2008/02/fixing-solaris-tmpfs.html' title='Fixing tmpfs in Solaris'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554776517811473232.post-8009154545910000418</id><published>2008-02-03T14:42:00.000+01:00</published><updated>2008-02-03T18:53:33.666+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lestes'/><category scheme='http://www.blogger.com/atom/ns#' term='Emerging Projects'/><title type='text'>New assembler generator for Lestes</title><content type='html'>During the past week, I've been playing with the &lt;a href="http://lestes.jikos.cz/"&gt;Lestes&lt;/a&gt; compiler again. I found it pretty non-satisfactory that the compiler could generate .asm files only in the nasm syntax. I decided to try to add the ability to generate gas syntax as well.&lt;br /&gt;&lt;br /&gt;Besides nasm and gas are different assemblers, the former generates code in what is called Intel syntax, while the latter uses AT&amp;amp;T syntax. The main difference between the two is the swapped order of instruction operands and a different way of specifying memory operand sizes.&lt;br /&gt;&lt;br /&gt;Fortunately, this adventure took me only several days and editing a couple of XML files which describe the target machine. Besides of that, I also had to fix several dependencies on nasm which were hardcoded directly in the compiler's source code. My fixes are now ready for code review and will hopefully be integrated into the project's mainline repository sometime soon. Looks like this experience will be useful in my future Lestes endeavours, especially if I decide to retarget the compiler to amd64 or any other platform. BTW, nasm doesn't support anything but ia32 and amd64, so if Lestes can generate code for sparc64 one day, it will have to be assembled by gas and not nasm.&lt;br /&gt;&lt;br /&gt;So how do you actually make Lestes generate gas assembler? It's just a matter of replacing the machine description XML files with those that are meant for gas. The following should do:&lt;br /&gt;&lt;br /&gt;$ cd target/machine/i686/tm_description/&lt;br /&gt;$ build_md.sh gas&lt;br /&gt;$ cd ../../../..&lt;br /&gt;$ make&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554776517811473232-8009154545910000418?l=jakubsuniversalblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jakubsuniversalblog.blogspot.com/feeds/8009154545910000418/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4554776517811473232&amp;postID=8009154545910000418' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/8009154545910000418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554776517811473232/posts/default/8009154545910000418'/><link rel='alternate' type='text/html' href='http://jakubsuniversalblog.blogspot.com/2008/02/new-assembler-generator-for-lestes.html' title='New assembler generator for Lestes'/><author><name>Jakub Jermar</name><uri>https://profiles.google.com/101001705512404325822</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-c9HZ6uZKF-U/AAAAAAAAAAI/AAAAAAAAC1I/wSAwkaWr9vY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry></feed>
