<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>OpenSBI on 0xc0de</title>
    <link>https://0xc0de.xyz/tags/opensbi/</link>
    <description>Recent content in OpenSBI on 0xc0de</description>
    <image>
      <title>0xc0de</title>
      <url>https://0xc0de.xyz/%3Clink%20or%20path%20of%20image%20for%20opengraph,%20twitter-cards%3E</url>
      <link>https://0xc0de.xyz/%3Clink%20or%20path%20of%20image%20for%20opengraph,%20twitter-cards%3E</link>
    </image>
    <generator>Hugo</generator>
    <language>zh-tw</language>
    <lastBuildDate>Mon, 23 Dec 2024 00:00:00 +0800</lastBuildDate>
    <atom:link href="https://0xc0de.xyz/tags/opensbi/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>OpenSBI: MPXY</title>
      <link>https://0xc0de.xyz/posts/opensbi-mpxy/</link>
      <pubDate>Mon, 23 Dec 2024 00:00:00 +0800</pubDate>
      <guid>https://0xc0de.xyz/posts/opensbi-mpxy/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;⚠️ The code is based on: &lt;a href=&#34;https://gitlab.com/riseproject/riscv-optee/opensbi/-/tree/dev-optee-mpxy&#34;&gt;https://gitlab.com/riseproject/riscv-optee/opensbi/-/tree/dev-optee-mpxy&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Commit ID: &lt;strong&gt;&lt;code&gt;7d4c90953afe3bd86f9e2501bd4c2501e8db1898&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;init_coldboot()&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://0xc0de.xyz/posts/opensbi-mpxy/#sbi-mpxy-init&#34;&gt;&lt;code&gt;sbi_mpxy_init()&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span id=&#34;sbi-mpxy-init&#34;&gt;&lt;/span&gt;
&lt;code&gt;sbi_mpxy_init()&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;Allocate &lt;code&gt;struct mpxy_state&lt;/code&gt; for each domain.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sbi_platform_mpxy_init()&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;Call platform-defined &lt;code&gt;mpxy_init()&lt;/code&gt;.
&lt;ul&gt;
&lt;li&gt;e.g. For generic platform: &lt;code&gt;fdt_mpxy_init()&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fdt_mpxy_init()&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;Iterate MPXY drivers in &lt;code&gt;fdt_mpxy_drivers[]&lt;/code&gt;.
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;MPXY drivers are generated at compile time:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34; id=&#34;hl-0-1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34; id=&#34;hl-0-2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34; id=&#34;hl-0-3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34; id=&#34;hl-0-4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34; id=&#34;hl-0-5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34; id=&#34;hl-0-6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34; id=&#34;hl-0-7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34; id=&#34;hl-0-8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34; id=&#34;hl-0-9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34; id=&#34;hl-0-10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34; id=&#34;hl-0-11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// lib/utils/mpxy/objects.mk
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;libsbiutils&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;objs&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;$&lt;/span&gt;(CONFIG_FDT_MPXY) &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; mpxy&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;fdt_mpxy.o
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;libsbiutils&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;objs&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;$&lt;/span&gt;(CONFIG_FDT_MPXY) &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; mpxy&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;fdt_mpxy_drivers.o
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;carray&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;fdt_mpxy_drivers&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;$&lt;/span&gt;(CONFIG_FDT_MPXY_RPMI_MBOX) &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; fdt_mpxy_rpmi_mbox
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;libsbiutils&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;objs&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;$&lt;/span&gt;(CONFIG_FDT_MPXY_RPMI_MBOX) &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; mpxy&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;fdt_mpxy_rpmi_mbox.o
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;carray&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;fdt_mpxy_drivers&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;$&lt;/span&gt;(CONFIG_FDT_MPXY_MM) &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; fdt_mpxy_mm
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;libsbiutils&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;objs&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;$&lt;/span&gt;(CONFIG_FDT_MPXY_MM) &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; mpxy&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;fdt_mpxy_mm.o
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;carray&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;fdt_mpxy_drivers&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;$&lt;/span&gt;(CONFIG_FDT_MPXY_OPTEED) &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; fdt_mpxy_opteed
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;libsbiutils&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;objs&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;$&lt;/span&gt;(CONFIG_FDT_MPXY_OPTEED) &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; mpxy&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;fdt_mpxy_opteed.o
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34; id=&#34;hl-1-1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-1-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34; id=&#34;hl-1-2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-1-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34; id=&#34;hl-1-3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-1-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34; id=&#34;hl-1-4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-1-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34; id=&#34;hl-1-5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-1-5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// lib/utils/mpxy/fdt_mpxy_drivers.carray
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;HEADER: sbi_utils&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;mpxy&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;fdt_mpxy.h
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TYPE: &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; fdt_mpxy
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;NAME: fdt_mpxy_drivers
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34; id=&#34;hl-2-1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-2-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34; id=&#34;hl-2-2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-2-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34; id=&#34;hl-2-3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-2-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34; id=&#34;hl-2-4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-2-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34; id=&#34;hl-2-5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-2-5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34; id=&#34;hl-2-6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-2-6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34; id=&#34;hl-2-7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-2-7&#34;&gt;7&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// include/sbi_utils/mpxy/fdt_mpxy.h
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; fdt_mpxy {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; fdt_match &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;match_table;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;init)(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;fdt, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; nodeoff, &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; fdt_match &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;match);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;exit)(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Call &lt;code&gt;drv-&amp;gt;init()&lt;/code&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>⚠️ The code is based on: <a href="https://gitlab.com/riseproject/riscv-optee/opensbi/-/tree/dev-optee-mpxy">https://gitlab.com/riseproject/riscv-optee/opensbi/-/tree/dev-optee-mpxy</a></p>
<p>Commit ID: <strong><code>7d4c90953afe3bd86f9e2501bd4c2501e8db1898</code></strong></p>
</blockquote>
<ul>
<li><code>init_coldboot()</code>
<ul>
<li><a href="/posts/opensbi-mpxy/#sbi-mpxy-init"><code>sbi_mpxy_init()</code></a></li>
</ul>
</li>
<li><span id="sbi-mpxy-init"></span>
<code>sbi_mpxy_init()</code>
<ul>
<li>Allocate <code>struct mpxy_state</code> for each domain.</li>
<li><code>sbi_platform_mpxy_init()</code>
<ul>
<li>Call platform-defined <code>mpxy_init()</code>.
<ul>
<li>e.g. For generic platform: <code>fdt_mpxy_init()</code>.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><code>fdt_mpxy_init()</code>
<ul>
<li>Iterate MPXY drivers in <code>fdt_mpxy_drivers[]</code>.
<ul>
<li>
<p>MPXY drivers are generated at compile time:</p>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"> 1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2"> 2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3"> 3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-4"> 4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-5"> 5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-6"> 6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-7"> 7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-8"> 8</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-9"> 9</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-10"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-10">10</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-11"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-11">11</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">// lib/utils/mpxy/objects.mk
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>libsbiutils<span style="color:#f92672">-</span>objs<span style="color:#f92672">-</span><span style="color:#960050;background-color:#1e0010">$</span>(CONFIG_FDT_MPXY) <span style="color:#f92672">+=</span> mpxy<span style="color:#f92672">/</span>fdt_mpxy.o
</span></span><span style="display:flex;"><span>libsbiutils<span style="color:#f92672">-</span>objs<span style="color:#f92672">-</span><span style="color:#960050;background-color:#1e0010">$</span>(CONFIG_FDT_MPXY) <span style="color:#f92672">+=</span> mpxy<span style="color:#f92672">/</span>fdt_mpxy_drivers.o
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>carray<span style="color:#f92672">-</span>fdt_mpxy_drivers<span style="color:#f92672">-</span><span style="color:#960050;background-color:#1e0010">$</span>(CONFIG_FDT_MPXY_RPMI_MBOX) <span style="color:#f92672">+=</span> fdt_mpxy_rpmi_mbox
</span></span><span style="display:flex;"><span>libsbiutils<span style="color:#f92672">-</span>objs<span style="color:#f92672">-</span><span style="color:#960050;background-color:#1e0010">$</span>(CONFIG_FDT_MPXY_RPMI_MBOX) <span style="color:#f92672">+=</span> mpxy<span style="color:#f92672">/</span>fdt_mpxy_rpmi_mbox.o
</span></span><span style="display:flex;"><span>carray<span style="color:#f92672">-</span>fdt_mpxy_drivers<span style="color:#f92672">-</span><span style="color:#960050;background-color:#1e0010">$</span>(CONFIG_FDT_MPXY_MM) <span style="color:#f92672">+=</span> fdt_mpxy_mm
</span></span><span style="display:flex;"><span>libsbiutils<span style="color:#f92672">-</span>objs<span style="color:#f92672">-</span><span style="color:#960050;background-color:#1e0010">$</span>(CONFIG_FDT_MPXY_MM) <span style="color:#f92672">+=</span> mpxy<span style="color:#f92672">/</span>fdt_mpxy_mm.o
</span></span><span style="display:flex;"><span>carray<span style="color:#f92672">-</span>fdt_mpxy_drivers<span style="color:#f92672">-</span><span style="color:#960050;background-color:#1e0010">$</span>(CONFIG_FDT_MPXY_OPTEED) <span style="color:#f92672">+=</span> fdt_mpxy_opteed
</span></span><span style="display:flex;"><span>libsbiutils<span style="color:#f92672">-</span>objs<span style="color:#f92672">-</span><span style="color:#960050;background-color:#1e0010">$</span>(CONFIG_FDT_MPXY_OPTEED) <span style="color:#f92672">+=</span> mpxy<span style="color:#f92672">/</span>fdt_mpxy_opteed.o
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-1">1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-2">2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-3">3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-4">4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-5">5</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">// lib/utils/mpxy/fdt_mpxy_drivers.carray
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>HEADER: sbi_utils<span style="color:#f92672">/</span>mpxy<span style="color:#f92672">/</span>fdt_mpxy.h
</span></span><span style="display:flex;"><span>TYPE: <span style="color:#66d9ef">struct</span> fdt_mpxy
</span></span><span style="display:flex;"><span>NAME: fdt_mpxy_drivers
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-2-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-1">1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-2-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-2">2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-2-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-3">3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-2-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-4">4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-2-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-5">5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-2-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-6">6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-2-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-7">7</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">// include/sbi_utils/mpxy/fdt_mpxy.h
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">struct</span> fdt_mpxy {
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">struct</span> fdt_match <span style="color:#f92672">*</span>match_table;
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">int</span> (<span style="color:#f92672">*</span>init)(<span style="color:#66d9ef">void</span> <span style="color:#f92672">*</span>fdt, <span style="color:#66d9ef">int</span> nodeoff, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">struct</span> fdt_match <span style="color:#f92672">*</span>match);
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">void</span> (<span style="color:#f92672">*</span>exit)(<span style="color:#66d9ef">void</span>);
</span></span><span style="display:flex;"><span>};
</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p>Call <code>drv-&gt;init()</code>.</p>
<ul>
<li>e.g. <a href="/posts/opensbi-optee/#mpxy-opteed-init"><code>mpxy_opteed_init()</code></a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><span id="sbi-ecall-mpxy-handler"></span>
<code>sbi_ecall_mpxy_handler()</code>
<ul>
<li><code>sbi_ecall_mpxy_handler()</code> is the handler for SBI MPXY ecalls, which will call the corresponding function based on SBI function ID, e.g.
<ul>
<li><a href="/posts/opensbi-optee/#sbi-mpxy-set-shmem"><code>sbi_mpxy_set_shmem()</code></a></li>
<li><a href="/posts/opensbi-optee/#sbi-mpxy-send-message"><code>sbi_mpxy_send_message()</code></a></li>
</ul>
</li>
</ul>
</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>OpenSBI: OP-TEE</title>
      <link>https://0xc0de.xyz/posts/opensbi-optee/</link>
      <pubDate>Sat, 21 Dec 2024 00:00:00 +0800</pubDate>
      <guid>https://0xc0de.xyz/posts/opensbi-optee/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;⚠️ The code is based on: &lt;a href=&#34;https://gitlab.com/riseproject/riscv-optee/opensbi/-/tree/dev-optee-mpxy&#34;&gt;https://gitlab.com/riseproject/riscv-optee/opensbi/-/tree/dev-optee-mpxy&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Commit ID: &lt;strong&gt;&lt;code&gt;7d4c90953afe3bd86f9e2501bd4c2501e8db1898&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span id=&#34;mpxy-opteed-init&#34;&gt;&lt;/span&gt;
&lt;code&gt;mpxy_opteed_init()&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Match compatible string: &lt;code&gt;&amp;quot;riscv,sbi-mpxy-opteed&amp;quot;&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Allocate channel.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;opteed_domain_setup()&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Setup domain for OP-TEE dispatcher by looking up the domain specified by &lt;code&gt;opensbi-domain-instance&lt;/code&gt; phandle in DTS.&lt;/li&gt;
&lt;li&gt;Assign the domain name to &lt;code&gt;opteed_domain_name&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Get channel ID from DTS property: &lt;code&gt;riscv,sbi-mpxy-channel-id&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Initialize channel:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34; id=&#34;hl-0-1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34; id=&#34;hl-0-2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34; id=&#34;hl-0-3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34; id=&#34;hl-0-4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34; id=&#34;hl-0-5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34; id=&#34;hl-0-6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// lib/utils/mpxy/fdt_mpxy_opteed.c
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;channel&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;channel_id &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; channel_id;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;channel&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;send_message &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; mpxy_opteed_send_message;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;channel&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;attrs.msg_proto_id &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; SBI_MPXY_MSGPROTO_TEE_ID;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;channel&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;attrs.msg_data_maxlen &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; PAGE_SIZE;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Register channel: &lt;a href=&#34;https://0xc0de.xyz/posts/opensbi-optee/#sbi-mpxy-register-channel&#34;&gt;&lt;code&gt;sbi_mpxy_register_channel()&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>⚠️ The code is based on: <a href="https://gitlab.com/riseproject/riscv-optee/opensbi/-/tree/dev-optee-mpxy">https://gitlab.com/riseproject/riscv-optee/opensbi/-/tree/dev-optee-mpxy</a></p>
<p>Commit ID: <strong><code>7d4c90953afe3bd86f9e2501bd4c2501e8db1898</code></strong></p>
</blockquote>
<ul>
<li><span id="mpxy-opteed-init"></span>
<code>mpxy_opteed_init()</code>
<ul>
<li>
<p>Match compatible string: <code>&quot;riscv,sbi-mpxy-opteed&quot;</code>.</p>
</li>
<li>
<p>Allocate channel.</p>
</li>
<li>
<p><code>opteed_domain_setup()</code></p>
<ul>
<li>Setup domain for OP-TEE dispatcher by looking up the domain specified by <code>opensbi-domain-instance</code> phandle in DTS.</li>
<li>Assign the domain name to <code>opteed_domain_name</code>.</li>
</ul>
</li>
<li>
<p>Get channel ID from DTS property: <code>riscv,sbi-mpxy-channel-id</code>.</p>
</li>
<li>
<p>Initialize channel:</p>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1">1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2">2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3">3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-4">4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-5">5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-6">6</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">// lib/utils/mpxy/fdt_mpxy_opteed.c
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>channel<span style="color:#f92672">-&gt;</span>channel_id <span style="color:#f92672">=</span> channel_id;
</span></span><span style="display:flex;"><span>channel<span style="color:#f92672">-&gt;</span>send_message <span style="color:#f92672">=</span> mpxy_opteed_send_message;
</span></span><span style="display:flex;"><span>channel<span style="color:#f92672">-&gt;</span>attrs.msg_proto_id <span style="color:#f92672">=</span> SBI_MPXY_MSGPROTO_TEE_ID;
</span></span><span style="display:flex;"><span>channel<span style="color:#f92672">-&gt;</span>attrs.msg_data_maxlen <span style="color:#f92672">=</span> PAGE_SIZE;
</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p>Register channel: <a href="/posts/opensbi-optee/#sbi-mpxy-register-channel"><code>sbi_mpxy_register_channel()</code></a></p>
</li>
<li>
<p>Assign <code>tdomain</code> (<strong>Trusted domain</strong>).</p>
<ul>
<li>Look up the domain with the name specified in <code>opteed_domain_name</code>.</li>
</ul>
</li>
<li>
<p>Assign <code>udomain</code> (<strong>Untrusted domain</strong>).</p>
<ul>
<li>Look up the domain with the name <code>&quot;untrusted-domain&quot;</code>.</li>
</ul>
</li>
</ul>
</li>
<li><span id="mpxy-opteed-send-message"></span>
<code>mpxy_opteed_send_message()</code>
<ul>
<li><span id="opteed-msg-communicate"></span>
If message ID is <code>OPTEED_MSG_COMMUNICATE</code> (<code>0x1</code>) (Called from <code>udomain</code>):
<ul>
<li>If <code>tdomain</code>’s shared memory is <strong>NOT</strong> valid, return <code>SBI_EINVAL</code>.</li>
<li>Otherwise:
<ul>
<li>Direction: <code>udomain</code> -&gt; OpenSBI</li>
<li>Copy the source data from <code>udomain</code> to <code>tdomain</code>’s shared memory.</li>
</ul>
</li>
<li>Call <a href="/posts/opensbi-optee/#sbi-ecall-tee-domain-enter"><code>sbi_ecall_tee_domain_enter()</code></a> to switch to <code>tdomain</code>.
<ul>
<li>Direction: <code>udomain</code> -&gt; <code>tdomain</code>.</li>
<li>The entry point to be switched to is defined by the function type:
<ul>
<li>Function type is defined by the first <code>unsigned long</code> in <code>udomain</code>’s shared memory: <code>((ulong *)shmem_base)[0]</code>.</li>
<li>If function type is: <code>ABI_ENTRY_TYPE_FAST</code> (i.e. <code>ARM_SMCCC_FAST_CALL</code>)
<ul>
<li>Entry point ⇒ <code>entry_vector_table-&gt;fast_abi_entry</code>
<ul>
<li><code>entry_vector_table</code> ⇒ <a href="/posts/optee-threads/#hl-3-10"><code>thread_vector_table</code></a> is defined in OP-TEE. Therefore, <code>entry_vector_table-&gt;fast_abi_entry</code> ⇒ <a href="/posts/optee-threads/#hl-5-3"><code>vector_fast_abi_entry()</code></a></li>
</ul>
</li>
</ul>
</li>
<li>Otherwise:
<ul>
<li>Entry point ⇒ <code>entry_vector_table-&gt;yield_abi_entry</code>
<ul>
<li><code>entry_vector_table</code> ⇒ <a href="/posts/optee-threads/#hl-3-10"><code>thread_vector_table</code></a> is defined in OP-TEE. Therefore, <code>entry_vector_table-&gt;yield_abi_entry</code> ⇒ <a href="/posts/optee-threads/#hl-4-3"><code>vector_std_abi_entry()</code></a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>If message ID is <code>OPTEED_MSG_COMPLETE</code> (<code>0x2</code>) (Called from <code>tdomain</code>):
<ul>
<li>If <code>udomain</code>’s shared memory is <strong>NOT</strong> valid:
<ul>
<li>Direction: <code>tdomain</code> -&gt; OpenSBI.</li>
<li>If <code>((ulong *)msgbuf)[0]</code> (from <code>tdomain</code>’s shared memory, i.e. <code>$a0</code>) is <code>TEEABI_OPTEED_RETURN_CALL_DONE</code> (<code>0xbe000000</code>):
<ul>
<li>Register OP-TEE entry table:
<ul>
<li>Set <code>entry_vector_table</code> to <code>((ulong *)msgbuf)[1]</code> (i.e. <code>$a1</code>), i.e. <a href="/posts/optee-threads/#hl-3-10"><code>thread_vector_table</code></a> defined in OP-TEE.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>Otherwise, copy the source data from <code>tdomain</code> to <code>udomain</code>’s shared memory.
<ul>
<li>Direction: <code>tdomain</code> -&gt; <code>udomain</code>.</li>
<li>Only <code>$a1</code> ~ <code>$a4</code> (from <code>tdomain</code>’s shared memory) are copied to <code>udomain</code>’s shared memory, <code>$a0</code> is skipped.</li>
</ul>
</li>
<li>Call <code>sbi_ecall_tee_domain_exit()</code> to exit from the current <code>tdomain</code>.
<ul>
<li>The domain to switch to:
<ul>
<li>Switch to the previous domain</li>
<li>Switch to the use-define next domain.</li>
<li>Fallback to the root domain.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>P.S. Domain switching only involves domain contexts save and restore. The mode is switched by <code>mret</code> in the trap handler.</li>
</ul>
</li>
</ul>
<hr>
<ul>
<li><span id="sbi-mpxy-register-channel"></span>
<code>sbi_mpxy_register_channel()</code>
<ul>
<li>Initialize channel’s attributes: <code>mpxy_std_attrs_init()</code>
<ul>
<li>Check whether MSI, SSE and Events State capabilities are available in the domain.</li>
</ul>
</li>
<li>Add the allocated channel to <code>mpxy_channel_list</code> list.</li>
</ul>
</li>
<li><span id="sbi-mpxy-set-shmem"></span>
<code>sbi_mpxy_set_shmem()</code>
<ul>
<li>Validate passed in shared memory address and size.</li>
<li>Set current hart’s <code>sbi_domain</code> shared memory address and size.</li>
</ul>
</li>
<li><span id="sbi-mpxy-send-message"></span>
<code>sbi_mpxy_send_message()</code>
<ul>
<li>Call <code>channel-&gt;send_message()</code>.
<ul>
<li>e.g. <a href="/posts/opensbi-optee/#mpxy-opteed-send-message"><code>mpxy_opteed_send_message()</code></a></li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<ul>
<li><span id="sbi-ecall-tee-domain-enter"></span>
<code>sbi_ecall_tee_domain_enter()</code>
<ul>
<li>The domain is <code>tdomain</code>.</li>
<li><code>sbi_domain_context_set_mepc()</code>
<ul>
<li>Set <code>mepc</code> to the entry point.</li>
</ul>
</li>
<li><code>sbi_domain_context_enter()</code>
<ul>
<li>Switch to <code>tdomain</code>.</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<ul>
<li>
<p>Example DTS:</p>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-1"> 1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-2"> 2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-3"> 3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-4"> 4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-5"> 5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-6"> 6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-7"> 7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-8"> 8</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-9"> 9</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-10"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-10">10</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-11"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-11">11</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-12"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-12">12</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-13"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-13">13</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-14"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-14">14</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-15"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-15">15</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-16"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-16">16</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-17"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-17">17</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-18"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-18">18</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-19"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-19">19</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-20"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-20">20</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-21"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-21">21</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-22"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-22">22</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-23"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-23">23</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span>    chosen {
</span></span><span style="display:flex;"><span>        opensbi<span style="color:#f92672">-</span>domains {
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>            .....
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>            trusted<span style="color:#f92672">-</span>domain {
</span></span><span style="display:flex;"><span>                compatible <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;opensbi,domain,instance&#34;</span>;
</span></span><span style="display:flex;"><span>                regions <span style="color:#f92672">=</span> <span style="color:#f92672">&lt;</span><span style="color:#ae81ff">0x04</span> <span style="color:#ae81ff">0x3f</span><span style="color:#f92672">&gt;</span>;
</span></span><span style="display:flex;"><span>                possible<span style="color:#f92672">-</span>harts <span style="color:#f92672">=</span> <span style="color:#f92672">&lt;</span><span style="color:#ae81ff">0x03</span> <span style="color:#ae81ff">0x01</span><span style="color:#f92672">&gt;</span>;
</span></span><span style="display:flex;"><span>                next<span style="color:#f92672">-</span>addr <span style="color:#f92672">=</span> <span style="color:#f92672">&lt;</span><span style="color:#ae81ff">0x00</span> <span style="color:#ae81ff">0xf1000000</span><span style="color:#f92672">&gt;</span>;
</span></span><span style="display:flex;"><span>                next<span style="color:#f92672">-</span>mode <span style="color:#f92672">=</span> <span style="color:#f92672">&lt;</span><span style="color:#ae81ff">0x01</span><span style="color:#f92672">&gt;</span>;
</span></span><span style="display:flex;"><span>                phandle <span style="color:#f92672">=</span> <span style="color:#f92672">&lt;</span><span style="color:#ae81ff">0x02</span><span style="color:#f92672">&gt;</span>;
</span></span><span style="display:flex;"><span>            };
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>            .....
</span></span><span style="display:flex;"><span>        };
</span></span><span style="display:flex;"><span>    };
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    sbi<span style="color:#f92672">-</span>mpxy<span style="color:#f92672">-</span>opteed {
</span></span><span style="display:flex;"><span>        opensbi<span style="color:#f92672">-</span>domain<span style="color:#f92672">-</span>instance <span style="color:#f92672">=</span> <span style="color:#f92672">&lt;</span><span style="color:#ae81ff">0x02</span><span style="color:#f92672">&gt;</span>;
</span></span><span style="display:flex;"><span>        riscv,sbi<span style="color:#f92672">-</span>mpxy<span style="color:#f92672">-</span>channel<span style="color:#f92672">-</span>id <span style="color:#f92672">=</span> <span style="color:#f92672">&lt;</span><span style="color:#ae81ff">0x02</span><span style="color:#f92672">&gt;</span>;
</span></span><span style="display:flex;"><span>        compatible <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;riscv,sbi-mpxy-opteed&#34;</span>;
</span></span><span style="display:flex;"><span>    };
</span></span></code></pre></td></tr></table>
</div>
</div></li>
</ul>
]]></content:encoded>
    </item>
  </channel>
</rss>
