函数逻辑报告 |
Source Code:arch\x86\kernel\cpu\mce\amd.c |
Create Date:2022-07-27 09:03:42 |
Last Modify:2020-03-12 14:18:49 | Copyright©Brick |
首页 | 函数Tree |
注解内核,赢得工具 | 下载SCCT | English |
函数名称:umc_normaddr_to_sysaddr
函数原型:int umc_normaddr_to_sysaddr(u64 norm_addr, u16 nid, u8 umc, u64 *sys_addr)
返回类型:int
参数:
类型 | 参数 | 名称 |
---|---|---|
u64 | norm_addr | |
u16 | nid | |
u8 | umc | |
u64 * | sys_addr |
674 | base等于0 |
675 | cs_id等于0 |
676 | bool hash_enabled = false |
679 | 如果amd_df_indirect_read(nid, 0, 0x1B4, umc, & tmp)则转到:out_err |
684 | hi_addr_offset等于tmp按位与GENMASK_ULL(31, 20)的值左移8位 |
686 | 如果norm_addr大于等于hi_addr_offset则 |
687 | ret_addr减等于hi_addr_offset |
688 | base等于1 |
703 | lgcy_mmio_hole_en等于tmp按位与BIT(1) |
704 | intlv_num_chan等于tmp右移4位按位与0xF |
705 | intlv_addr_sel等于tmp右移8位按位与0x7 |
706 | dram_base_addr等于tmp按位与GENMASK_ULL(31, 12)的值左移16位 |
709 | 如果intlv_addr_sel大于3则 |
710 | 打印错误信息("%s: Invalid interleave address select %d.\n", __func__, intlv_addr_sel) |
712 | 转到:out_err |
719 | intlv_num_sockets等于tmp右移8位按位与0x1 |
720 | intlv_num_dies等于tmp右移10位按位与0x3 |
721 | dram_limit_addr等于tmp按位与GENMASK_ULL(31, 12)的值左移16位按位或GENMASK_ULL(27, 0) |
723 | intlv_addr_bit等于intlv_addr_sel加8 |
727 | 当:intlv_num_chan恒等于0 |
727 | intlv_num_chan等于0 |
727 | 退出 |
728 | 当:intlv_num_chan恒等于1 |
728 | intlv_num_chan等于1 |
728 | 退出 |
729 | 当:intlv_num_chan恒等于3 |
729 | intlv_num_chan等于2 |
729 | 退出 |
730 | 当:intlv_num_chan恒等于5 |
730 | intlv_num_chan等于3 |
730 | 退出 |
731 | 当:intlv_num_chan恒等于7 |
731 | intlv_num_chan等于4 |
731 | 退出 |
733 | 当:intlv_num_chan恒等于8 |
736 | 默认 |
737 | 打印错误信息("%s: Invalid number of interleaved channels %d.\n", __func__, intlv_num_chan) |
739 | 转到:out_err |
744 | 如果intlv_num_dies大于2则 |
745 | 打印错误信息("%s: Invalid number of interleaved nodes/dies %d.\n", __func__, intlv_num_dies) |
747 | 转到:out_err |
750 | num_intlv_bits加等于intlv_num_dies |
756 | 如果num_intlv_bits大于4则 |
757 | 打印错误信息("%s: Invalid interleave bits %d.\n", __func__, num_intlv_bits) |
759 | 转到:out_err |
762 | 如果num_intlv_bits大于0则 |
772 | 如果amd_df_indirect_read(nid, 0, 0x50, umc, & tmp)则转到:out_err |
775 | cs_fabric_id等于tmp右移8位按位与0xFF |
776 | die_id_bit等于0 |
779 | 如果intlv_num_chan则 |
785 | sock_id_bit等于die_id_bit |
788 | 如果intlv_num_dies或intlv_num_sockets则如果amd_df_indirect_read(nid, 1, 0x208, umc, & tmp)则 |
790 | 转到:out_err |
793 | 如果intlv_num_dies则 |
795 | die_id_shift等于tmp右移24位按位与0xF |
796 | die_id_mask等于tmp右移8位按位与0xFF |
798 | cs_id或等于cs_fabric_id按位与die_id_mask的值右移die_id_shift位左移die_id_bit位 |
802 | 如果intlv_num_sockets则 |
803 | socket_id_shift等于tmp右移28位按位与0xF |
804 | socket_id_mask等于tmp右移16位按位与0xFF |
806 | cs_id或等于cs_fabric_id按位与socket_id_mask的值右移socket_id_shift位左移sock_id_bit位 |
817 | temp_addr_y等于ret_addr按位与GENMASK_ULL(intlv_addr_bit - 1, 0) |
818 | temp_addr_i等于cs_id左移intlv_addr_bit位 |
819 | temp_addr_x等于ret_addr按位与GENMASK_ULL(63, intlv_addr_bit)的值左移num_intlv_bits位 |
820 | ret_addr等于temp_addr_x按位或temp_addr_i按位或temp_addr_y |
824 | ret_addr加等于dram_base_addr |
827 | 如果lgcy_mmio_hole_en则 |
828 | 如果amd_df_indirect_read(nid, 0, 0x104, umc, & tmp)则转到:out_err |
831 | dram_hole_base等于tmp按位与Create a contiguous bitmask starting at bit position @l and ending at* position @h. For example* GENMASK_ULL(39, 21) gives us the 64bit vector 0x000000ffffe00000.(31, 24) |
832 | 如果ret_addr大于等于dram_hole_base则ret_addr加等于BIT_ULL(32)减dram_hole_base |
836 | 如果hash_enabled则 |
844 | hashed_bit与等于BIT(0) |
846 | 如果hashed_bit不等于ret_addr右移intlv_addr_bit位按位与BIT(0)的值则ret_addr异或等于BIT(intlv_addr_bit) |
851 | 如果ret_addr大于dram_limit_addr则转到:out_err |
855 | 返回:0 |
857 | out_err : |
858 | 返回:负EINVAL |
源代码转换工具 开放的插件接口 | X |
---|---|
支持:c/c++/esqlc/java Oracle/Informix/Mysql 插件可实现:逻辑报告 代码生成和批量转换代码 |