Subversion Repositories HelenOS

Rev

Rev 3386 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * Copyright (c) 2005 Jakub Vana
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  *
  9.  * - Redistributions of source code must retain the above copyright
  10.  *   notice, this list of conditions and the following disclaimer.
  11.  * - Redistributions in binary form must reproduce the above copyright
  12.  *   notice, this list of conditions and the following disclaimer in the
  13.  *   documentation and/or other materials provided with the distribution.
  14.  * - The name of the author may not be used to endorse or promote products
  15.  *   derived from this software without specific prior written permission.
  16.  *
  17.  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  18.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  19.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  20.  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  21.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  22.  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  23.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  24.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  25.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  26.  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27.  */
  28.  
  29. /** @addtogroup ia64   
  30.  * @{
  31.  */
  32. /** @file
  33.  *
  34.  */
  35.  
  36. #include <fpu_context.h>
  37. #include <arch/register.h>
  38. #include <print.h>
  39.  
  40. void fpu_context_save(fpu_context_t *fctx)
  41. {
  42.     asm volatile (
  43.         "stf.spill [%0] = f32, 0x80\n"
  44.         "stf.spill [%1] = f33, 0x80\n"
  45.         "stf.spill [%2] = f34, 0x80\n"
  46.         "stf.spill [%3] = f35, 0x80\n"
  47.         "stf.spill [%4] = f36, 0x80\n"
  48.         "stf.spill [%5] = f37, 0x80\n"
  49.         "stf.spill [%6] = f38, 0x80\n"
  50.         "stf.spill [%7] = f39, 0x80\n;;"
  51.  
  52.         "stf.spill [%0] = f40, 0x80\n"
  53.         "stf.spill [%1] = f41, 0x80\n"
  54.         "stf.spill [%2] = f42, 0x80\n"
  55.         "stf.spill [%3] = f43, 0x80\n"
  56.         "stf.spill [%4] = f44, 0x80\n"
  57.         "stf.spill [%5] = f45, 0x80\n"
  58.         "stf.spill [%6] = f46, 0x80\n"
  59.         "stf.spill [%7] = f47, 0x80\n;;"
  60.  
  61.         "stf.spill [%0] = f48, 0x80\n"
  62.         "stf.spill [%1] = f49, 0x80\n"
  63.         "stf.spill [%2] = f50, 0x80\n"
  64.         "stf.spill [%3] = f51, 0x80\n"
  65.         "stf.spill [%4] = f52, 0x80\n"
  66.         "stf.spill [%5] = f53, 0x80\n"
  67.         "stf.spill [%6] = f54, 0x80\n"
  68.         "stf.spill [%7] = f55, 0x80\n;;"
  69.  
  70.         "stf.spill [%0] = f56, 0x80\n"
  71.         "stf.spill [%1] = f57, 0x80\n"
  72.         "stf.spill [%2] = f58, 0x80\n"
  73.         "stf.spill [%3] = f59, 0x80\n"
  74.         "stf.spill [%4] = f60, 0x80\n"
  75.         "stf.spill [%5] = f61, 0x80\n"
  76.         "stf.spill [%6] = f62, 0x80\n"
  77.         "stf.spill [%7] = f63, 0x80\n;;"
  78.  
  79.         "stf.spill [%0] = f64, 0x80\n"
  80.         "stf.spill [%1] = f65, 0x80\n"
  81.         "stf.spill [%2] = f66, 0x80\n"
  82.         "stf.spill [%3] = f67, 0x80\n"
  83.         "stf.spill [%4] = f68, 0x80\n"
  84.         "stf.spill [%5] = f69, 0x80\n"
  85.         "stf.spill [%6] = f70, 0x80\n"
  86.         "stf.spill [%7] = f71, 0x80\n;;"
  87.  
  88.         "stf.spill [%0] = f72, 0x80\n"
  89.         "stf.spill [%1] = f73, 0x80\n"
  90.         "stf.spill [%2] = f74, 0x80\n"
  91.         "stf.spill [%3] = f75, 0x80\n"
  92.         "stf.spill [%4] = f76, 0x80\n"
  93.         "stf.spill [%5] = f77, 0x80\n"
  94.         "stf.spill [%6] = f78, 0x80\n"
  95.         "stf.spill [%7] = f79, 0x80\n;;"
  96.  
  97.         "stf.spill [%0] = f80, 0x80\n"
  98.         "stf.spill [%1] = f81, 0x80\n"
  99.         "stf.spill [%2] = f82, 0x80\n"
  100.         "stf.spill [%3] = f83, 0x80\n"
  101.         "stf.spill [%4] = f84, 0x80\n"
  102.         "stf.spill [%5] = f85, 0x80\n"
  103.         "stf.spill [%6] = f86, 0x80\n"
  104.         "stf.spill [%7] = f87, 0x80\n;;"
  105.  
  106.         "stf.spill [%0] = f88, 0x80\n"
  107.         "stf.spill [%1] = f89, 0x80\n"
  108.         "stf.spill [%2] = f90, 0x80\n"
  109.         "stf.spill [%3] = f91, 0x80\n"
  110.         "stf.spill [%4] = f92, 0x80\n"
  111.         "stf.spill [%5] = f93, 0x80\n"
  112.         "stf.spill [%6] = f94, 0x80\n"
  113.         "stf.spill [%7] = f95, 0x80\n;;"
  114.  
  115.         "stf.spill [%0] = f96, 0x80\n"
  116.         "stf.spill [%1] = f97, 0x80\n"
  117.         "stf.spill [%2] = f98, 0x80\n"
  118.         "stf.spill [%3] = f99, 0x80\n"
  119.         "stf.spill [%4] = f100, 0x80\n"
  120.         "stf.spill [%5] = f101, 0x80\n"
  121.         "stf.spill [%6] = f102, 0x80\n"
  122.         "stf.spill [%7] = f103, 0x80\n;;"
  123.  
  124.         "stf.spill [%0] = f104, 0x80\n"
  125.         "stf.spill [%1] = f105, 0x80\n"
  126.         "stf.spill [%2] = f106, 0x80\n"
  127.         "stf.spill [%3] = f107, 0x80\n"
  128.         "stf.spill [%4] = f108, 0x80\n"
  129.         "stf.spill [%5] = f109, 0x80\n"
  130.         "stf.spill [%6] = f110, 0x80\n"
  131.         "stf.spill [%7] = f111, 0x80\n;;"
  132.  
  133.         "stf.spill [%0] = f112, 0x80\n"
  134.         "stf.spill [%1] = f113, 0x80\n"
  135.         "stf.spill [%2] = f114, 0x80\n"
  136.         "stf.spill [%3] = f115, 0x80\n"
  137.         "stf.spill [%4] = f116, 0x80\n"
  138.         "stf.spill [%5] = f117, 0x80\n"
  139.         "stf.spill [%6] = f118, 0x80\n"
  140.         "stf.spill [%7] = f119, 0x80\n;;"
  141.  
  142.         "stf.spill [%0] = f120, 0x80\n"
  143.         "stf.spill [%1] = f121, 0x80\n"
  144.         "stf.spill [%2] = f122, 0x80\n"
  145.         "stf.spill [%3] = f123, 0x80\n"
  146.         "stf.spill [%4] = f124, 0x80\n"
  147.         "stf.spill [%5] = f125, 0x80\n"
  148.         "stf.spill [%6] = f126, 0x80\n"
  149.         "stf.spill [%7] = f127, 0x80\n;;"
  150.  
  151.         :
  152.         : "r" (&((fctx->fr)[0])), "r" (&((fctx->fr)[1])),
  153.           "r" (&((fctx->fr)[2])), "r" (&((fctx->fr)[3])),
  154.           "r" (&((fctx->fr)[4])), "r" (&((fctx->fr)[5])),
  155.           "r" (&((fctx->fr)[6])), "r" (&((fctx->fr)[7]))
  156.     );
  157.    
  158. }
  159.  
  160. void fpu_context_restore(fpu_context_t *fctx)
  161. {
  162.     asm volatile (
  163.         "ldf.fill f32 = [%0], 0x80\n"
  164.         "ldf.fill f33 = [%1], 0x80\n"
  165.         "ldf.fill f34 = [%2], 0x80\n"
  166.         "ldf.fill f35 = [%3], 0x80\n"
  167.         "ldf.fill f36 = [%4], 0x80\n"
  168.         "ldf.fill f37 = [%5], 0x80\n"
  169.         "ldf.fill f38 = [%6], 0x80\n"
  170.         "ldf.fill f39 = [%7], 0x80\n;;"
  171.  
  172.         "ldf.fill f40 = [%0], 0x80\n"
  173.         "ldf.fill f41 = [%1], 0x80\n"
  174.         "ldf.fill f42 = [%2], 0x80\n"
  175.         "ldf.fill f43 = [%3], 0x80\n"
  176.         "ldf.fill f44 = [%4], 0x80\n"
  177.         "ldf.fill f45 = [%5], 0x80\n"
  178.         "ldf.fill f46 = [%6], 0x80\n"
  179.         "ldf.fill f47 = [%7], 0x80\n;;"
  180.  
  181.         "ldf.fill f48 = [%0], 0x80\n"
  182.         "ldf.fill f49 = [%1], 0x80\n"
  183.         "ldf.fill f50 = [%2], 0x80\n"
  184.         "ldf.fill f51 = [%3], 0x80\n"
  185.         "ldf.fill f52 = [%4], 0x80\n"
  186.         "ldf.fill f53 = [%5], 0x80\n"
  187.         "ldf.fill f54 = [%6], 0x80\n"
  188.         "ldf.fill f55 = [%7], 0x80\n;;"
  189.  
  190.         "ldf.fill f56 = [%0], 0x80\n"
  191.         "ldf.fill f57 = [%1], 0x80\n"
  192.         "ldf.fill f58 = [%2], 0x80\n"
  193.         "ldf.fill f59 = [%3], 0x80\n"
  194.         "ldf.fill f60 = [%4], 0x80\n"
  195.         "ldf.fill f61 = [%5], 0x80\n"
  196.         "ldf.fill f62 = [%6], 0x80\n"
  197.         "ldf.fill f63 = [%7], 0x80\n;;"
  198.  
  199.         "ldf.fill f64 = [%0], 0x80\n"
  200.         "ldf.fill f65 = [%1], 0x80\n"
  201.         "ldf.fill f66 = [%2], 0x80\n"
  202.         "ldf.fill f67 = [%3], 0x80\n"
  203.         "ldf.fill f68 = [%4], 0x80\n"
  204.         "ldf.fill f69 = [%5], 0x80\n"
  205.         "ldf.fill f70 = [%6], 0x80\n"
  206.         "ldf.fill f71 = [%7], 0x80\n;;"
  207.  
  208.         "ldf.fill f72 = [%0], 0x80\n"
  209.         "ldf.fill f73 = [%1], 0x80\n"
  210.         "ldf.fill f74 = [%2], 0x80\n"
  211.         "ldf.fill f75 = [%3], 0x80\n"
  212.         "ldf.fill f76 = [%4], 0x80\n"
  213.         "ldf.fill f77 = [%5], 0x80\n"
  214.         "ldf.fill f78 = [%6], 0x80\n"
  215.         "ldf.fill f79 = [%7], 0x80\n;;"
  216.  
  217.         "ldf.fill f80 = [%0], 0x80\n"
  218.         "ldf.fill f81 = [%1], 0x80\n"
  219.         "ldf.fill f82 = [%2], 0x80\n"
  220.         "ldf.fill f83 = [%3], 0x80\n"
  221.         "ldf.fill f84 = [%4], 0x80\n"
  222.         "ldf.fill f85 = [%5], 0x80\n"
  223.         "ldf.fill f86 = [%6], 0x80\n"
  224.         "ldf.fill f87 = [%7], 0x80\n;;"
  225.  
  226.         "ldf.fill f88 = [%0], 0x80\n"
  227.         "ldf.fill f89 = [%1], 0x80\n"
  228.         "ldf.fill f90 = [%2], 0x80\n"
  229.         "ldf.fill f91 = [%3], 0x80\n"
  230.         "ldf.fill f92 = [%4], 0x80\n"
  231.         "ldf.fill f93 = [%5], 0x80\n"
  232.         "ldf.fill f94 = [%6], 0x80\n"
  233.         "ldf.fill f95 = [%7], 0x80\n;;"
  234.  
  235.         "ldf.fill f96 = [%0], 0x80\n"
  236.         "ldf.fill f97 = [%1], 0x80\n"
  237.         "ldf.fill f98 = [%2], 0x80\n"
  238.         "ldf.fill f99 = [%3], 0x80\n"
  239.         "ldf.fill f100 = [%4], 0x80\n"
  240.         "ldf.fill f101 = [%5], 0x80\n"
  241.         "ldf.fill f102 = [%6], 0x80\n"
  242.         "ldf.fill f103 = [%7], 0x80\n;;"
  243.  
  244.         "ldf.fill f104 = [%0], 0x80\n"
  245.         "ldf.fill f105 = [%1], 0x80\n"
  246.         "ldf.fill f106 = [%2], 0x80\n"
  247.         "ldf.fill f107 = [%3], 0x80\n"
  248.         "ldf.fill f108 = [%4], 0x80\n"
  249.         "ldf.fill f109 = [%5], 0x80\n"
  250.         "ldf.fill f110 = [%6], 0x80\n"
  251.         "ldf.fill f111 = [%7], 0x80\n;;"
  252.  
  253.         "ldf.fill f112 = [%0], 0x80\n"
  254.         "ldf.fill f113 = [%1], 0x80\n"
  255.         "ldf.fill f114 = [%2], 0x80\n"
  256.         "ldf.fill f115 = [%3], 0x80\n"
  257.         "ldf.fill f116 = [%4], 0x80\n"
  258.         "ldf.fill f117 = [%5], 0x80\n"
  259.         "ldf.fill f118 = [%6], 0x80\n"
  260.         "ldf.fill f119 = [%7], 0x80\n;;"
  261.  
  262.         "ldf.fill f120 = [%0], 0x80\n"
  263.         "ldf.fill f121 = [%1], 0x80\n"
  264.         "ldf.fill f122 = [%2], 0x80\n"
  265.         "ldf.fill f123 = [%3], 0x80\n"
  266.         "ldf.fill f124 = [%4], 0x80\n"
  267.         "ldf.fill f125 = [%5], 0x80\n"
  268.         "ldf.fill f126 = [%6], 0x80\n"
  269.         "ldf.fill f127 = [%7], 0x80\n;;"
  270.  
  271.         :
  272.         : "r" (&((fctx->fr)[0])), "r" (&((fctx->fr)[1])),
  273.           "r" (&((fctx->fr)[2])), "r" (&((fctx->fr)[3])),
  274.           "r" (&((fctx->fr)[4])), "r" (&((fctx->fr)[5])),
  275.           "r" (&((fctx->fr)[6])), "r" (&((fctx->fr)[7]))
  276.     );
  277. }
  278.  
  279. void fpu_enable(void)
  280. {
  281.     uint64_t a = 0;
  282.  
  283.     asm volatile (
  284.         "rsm %0 ;;"
  285.         "srlz.i\n"
  286.         "srlz.d ;;\n"
  287.         :
  288.         : "i" (PSR_DFH_MASK)
  289.     );
  290.  
  291.     asm volatile (
  292.         "mov %0 = ar.fpsr ;;\n"
  293.         "or %0 = %0,%1 ;;\n"
  294.         "mov ar.fpsr = %0 ;;\n"
  295.         : "+r" (a)
  296.         : "r" (0x38)
  297.     );
  298. }
  299.  
  300. void fpu_disable(void)
  301. {
  302.     uint64_t a = 0 ;
  303.  
  304.     asm volatile (
  305.         "ssm %0 ;;\n"
  306.         "srlz.i\n"
  307.         "srlz.d ;;\n"
  308.         :
  309.         : "i" (PSR_DFH_MASK)
  310.     );
  311.  
  312.     asm volatile (
  313.         "mov %0 = ar.fpsr ;;\n"
  314.         "or %0 = %0,%1 ;;\n"
  315.         "mov ar.fpsr = %0 ;;\n"
  316.         : "+r" (a)
  317.         : "r" (0x38)
  318.     );
  319. }
  320.  
  321. void fpu_init(void)
  322. {
  323.     uint64_t a = 0 ;
  324.  
  325.     asm volatile (
  326.         "mov %0 = ar.fpsr ;;\n"
  327.         "or %0 = %0,%1 ;;\n"
  328.         "mov ar.fpsr = %0 ;;\n"
  329.         : "+r" (a)
  330.         : "r" (0x38)
  331.     );
  332.  
  333.     asm volatile (
  334.         "mov f2 = f0\n"
  335.         "mov f3 = f0\n"
  336.         "mov f4 = f0\n"
  337.         "mov f5 = f0\n"
  338.         "mov f6 = f0\n"
  339.         "mov f7 = f0\n"
  340.         "mov f8 = f0\n"
  341.         "mov f9 = f0\n"
  342.  
  343.         "mov f10 = f0\n"
  344.         "mov f11 = f0\n"
  345.         "mov f12 = f0\n"
  346.         "mov f13 = f0\n"
  347.         "mov f14 = f0\n"
  348.         "mov f15 = f0\n"
  349.         "mov f16 = f0\n"
  350.         "mov f17 = f0\n"
  351.         "mov f18 = f0\n"
  352.         "mov f19 = f0\n"
  353.  
  354.         "mov f20 = f0\n"
  355.         "mov f21 = f0\n"
  356.         "mov f22 = f0\n"
  357.         "mov f23 = f0\n"
  358.         "mov f24 = f0\n"
  359.         "mov f25 = f0\n"
  360.         "mov f26 = f0\n"
  361.         "mov f27 = f0\n"
  362.         "mov f28 = f0\n"
  363.         "mov f29 = f0\n"
  364.  
  365.         "mov f30 = f0\n"
  366.         "mov f31 = f0\n"
  367.         "mov f32 = f0\n"
  368.         "mov f33 = f0\n"
  369.         "mov f34 = f0\n"
  370.         "mov f35 = f0\n"
  371.         "mov f36 = f0\n"
  372.         "mov f37 = f0\n"
  373.         "mov f38 = f0\n"
  374.         "mov f39 = f0\n"
  375.  
  376.         "mov f40 = f0\n"
  377.         "mov f41 = f0\n"
  378.         "mov f42 = f0\n"
  379.         "mov f43 = f0\n"
  380.         "mov f44 = f0\n"
  381.         "mov f45 = f0\n"
  382.         "mov f46 = f0\n"
  383.         "mov f47 = f0\n"
  384.         "mov f48 = f0\n"
  385.         "mov f49 = f0\n"
  386.  
  387.         "mov f50 = f0\n"
  388.         "mov f51 = f0\n"
  389.         "mov f52 = f0\n"
  390.         "mov f53 = f0\n"
  391.         "mov f54 = f0\n"
  392.         "mov f55 = f0\n"
  393.         "mov f56 = f0\n"
  394.         "mov f57 = f0\n"
  395.         "mov f58 = f0\n"
  396.         "mov f59 = f0\n"
  397.  
  398.         "mov f60 = f0\n"
  399.         "mov f61 = f0\n"
  400.         "mov f62 = f0\n"
  401.         "mov f63 = f0\n"
  402.         "mov f64 = f0\n"
  403.         "mov f65 = f0\n"
  404.         "mov f66 = f0\n"
  405.         "mov f67 = f0\n"
  406.         "mov f68 = f0\n"
  407.         "mov f69 = f0\n"
  408.  
  409.         "mov f70 = f0\n"
  410.         "mov f71 = f0\n"
  411.         "mov f72 = f0\n"
  412.         "mov f73 = f0\n"
  413.         "mov f74 = f0\n"
  414.         "mov f75 = f0\n"
  415.         "mov f76 = f0\n"
  416.         "mov f77 = f0\n"
  417.         "mov f78 = f0\n"
  418.         "mov f79 = f0\n"
  419.  
  420.         "mov f80 = f0\n"
  421.         "mov f81 = f0\n"
  422.         "mov f82 = f0\n"
  423.         "mov f83 = f0\n"
  424.         "mov f84 = f0\n"
  425.         "mov f85 = f0\n"
  426.         "mov f86 = f0\n"
  427.         "mov f87 = f0\n"
  428.         "mov f88 = f0\n"
  429.         "mov f89 = f0\n"
  430.  
  431.         "mov f90 = f0\n"
  432.         "mov f91 = f0\n"
  433.         "mov f92 = f0\n"
  434.         "mov f93 = f0\n"
  435.         "mov f94 = f0\n"
  436.         "mov f95 = f0\n"
  437.         "mov f96 = f0\n"
  438.         "mov f97 = f0\n"
  439.         "mov f98 = f0\n"
  440.         "mov f99 = f0\n"
  441.  
  442.         "mov f100 = f0\n"
  443.         "mov f101 = f0\n"
  444.         "mov f102 = f0\n"
  445.         "mov f103 = f0\n"
  446.         "mov f104 = f0\n"
  447.         "mov f105 = f0\n"
  448.         "mov f106 = f0\n"
  449.         "mov f107 = f0\n"
  450.         "mov f108 = f0\n"
  451.         "mov f109 = f0\n"
  452.  
  453.         "mov f110 = f0\n"
  454.         "mov f111 = f0\n"
  455.         "mov f112 = f0\n"
  456.         "mov f113 = f0\n"
  457.         "mov f114 = f0\n"
  458.         "mov f115 = f0\n"
  459.         "mov f116 = f0\n"
  460.         "mov f117 = f0\n"
  461.         "mov f118 = f0\n"
  462.         "mov f119 = f0\n"
  463.  
  464.         "mov f120 = f0\n"
  465.         "mov f121 = f0\n"
  466.         "mov f122 = f0\n"
  467.         "mov f123 = f0\n"
  468.         "mov f124 = f0\n"
  469.         "mov f125 = f0\n"
  470.         "mov f126 = f0\n"
  471.         "mov f127 = f0\n"
  472.     );
  473.  
  474. }
  475.  
  476. /** @}
  477.  */
  478.