修补装置及方法

文档序号:6463626阅读:149来源:国知局
专利名称:修补装置及方法
技术领域
本发明涉及微电子领域,而且特别涉及孩t处理器中用以执行微码修补的 装置及方法。
背景技术
目前,于每一时钟周期中,微处理器被设计用以执行许多指令,并于任 一特定时钟周期中,提供许多可以执行最大指令数量之特征。
一般而言,一
时钟周期被视为分配给微处理器之每一流水线级(pipeline stage)之间隔时 间,用以执行将结果传送至下一个流水线级所需之处理工作。而现今之处理 器包括许多流水线级, 一部分被平行配置,用以允许同时或并行之处理工作 (task),因此多重指令得以平行执行。为了同步每一级之指令执行,将一核 心时钟信号提供至每一流水线级。该核心时钟信号,由一外部时钟产生电路 所提供,通常为一总线时钟信号频率之倍数。
任何本领域普通技术人员应当了解, 一 当前流水线微处理器之主要级可
划分为由存储器读取指令(即读取级逻辑单元);对特定处理器而言,将 指令转译至为唯一 (原生)之相关微指令序列(转译级逻辑单元);执行该
相关微指令序列(执行级逻辑单元);及将执行结果写入至指定位置(写入 级逻辑单元)。
上述读取及转译级,是被描述于当前使用宏(macro)指令之一复杂指 令集(CISC)之上下文中,例如常见之x86指令集架构(ISA)。利用一 单一宏指令以指定一些低级硬件操作,因此,任何本领域普通技术人员应了 解到,从存储器(例如外部存储器或高速緩存)读取一宏指令之前,需先 将该宏指令转换为对应之微指令序列(亦称为原生指令),是用以指定一个 或多个低级硬件操作。随着这转换,该微指令通常平行地被分派至各种执行 级单元用以执行,从而产生结果或执行所指定之低级操作。
因此,此技术领域将重点投注于开发快速及效能良好之架构,用以将宏 指令转换至相关微指令序列,及用以将微指令最佳化地分派至执行级资源。有一些不同的方法用以执行转换操作,但大部分的方法一般通过硬件及一只 读存储器(ROM)之索引存储器,以直接转换(意即转译)之组合为其特征。 直接转译之资源通常为转译器、解码器、转译逻辑单元等,而索引存储器之
资源通常为微码只读存储器(microcode ROM )或微指令只读存储器(micro instruction ROM )。
举例而言,指定一非常简单操作之一特定宏指令,也许仅通过一转译器 直接进行转译,或许将被转换至一个或多个相关微指令,而指定一非常复杂 操作(例如 一三角函数)之另一特定宏指令,则可被转译为一单一微指令, 以指定该微码只读存储器之一地址(即一微码只读存储器之入口点),包括 上百笔连续存放微指令之一序列,且该序列中之每一微指令是指定执行该复 杂操作所需之一低级操作。
任何本领域普通技术人员应当了解,储存于该微码只读存储器之复杂微 指令序列容易产生错误。当设计及制造新微处理器时,需依靠系统设计者提 供检测及修正这些错误的方法,以使整体变动的影响减到最小。于进行大量 生产前所采取之检测错误技术,为使实验室或侦错环境更弹性化,或许会牺 牲指令处理量(throughput)及一特定部分之速度。举例而言,于一新设计 中,在对硅进行变动前,实验室通常会提供用以仿真及测试微码变化影响的 装置。除此之外,根据所提供之修正选择,制造部分之微码错误修正弹性上 会优先考虑该部分之速度及处理量。另外,若于出货后检测出微码错误,亦 可提供将修正分发给消费者之技术,以此方式,消费者便能执行该部分之修 正。此个务正通常泮皮称为小f"补(patch )、孩"马fl^卜(microcode patch )、市场工 禾呈j奮 文(field engineering change; field ECs )等其它名-尔。
微码修补之较佳方式,是以一个或多个替代之微码指令,简单地取代或 置换一特定之微码指令。因此,于该微码只读存储器中,当检测到该特定之 微码指令被存取时,其对应之置换微码指令接着进行取代之操作。理论上, 此为一直接之方式。然而,实际上,于操作环境中,由于需不影响部分之处 理量,用于微码修补的装置往往非常复杂。
于美国专利第6438664号中,McGrath是针对许多微码修补方法之优缺 点进行讨论,包括当遇到引起问题之微码时,以及遇到引起问题之微码前, 立即从外部存储器读取欲置换之微码。在遇到问题微码前预先读取时,则该 置换微码是储存于一可变位置中,当需要时用以取代该问题微码。此外,于一处理器中,McGrath提供一些随机存取存储器(RAM),用以执行微码修 补。于处理器操作期间,该随机存取存储器由外部存储器载入修补,由该微 码只读存储器存取一微码线,以使得能够一旦修补时,则从该随机存取存储 器读取及执行该修补,以取代该微码线。McGrath揭示一些匹配寄存器,用 以储存微码只读存储器地址,是与随机存取存储器之修补相关。当发现一匹 配地址时,则允许该随机存取存储器进行取代。进一步,McGrath提到此方 法虽然有效,但当控制权由该微码只读存储器切换至该随机存取存储器时, 于流水线中,亦会产生两周期泡沫(two-cycle bubble)之限制。意即,根据 McGrath所揭露之技术,为牺牲效能及处理量之微码修补。
因此,需要一种执行一微码修补的装置及方法,不造成一微处理器流水 线级之延迟。进一步,更需要一种执行实时替代微码的装置,用以将微码只 读存储器中之一微指令以一置换微码指令取代之,而不影响该微处理器之效 能。
此外,亦需一种执行微码修补之技术,用以将一单一微码只读存储器指 令,置换为一个以上之替代微码指令,即为一对多之微码修补,其中,存取 该微码修补并不会造成额外之延迟。
进一步,更需要一种弹性装置,用以存取储存于外部存储器之微码修补, 于设计微处理器时,将存取微码修补时所造成之影响減至最小,并允许于该 替代码中,交错宏及微指令。于处理器调试、及对应复杂搡作所需之微码例 程(routine)之仿真期间,此一装置之设计特别适用。
同时,亦需一种不需通过微处理器执行指令,便可从一外部来源将微码 修补载入一微处理器之技术。

发明内容
本发明,于其它应用中,用以解决上述之问题,及解决传统技术之限制、 缺点和其它相关问题。本发明提供一位于一微处理器内之一修补装置,用以
将修补提供至储存于一微码只读存储器之微指令,或提供至该微处理器内之 电路。该装置系包括多个熔丝存储体与一阵列控制器。该熔丝存储体,系 被配置以储存相关修补记录,用以修补该微处理器之微码或电路,或用以储 存相关控制数据实体,以对该微处理器之控制电路进行编程,其中,于该微 处理器制造期间,所述熔丝存储体以该相关修补记录进行编程。该阵列控制器,系耦接于所述熔丝存储体,且被配置以读取该相关修补记录,并将该相 关修补记录提供至一修补载入器,其中,该修补载入器将对应该相关修补记 录之修补,当被指定时,提供至该微处理器之指定目标修补机制。于转译一 微处理器重置信号之后,与执行储存于一基本输入输出只读存储器之指令 前,该修补载入器将该修补提供至该指定目标修补机制。
再者,本发明另提供一种修补方法,于一微处理器制造期间,选择性地
提供修补或控制数据,该方法包括于该微处理器制造期间,编程多个熔丝
存储体,用以储存相关修补记录,以修补该微处理器之微码或电路,或储存
相关控制数据实体,用以编程该微处理器之控制电路;于该微处理器制造期 间,编码一个或多个配置熔丝存储体,用以指出每一熔丝存储体是否利用相 关修补记录其中之一,或相关控制数据实体其中之一进行编程;于转译一微 处理器重置信号之后,与执行储存于一基本输入输出只读存储器之指令前, 读取所述熔丝存储体与该一个或多个配置熔丝存储体;当被指定时,将对应 该相关修补记录之修补提供至该微处理器之指定目标修补机制;以及,对该 控制电路进行编程。


图1是显示于一微处理器中执行微码修补之一传统装置框图; 图2是显示根据本发明实施例,于一处理器中, 一转译级之细节框图; 图3是显示根据本发明实施例之一实时微码修补装置框图; 图4是显示根据本发明实施例之一种执行实时微码修补方法流程图; 图5是显示根据本发明实施例之一装置框图,用以执行一对多之微码修 补操作;
图6是显示根据本发明实施例之一种实现一对多微码修补方法流程图; 图7是显示根据本发明实施例之一装置框图,用以从存储器执行一微码 修补;
图8是显示根据本发明实施例之一示范封装宏指令格式; 图9是显示根据本发明实施例之一转译旁路码; 图10是显示根据本发明实施例之一微码修补扩充机制框图; 图11是显示根据本发明实施例之一修补随机存取存储器覆盖技术细节 框图,用于一微处理器中;图12是显示于制造期间,实现一微码修补机制之框图; 图13是显示于图12图中,该熔丝阵列之熔丝存储体O内部,熔丝状态 之范例表;以及
图14是显示依据本发明实施例之一示范修补存储体记录之字段框图。
主要组件符号说明
100 微码修补装置; 101 查找表;
102 匹配寄存器0、匹配寄存器7; 103 比较器;
104 -地址增加器:
105、305、505、705、 1005、 1105 微码只读存储器
106、1151'-修补随机存取存储器;107、214、307、313、 507、 513、 707、 713、 1007、
亂308、508、708、 1008 地址定序器;
109、309、509、709、 1009 下一个地址寄存器;
110、310、510、710、 1010、 1161 指令寄存器;
200~转译级;
221 模式检测器;
223 原生指令路由器;
211 指令长度解码器;
212~转译器;
213 控制只读存储器;
300 实时微码修补装置;
331、531、731、1031 系统存储器;
332、334、532、534、 732、 734、 1032、 1034 修补数据;
333、533、733、1033 基本输入输出系统(只读存储器);
311、511、711、1011 修补载入器;
312、512、712、10124务补阵列;
304、504、704、1004 地址增加器;
321、521、721、1021、 1056 熔丝阵列;
323、523、723、727、 1023、 1027 机器特定寄存器;500~—对多微码修补装置;
551、 751、 10514务补随机存取存储器;
700 微码修补装置;
754、 1054 保存上下文阵列;
755、 1045 中断/执行/交换逻辑单元; 728、 1028 标志寄存器;
1000 樣i码修补扩充机制;
1055、 1155 扩充随机存取存储器;
1162 EXPRAM控制器;
1201 阵列控制器;
1202 存储体;以及
1203~炫丝。
具体实施例方式
关于上述所讨论的装置,用以于现今之一处理器内部,执行一微码修补, 如图l所示,是用以强调说明所述装置之限制。随后之图2至图9,是用以 显示本发明之相关讨论。本发明提供一种兼具弹性及效能之技术,于一微处 理器中,用以规划及实现微码只读存储器之修补。本发明在执行修补之环境 上更具弹性,且与传统技术相较下,具有能更迅速实现修补的装置。
请参考图1,是显示一传统装置框图,用以于一微处理器中执行微码修 补。该框图是描述一传统的微码修补装置100,例如,可用于一目前之微处 理器之转译级内部。该装置100包括一微码只读存储器105,耦接一修补随 机存取存储器106。为便于讨论,配置该随机存取存储器106,用以将置换 微指令储存于一微码存储地址空间之上方64个位置中,从地址0x00至 0xC3f。因此,配置该微码地址空间上方64个位置,作为随机存取存储器106, 以对应只读存储器105。通过一微码地址总线ADDR存取该微码地址空间 OxOO-OxC3f,而该只读存储器105及该随机存取存储器106,将已编入索引 之微指令序列输出至一指令寄存器110。该指令寄存器110,将微指令提供 给微处理器之下一个级(未示出)执行。
该地址总线ADDR,由一下一个地址寄存器109接收一微码地址,其输 入耦接一多工器107之输出。该多工器之输出为四个多工器输入其中之一。该多工器输入为一递增地址,是由一地址增加器104、 一下一个入口点地址
NEXT ENTRY POINT、 一分支目标地址BR TGT、及一修补地址所产生。该 地址增加器104增加总线ADDR所提供之一前次微码地址,用以于一下一 个连续微码地址之位置,使能一微指令之索引,例如可为微指令序列所利 用。于该指令寄存器110中,目前指令之分支目标字段提供该分支目标地址, 以使能执行微码只读存储器105之分支。该下一个入口点为微码只读存储器 105中之一位置,是包含微指令,对应于一后续之微指令序列。于该随机存 取存储器106中,该修补地址为一替代之微指令位置,用以取代储存于微码 只读存储器105之现有微指令。 一地址定序器108,耦接该指令寄存器IIO, 产生一选择总线值SEL,以指示该多工器107由四个输入选择其一。该地址 定序器108判断该指令寄存器IIO之微指令类型。当该微指令包括一后续微 指令,是储存于微码只读存储器105或随机存取存储器106时,则配置SEL 使该多工器107选择该递增地址作为输入。当该微指令为一分支指令时,则 配置SEL,指示该多工器107将该分支目标地址提供至该下一个地址寄存器 109。当该微指令为一微指令序列之最后一个微指令时,则该地址定序器108 指示该多工器107,用以通过SEL将下一个入口点地址提供至下一个地址寄 存器。 一般而言,下一个入口点地址是通过一直接转译器(未示出)转译一 后续之宏指令而产生。为求简洁,在此不加赘述与该转译器之相互作用。
该装置100亦显示8个匹配寄存器102,其中,每一个均耦接一比较器 103。此外,经由总线ADDR,该比较器103接收该微码地址,是由该下一 个地址寄存器109所提供。该比较器103输出一选择总线SEL[7:0],用以于 一查找表101中,由8个入口选择其中之一,且亦耦接该地址定序器108, 指示已检测到用 一微码地址,用以执行一修补。于该查找表101之8个入口 中,每一个为一微码修补地址,被提供至总线PATCH ADDR,作为该多工 器107之一输入。
.图l之配置,为目前用以执行微码修补所使用之代表装置。于操作中, 通过基本输入输出系统(BIOS )之指令,或者,于处理器电力开启(power-叩) 或重置(reset)后,通过搡作系统所执行之指令,该只读存储器105内部之 一微码序列是被配置由外部存储器(未示出)载入该匹配寄存器102、该查 找表IOI、及该修补随机存取存储器106。因此,于总线ADDR上,当下一 个微码地址与该载入之匹配寄存器102之一内容匹配时,则该比较器103设定SEL[7:0],以于该查找表101中选择该对应之修补地址,并指示该地址定 序器108,将该下一个地址寄存器109目前之内容(即引起问题之微码地址) 替换为该查找表101所提供之修补地址。该地址定序器108因而改变SEL 之值,用以选择该修补地址,作为该下一个地址寄存器109之输入,因此, 由该下一个地址寄存器109提供该修补地址,并于该修补随机存取存储器 106中指示该入口点,作为置换微指令,随后输出至该指令寄存器110。
图l之配置,对于通过市场工程修改进行微码修补而言是有帮助的,且 利用已知之技术,易于通过执行储存于基本输入输出系统或操作系统之指令 来载入。然而,如McGrath所述,且如同本发明人所观察到的,必须进行一 微指令取代时(意即,当该比较器103指示一匹配时),于存取该对应之微 码指令前,由该下一个地址寄存器现在所输出之地址,必须以该查找表IOI 所读取之一修补地址取代之。McGrath提到这会于流水线中产生两周期泡沫 之延迟。此外,本发明人已注意到,此一延迟于最高操作条件下是不被允许 的,再者,就效能角度来看,于流水线中产生任一延迟是极为不利的。效能 因此被限制,进而使现今之微码修补技术受到局限。.
本发明借助提供一微码修补装置及方法,用以克服上述之限制,当存取 该修补时,并不会于流水线中产生任何额外延迟,使得执行一对一 (one-to-one )或 一对多(one-to-many )修补时,并不影响处理器之处理量。 本发明亦提供一种弹性化装置,用以执行修补,于仿真及调试时,适合牺 牲弹性以求完全的效能、具高度弹性但稍微影响效能、或最大弹性之情况。 以下将配合图2至图9详细叙述本发明。
请参考图2,是显示根据本发明实施例之一微处理器之一转译级200之 细节框图。该转译级200是被配置,以支持一对一微码修补操作、 一对多微 码修补操作,且具读取及执行存于系统存储器之微指令之弹性。根据本发明 之一实施例, 一对一微码修补操作为取代一单一微码只读存储器位置所储存 内容之操作。举例而言,从微码只读存储器地址0x001E所取得之一38位微 码只读存储器输出,以一38位之置换之加以取代,即视为一对一微码修补, 而不需管该3 8位输出是否为 一 明确(explicit)微指令、 一序连(concatenated ) 微指令、或多个微指令之一编码。同样地, 一对多微码修补操作,是将一单 一微码只读存储器位置之内容,以一个以上之置换加以取代。于上述例子中, 将该38位微码只读存储器输出,例如,以三个38位置换加以取代,即视为一对多微码修补。该转-泽级200包括 一宏指令总线201,用以从系统存储 器(未示出),分配通过读取级逻辑单元(未示出)所读取之指令。
将该宏指令分配至旁路逻辑(bypass logic )单元220、 一指令长度解码 器211、 一转译器212及一控制只读存储器213。如上所述,该控制只读存 储器213用以排序一内部微码只读存储器之微指令,并执行实时(real time ) 一对一及一对多微码修补,以下将配合图3至图7,加以详细叙述。该旁路 逻辑单元220内部,宏指令被提供至一模式检测器221及一原生指令(native instruction)路由器223。该模式检测器221提供一旁路信号组,包括 一旁 路使能信号224及一禁能信号222。该禁能信号222被传递至该长度解码器 211、该转译器212及该控制只读存储器213。该旁路使能信号224作为一多 工器(mux) 214之一控制信号。该原生指令路由器223、该转译器212及该 控制只读存储器213所输出之微指令,作为该多工器214之输入。该多工器 214由该旁路使能信号224控制,用以允许将三个微指令输入之任一个传送 至一原生指令总线215,或使该原生指令路由器223之输出无法通过该原生 总线215传送。为避免争用之情况,借助该禁能信号222及HO信号216控 制该原生指令路由器223、该转译器212及该控制只读存储器213,于任一 时间,仅传送一微指令输入至该多工器214。
本发明之转译级200,是被配置用以执行如上所述之功能及操作。根据 本发明之实施例,该转译级200包括数字逻辑单元、模拟逻辑单元、电路、 装置、或机器特定(machine specific)指令、或数字逻辑单元、模拟逻辑单 元、电路、装置或机器特定指令之一组合、或用以4丸行前述本发明功能及操 作之等效组件。于该转译级200内,执行该功能及操作所使用之组件,可与 其它电路、微码等共享,用以于该处理器内部,执行其它功能及操作。根据 本应用之范围,机器特定指令用以表示一个或多个机器特定指令。 一机器特 定指令为一单元执行之层级指令。举例来说,机器特定指令可通过一精简指
令集(RISC)微处理器直接执行。对一复杂指令集(CISC)微处理器而言, 例如x86兼容微处理器,则将x86指令转译至相关之机器特定指令,并通 过一单元或该复杂指令集微处理器内之单元,直接执行该相关之机器特定指 令。
于一正常操作模式下,通过该读取级,由外部存储器读取一应用程序之 宏指令,并提供至该宏指令总线201。通常,因为宏指令并不依循一固定之长度标准,因此,该指令长度解码器211评估该总线201上之比特流,再决 定每一宏指令之位长度。于一实施例中,通过一长度总线LEN,将每一宏指 令之位长度传送至该转译器212。于是,该转译器212由该宏指令总线201 取得所指示之位量。当该转译器212直接转译一已取得之宏指令时,该转译 器212执行将该宏指令转译至相关原生指令之操作。然后,该转译器212将 该原生指令提供至该多工器214。当该控制只读存储器213译码该已取得之 宏指令时,该转译器212产生一对应之微码只读存储器入口点地址,并通过 一远端(handoff)总线HO,将该入口点地址提供给该控制只读存储器213, 使该控制只读存储器213从该微码只读存储器接收该微指令。之后,该控制 只读存储器213由其内部之微码只读存储器中读取该对应之微指令,并将这 些微指令提供给该多工器214。因此,于正常操作模式下,该转译器212或 该控制只读存储器213,通过该多工器214,将取得之微指令传送至该原生 指令总线215。
于一实施例中,该转译级逻辑单元200是被配置用以存取一机器特定寄 存器202,包括一旁路模式使能(BE)位203。对程序设计者而言,该机器 特定寄存器202并未见于架构上,但可借助一加密接口 ( encrypted interface ) 之特别程序加以写入。为此,值得一提的是,当该BE位203被设定(assert) 时,该微处理器是于一转译旁路模式中,而当该BE位203被解除(deassert ) 时,则该^t处理器恢复为正常操作模式。
于正常操作期间,于该旁路逻辑单元220中,该模式检测器B1监视该 BE位203之状态及总线201上所显示之指令。当该BE位203被设定时, 则该模式检测器22H殳定该旁路使能信号224,接着使能原生指令,使其从 该原生指令路由器223,经由该多工器214,传递至该原生指令总线215,其 中,原生指令是由该转译器212及该控制只读存储器213所提供。于一实施 例中,针对由该宏指令总线201所读取之一对应宏指令,该禁能信号K2禁 止该转译器212及该控制只读存储器213执行指令转译功能。因此,当该转 译级200操作于正常操作模式时(即该BE位2(B被解除时),该旁路逻辑单 元220解除该旁路使能信号224,接着禁能该原生指令路由器223,并指示 该多工器214,由该转译器212或该控制只读存储器213选择原生指令来执 行。当该转译级200于旁路-漠式时(即该BE位203被设定时),则该旁路逻 辑单元220设定该旁路使能信号224,然后使能该原生指令路由器223及该模式检测器221。
于旁路模式中,该模式检测器控制该禁能信号222之状态,当禁能信号 被解除时,则禁能该原生指令路由器223,且该转译器212以及该控制只读 存储器213操作于正常模式。由该宏指令总线201读取宏指令,并通过该控 制只读存储器213加以转译及取得。然而,于此模式中,通过封装该模式检 测器221所检测到一特定封装(wrapper)宏指令之原生指令, 一程序设计者 可将原生指令交错于存于存储器之一宏指令流程中。于一实施例中,该封装 宏指令,为一未使用(unused)或一无效(invalid)宏指令,可于其它方面 产生一异常(exception )。因此,通过设定该BE位203,有助于一调试器将 本发明之一处理器设定成一原生旁路模式,但可继续使用特定指令集架构之 所有宏指令。除此之外,为支持调试或仿真功能,程序设计者可利用该封装 宏指令来内嵌(embed) —原生指令,接着,使能可编程存取于其它方面无 法利用之原生资源。举例来说,于本发明之一微处理器内,许多原生资源(例 如暂时储存寄存器、计数器、状态指示器等)于宏指令执行期间被利用, 但无法存取。然而,当该微处理器于旁路模式时,借助使用该封装指令,用 以存取这些原生资源之原生指令,可被交错于该宏指令中。
于旁路模式中,该模式检测器221监视由该宏指令总线201所得之指令。 当检测到一封装指令时,该模式检测器设定禁能信号,接着使能该原生指令 路由器223,并禁能该转译器212以及控制只读存储器213。当被使能时, 该原生指令路由器223从该封装宏指令内部去除该原生指令,并将该原生指 令传递至该多工器214及该原生指令总线215。于一实施例中,所有原生指 令具一固定位长度。于一特定实施例中,原生指令为38位。于一实施例中, 通过该封装指令所提供之原生指令,与通过该转译器212以及控制只读存储 器213所提供一样,是包括一个或多个机器特定指令之编码,随后,并由耦 接至该原生指令总线215之一机器特定转译器(微转译器),转译为一个或 多个机器特定指令。该微转译器(未示出)将该机器特定指令提供给之后的 流水线级执行。于一更传统的实施例中,通过该封装指令、该转译器212、 及控制只读存储器213所提供之原生指令,直接被提供至之后的流水线级执 行。
请参考图3,是显示根据本发明实施例之一实时微码修补装置300框图。 该修补装置300可内嵌于控制只读存储器内,其操作在正常或原生旁路模式下,例如图2所显示之控制只读存储器213。该实时微码修补装置300是 被配置用以执行一对一微码修补操作,通常与读取微指令所需时钟周期相 同。意即,本发明是被配置用以一对一微码修补,而不会于一处理器流水线 中产生任何额外延迟。
该一对一修补装置300包括一微码只读存储器305。于一实施例中,该 微码只读存储器具有20480 (0x5000)个38位之入口 ,并被设置于一 32K 微码地址空间内。亦可涵盖其它实施例。通过一^l码地址总线ADDR存取 该^:码地址空间,且该;微码只读存储器305依照该-微码地址总线ADDR之 值,将微指令序列提供给一多工器313。该多工器313之输出是耦接一指令 寄存器310。于该微处理器中.,该指令寄存器310将微指令提供给之后的级 (未示出)执行。于一实施例中,该微指令为多个机器特定指令,其为一38 位编码。于此实施例中,将该指令寄存器310之内容提供给一微转译器(未 示出),用以将该编码译码为机器特定指令,及用以将该机器特定指令分派 至流水线中之功能单元。
该地址总线ADDR,由一下一个地址寄存器309接收一微码地址,其中, 该下一个地址寄存器309之输入是耦接一多工器307之输出。是由该多工器 的三个输入中,选择其中之一作为该多工器之输出。该多工器之输入包括 由一地址增加器304所产生之一递增地址INC ADDR、 一下一个入口点地址 NEXT ENTRY POINT、及一分支目标地址BR TGT。该地址增加器304增加 总线ADDR所提供之一前次微码只读存储器地址,用以于一下一个连续微 码地址之位置,使能一微指令之索引,例如可为微指令序列所使用。该分 支目标地址,由目前该指令寄存器310中, 一微指令之分支目标字段所提供, 以执行微码只读存储器305之分支。这些分支之类型亦为微码分支。该下一 个入口点为微码只读存储器305中之一位置,是包含微指令,对应于一后续 之微指令序列,例如与一下一个宏指令相关。于一实施例中,通过一远端 总线,从本发明之一转译器,将该下一个入口点提供至该修补装置,例如 图2所示之转译器212及远端总线216。 一地址定序器308,是耦接该指令 寄存器310,并于一总线SEL上产生一值,以指示该多工器307由三个输入 选择一个。该地址定序器308判断该指令寄存器310之微指令类型。意即, 当该微指令包括一后续微指令,是储存于微码只读存储器305时,则设定 SEL,以指示该多工器307选择该递增地址作为输入。当该微指令为一分支指令时,则配置SEL,以指示该多工器307将该分支目标地址提供至该下一 个地址寄存器309。当该微指令为一微指令序列之最后一个微指令时,则该 地址定序器308指示该多工器307,通过SEL,将下一个入口点地址提供至 下一个地址寄存器。于一实施例中,当下一个入口点被提供至该多工器307, 用来存取一微码序列剩余之微指令时,该转译器可直接转译一个或多个初始 微指令,并供以执行。
该微码修补装置300亦包括一修补阵列312,是耦接该微码地址总线 ADDR,并产生一修补指令输出PATCH INSTRUCTION及一命中信号HIT。 于一实施例中,该修补阵列312为一快速相联阵列,用以根据总线ADDR 之值,提供32个入口以供查询。于另一实施例中,该修补阵列312包括 一内容可寻址存储器(content-addressable memory; CAM ),是包括32个入 口。任何本领域普通技术人员应当了解, 一内容可寻址存储器是被配置用以 接收一数据之实体输入(于此实施例中,意即,该下一个地址寄存器309之 内容),并针对整个内容执行一极快速搜寻(意即,32个入口),以判断是否 有一入口对应于所提供之输入。若有,则该内容可寻址存储器输出一相关之 数据片段。根据本发明,该相关之数据片段为一修补指令,对应于所提供之 地址。将该修补指令输出至该多工器313,并设定命中信号HIT。命中信号 HIT是耦接该多工器313之一选择输入。当命中信号HIT未被设定时,该多 工器313选择该微码只读存储器作为输出。当命中信号HIT被设定时,该多 工器313选择将该修补指令传递至该指令寄存器310,而非选择该微码只读 存储器304所输出之微指令。
因此,该修补阵列312执行微指令之存取,该微指令是对应总线ADDR 所提供之微码只读存储器地址,同时,对该微码只读存储器305进行存取, 并将该微码修补指令提供至该多工器313,与该微码只读存储器305之输出 平行。因为平行地存取该修补阵列312与该微码只读存储器305,当执行本 发明之一对一微码修补时,并不会产生任何额外延迟。
该修补装置300包括一修补载入器311,通过一载入总线LOAD耦接该 修补阵列312,并且利用传统的技术,于操作上耦接系统存储器332及一基 本输入输出系统之只读存储器(BIOS ROM) 333。该修补载入器311耦接一 重置信号RESET、 一熔丝阵列321内部之一修补熔丝F 322,且能够存取一 机器特定寄存器323内部之一修补位P 324。并依指示利用该修补载入器311 ,将基本输入输出系统333之修补数据334、或位于系统存储器331之修补数 据332,载入作为该修补阵列312之内容。于一实施例中,于重置或电力开 启后,执行该基本输入输出系统333之指令,以指示该修补载入器311检查 该熔丝322之状态。当该熔丝322于一状态(例如未熔断或熔断)时,指 示应载入该修补数据334,接着,配置该修补载入器311,用以从该基本输 入输出系统333取得该修补数据334,且该修补载入器311载入该修补阵列 312。于另一实施例中,于电力开启或重置后,通过该基本输入输出系统333 之指令检测出该熔丝322之状态,用以指示该修补载入器311,从系统存储 器331中,由一指定修补数据位置332取得该修补数据。于一实施例中,在 执行该基本输入输出系统333之指令前先#1行修补,而于读取该基本输入输 出系统333之指令前,及重置之后,配置该装置300,评估该熔丝322之状 态。若该熔丝322指示一修补将被载入,则该修补载入器3U从该基本输入 输出系统之只读存储器333之指定区域读取修补数据334,并将数据载入该 修补阵列312。当该修补被载入后,从该基本输入输出系统333读取指令, 用以启动该4敬处理器。此实施例特别有助于当该基本输入输出系统333内部 之指令,需要利用一修补,以适当地启动该微处理器之情况。当该基本输入 输出系统333必须于一特定状态适当地启动该微处理器时,此实施例更有助 于修补初始常数及寄存器之值。于另一实施例中,该修补载入器311监视该 机器特定寄存器323之修补位324之状态。于此实施例中,该机器特定寄存 器302并未见于架构上,但可借助一特别程序加以写入。举例来说,通过利 用特权指令(privileged instructions )之一加密接口 , 一实施例可具有写入寄 存器321之功能。于此应用中,值得一提的是,当该修补位P324被设定时, 指示该修补载入器311,从系统存储器331取得该修补数据332,并将修补 地址及修补指令载入修补阵列312。
与现今之微码修补技术相比较,本发明的装置300,可于电力开启/重 置期间,或者,于执行指令特权序列后,使能载入微码修补。除此之外,本 发明克服传统方法之限制,提供一种技术,以一对一之基础,实时地置换载 入之修补。当执行本发明之微码修补时,并不会于流水线中产生任何额外之 延迟。因此,当于一特定微码指令之一个或多个位发现错误时,图3的装置 300是极为有用的。进一步,该微码只读存储器305内部之任何位置均可进 行修补。那即是,当内部检测出一错误时,例如 一序別之第10个微指令,该序列包含40个微指令,是对应于一单一宏指令所指定之一执行,接着,
将一个一对一修补指令载入该修补阵列312,其地址与该微码只读存储器305 中,第10个微指令所储存之位置相同。
请参考图4,是显示根据本发明实施例之一种执行实时微码修补方法流 程图400。流程起始于步骤401,本发明之一微处理器进行电力开启或重置。 流程继续进行步骤402。
于决策步骤402中,于该微处理器中,评估并判断一熔丝阵列321内部 之一修补熔丝322是否为熔断状态。如果不是,则进行步骤404。若该熔丝 322为熔断状态,则将该修补数据载入一修补阵列312,即进行流程之步骤 403。
于步骤403中, 一修补载入器311从基本输入输出系统存储器333之一 指定修补数据位置334取得该修补数据,并将该修补数据载入该修补阵列 312。流程接着进入步骤404 。
于步骤404中,读取级逻辑单元开始从基本输入输出系统333读取欲执 行之指令,用以配置及初始化该微处理器及处理系统。当指令执行后,流程 接着进入步骤405。
于步骤405中,该微处理器依次读取及执行该程序流程内部之指令。流 程接着进入决策步骤406。
于步骤406中,评估并判断一机器特定寄存器323内部之一修补字段324 是否被设定为一状态,用以指示需将一修补载入该修补阵列312。若该修补 字段324指示不需载入一修补,流程进入步骤408。若该修补字段324指示 需载入一修补,流程进入步骤407。
于步骤407中,该修补载入器311从系统存储器331之一修补数据位置 332取得该修补数据,并将该修补数据载入该修补阵列312。流程接着进行 步骤408。
于步骤408中,该微处理器继续读取及执行指令。直接将宏指令转译为 微指令,以及/或者从微码只读存储器305取得相关之微指令。于微码只读 存储器305中,将位置之地址提供给该修补阵列312,同时将地址提供至该 微码只读存储器305。接着流程进行决策步骤409。
于步骤409中,评估并判断供给该修补阵列312之一微码地址是否与一 载入地址相匹配。如果不匹配,流程接着进入步骤411。若于该阵列312中,一地址确实匹配(命中),则流程进行步骤410。
于步骤410中,该修补阵列312输出对应于该匹配地址之一修补指令, 并设定一命中信号HIT,以指示一多工器313选择将该修补指令,而非将该 微码只读存储器305所取得之微指令,置入一指令寄存器310。接着,流程 进入步骤411。
于步骤411中,该微处理器继续读取及执行指令,而流程进入步骤405。
图3及图4之讨论,是着重于本发明对于一对一取代微码指令所提供之 改善,而且不影响效能。但本发明亦适用于执行一对多之微码修补,且提供 传统技术所没有的效能效益,如上述图l所讨论之技术。以下将参考图5及 图6,针对执行一对多微码修补的装置进行讨论。
请参考图5,是显示根据本发明实施例之一装置500框图,用以执行一 对多之微码修补操作。如上所述, 一个一对多之微码修补操作可视为将一单 一微码只读存储器位置(意即, 一微指令)所储存内容,以多个微指令取代。 该修补装置500可实现于控制只读存储器逻辑单元内,是操作于正常或原生 旁路模式下,如图2所示之控制只读存储器213。除此之外,本发明之一对 多微码修补装置500,是被配置用以执行一对多微码修补,其中,于一微处 理器流水线中,仅产生一单一周期之延迟。该延迟是起因于,将一微码分支 操作之执行,作为一对多修补之第一项操作,用以将微码读取至微码地址空 间之一修补随机存取存储器(RAM)区域,将进一步详述如下。因此,相较 于传统修补装置,如图1所示,本发明之一对多修补操作,对处理量 (throughput)提供显著之改善。
该一对多修补装置500包括一微码只读存储器505。于一实施例中,该 微码只读存储器505具有20480 ( 0x5000 )个38位之入口 ,并设置于一 32K 微码地址空间内。亦可涵盖其它实施例。该装置500亦包括一微码修补随机 存取存储器551,占用微码地址空间部分未使用之位置。于一实施例中,该 微码修补随^/L存取存储器551包括256个38位之入口 ,占用该微码地址空 间上方256个位置(意即,从位置0x7F00至0x7FFF )。该^i码地址空间, 包括只读存储器505及随机存取存储器551,均通过一微码地址总线ADDR 存取,且该微码只读存储器505及微码随机存取存储器551,依照该微码地 址总线ADDR之值,将微指令序列提供给一多工器513。该多工器513之输 出是耦接一指令寄存器510。于该微处理器中,该指令寄存器510将微指令提供给之后的级(未示出)执行。于一实施例中,该微指令为多个机器特定
指令,其为一38位编码。于此实施例中,将该指令寄存器510之内容提供 给一微转译器(未示出),用以译码及分派至功能单元。
该地址总线ADDR,由一下一个地址寄存器509接收一微码地址,其中, 该下一个地址寄存器509之输入是耦接一多工器507之输出。该多工器之输 出,是从该多工器的三个输入中选择其一。该多工器之输入包括由一地址 增加器504所产生之一递增地址INC ADDR、 一下一个入口点地址NEXT ENTRY、及一分支目标地址BR TGT。该地址增加器504增加总线ADDR 所提供之一前次微码只读存储器地址,用以于下一个连续微码地址之位置, 使能一微指令之索引,例如可为微指令序列所使用。该分支目标地址,由 目前该指令寄存器510中, 一微指令之分支目标字段所提供,用以执行微码 只读存储器505及/或微码随机存取存储器551之分支。该下一个入口点为 微码只读存储器505或微码随机存取存储器551中之位置,是包含微指令, 对应于一后续之微指令序列,例如与一下一个宏指令相关。于一实施例中, 通过一远端总线,将该下一个入口点NEXT ENTRY POINT从本发明之一转 译器提供至该修补装置500,例如图2所示之转译器212及远端总线216。 一地址定序器50S,是耦接该指令寄存器510,并于一总线SEL上产生一值, 用以指示该多工器507由三个输入选"f奪一个。该地址定序器508判断该指令 寄存器510之微指令类型。意即,当该微指令包括一后续微指令,储存于微 码只读存储器505或微码随机存取存储器551时,则设定SEL,指示该多工 器507选择该递增地址作为输入。当该微指令为一分支指令时,则配置SEL, 指示该多工器507将该分支目标地址提供至该下一个地址寄存器509。当该 微指令为一微指令序列之最后一个微指令时,则该地址定序器508指示该多 工器507,用以通过SEL将下一个入口点地址提供至下一个地址寄存器。于 一实施例中,当下一个入口点被提供至该多工器507,用来存取一微码序列 剩余之微指令时,同时,该转译器可直接转译一个或多个初始微指令,并供 以执行。
如上述图3及图4所示之一对一修补装置300,进一步,该微码修补装 置500包括一修补阵列512,是耦接该微码地址总线ADDR,并产生一修补 指令输出PATCH INSTRUCTION及一命中输出HIT。于一实施例中,该修 补阵列512为一快速相联阵列,用以根据总线ADDR之值,提供32个入口以供查询。于另一实施例中,该修补阵列512包括一内容可寻址存储器,是 包括32个入口。该修补阵列512接收该下一个地址寄存器509之内容,并 针对整个内容执行一极快速搜寻(意即,32个入口),以判断是否有一入口 对应于所提供之输入。若有,则该修补阵列512输出一修补指令,对应于所 提供之地址。将该修补指令输出至该多工器513,并设定命中信号HIT。命 中信号HIT是耦接该多工器513之一选择输入。当命中信号HIT未被设定 时,该多工器513适当地选择该微码只读存储器或微码随机存取存储器作为 输出。当命中信号HIT被设定时,该多工器513选择将该修补指令,而非将 该微码只读存储器550 /该微码随机存取存储器551所输出之微指令,传递 至该指令寄存器510。
该修补随机存取存储器551,于该微码地址空间内部,为挥发性及可载 入位置之一集合,用于一对多之微码修补。于该微码只读存储器505中,当 一特定地址之一单一微指令需要以具有多个微指令之一微码修补取代时,如 下所述,则所述多个置换微指令是储存于该随机存取存储器551之一置换位 置,其中,所述多个置换微指令之第一微指令,是储存于该随机存取存储器 551之第一位置,且其中, 一微码分支指令被载入该修补阵列512,作为对 应该特定地址之数据,该微码分支指令具有一分支目标地址,为该随机存取 存储器551之第一位置。因此,当欲进行修补之微指令之特定地址被供应至 总线ADDR时,将同时被供应至该修补阵列512。而当该微码只读存储器 505之内容被存取时,该修补阵列512将该储存之微码分支指令提供至该多 工器513,与该微码只读存储器505之输出平行。因为总线ADDR之内容与 该修补阵列512匹配,命中信号HIT因此^皮i殳定,而通过该多工器513,将 经由该修补阵列512所取得之该微码分支指令,传递至该指令寄存器510, 且无产生额外之延迟。该地址定序器508注意到, 一微码分支指令是于该指 令寄存器510内部,而该分支目标地址,于该修补随机存取存储器551之上 述第一位置,是输入至该多工器507。因此,该地址定序器508指示该多工 器507,通过SEL,选择该分支目标地址,接着经由总线ADDR提供给该微 码地址空间,以及选#^亥修补随机存取存储器551之上述第一位置,意即, 包含一对多微码修补之第一微指令位置。通过该地址增加器504所提供之递 增地址,从该随机存取存储器551存取修补之后续微指令,直到该地址定序 器508读取及检测到该修补序列之一最后微指令,指示该多工器507选择下一个入口点。另外,载入该随机存取存储器551之修补,亦包括一微指令,
使一分支回到该微码只读存储器505之一位置。
该修补装置500包括一修补载入器511,通过一载入总线LOAD耦接该 修补阵列512,并通过一载入随机存取存储器总线LOADRM耦接该修补随 机存取存储器551,进一步,利用传统的技术,于操作上耦接系统存储器532 及基本输入输出系统之只读存储器533。该修补载入器511耦接一重置信号 RESET、 一熔丝阵列521内部之一修补熔丝F 522,且能够存取一机器特定 寄存器523内部之一修补位P524。并依指示利用该修补载入器511,将基本 输入输出系统533之修补数据534、或位于系统存^f诸器531之修补数据532, 载入作为该修补阵列512及该修补随机存取存储器551之内容。
操作上,载入该修补阵列512及该修补随机存取存储器551之执行方法, 与图3的装置300载入该修补阵列312之方式大致相同,差异处在于,所供 应之修补数据532、 534,包含了载入该阵列512及该修补随机存取存储器 551两者之所需数据,以及,根据该熔丝522之状态、载入只读存储器533 之指令、及机器特定寄存器523内修补位524之状态,该修补载入器511将 数据载入该阵列512及该修补随机存取存储器551 ,与前述图3所标示之组 件类似。
因此,于电力开启/重置期间,或者,于通常于架构上并未提供之指令 执行期间,本发明的装置500能够载入一对多之微码修补,以快于传统技术 之方式,用以存取一对多微码修补。图5的装置500,有助于当发现错误时, 需利用多个微指令作为一修补,用以取代已烧录至微码只读存储器505之一 微指令。除此之外,该一对多的装置500,使一对多之微码修补易于实现, 并将修补所影响之效能减至最低。进一步,本发明之一对多修补方法与一对 一修补所需的方法一致,其中, 一对一修补简单地取代一微码分支,为随机 存取存储器551之一 目标地址,是包含一对多之修补。
请参考图6,是显示根据本发明实施例之一种实现一对多微码修补方法 流程图600。流程起始于步骤601,其中,本发明之一微处理器进行电力开 启或重置。接着,流程进行决策步骤602。
于决策步骤602中,于该微处理器中,评估并判断一熔丝阵列521内部 之一修补熔丝522是否为熔断状态。如果不是,则流程进行步骤604。若该 熔丝522为熔断状态,则将该修补数据载入一修补阵列512及修补随机存取存储器551,接着,进行流程之步骤603。
于步骤603中, 一修补载入器511从基本输入输出系统存储器533之一 指定修补数据位置534取得该修补数据,并将该修补数据载入该修补阵列 512及修补随机存取存储器551。该修补数据包括一微码分支指令,被载入 该修补阵列512,其中,该微码分支指令之目标地址为修补随机存取存储器 551之一位置,为该一对多微码修补之第一微指令。该修补数据亦包括该一 对多微码修补,由该修补载入器511载入至随机存取存储器551之目标位置。 流程继续进行步骤604。
于步骤604中,读取级逻辑单元开始从基本输入输出系统533读取欲执 行之指令,用以配置及初始化该微处理器及处理系统。当指令执行后,流程 接着进入步骤605。
于步骤605中,该微处理器依次读取及执行该程序流程内部之指令。流 程接着进行决策步骤606。
于步骤606中,评估并判断一机器特定寄存器523内部之一修补字段524 是否被设定为一状态,用以指示需将一修补载入该修补阵列512及该修补随 机存取存储器551。若该修补字段524指示不需载入一修补,则流程进入步 骤608。若该修补字段524指示需载入一修补,则流程进入步骤607。
于步骤607中,该修补载入器511从系统存储器531之一修补数据位置 532取得该修补数据,并将该修补数据载入该修补阵列512及修补随机存取 存储器551,如上述之步骤604。流程接着进行步骤608。
于步骤608中,该微处理器继续读取及执行指令。直接将宏指令转译为 微指令,以及/或者从微码只读存储器505取得相关之微指令。于微码只读 存储器505中,将位置之地址提供给该修补阵列512,同时将地址提供至该 微码只读存储器505。接着,流程进入决策步骤609。
于步骤609中,评估并判断供给该修补阵列512>^—微码地址是否与一 载入地址相匹配。如果不匹配,则流程进行步骤613。若于该阵列512中, 一地址确实匹配(命中),则流程进入步骤610。
于步骤610中,该修补阵列512输出对应于该匹配地址之一替代指令, 并设定一命中信号HIT,以指示一多工器513选择将该替代指令,而非将该 微码只读存储器505所取得之微指令,置入一指令寄存器510。接着,流程 进入决策步骤611。于决策步骤611中,评估并判断该指令寄存器510之替代指令,是否为
一微码分支指令,于该修补随机存取存储器551中具有一目标地址。若是, 则前进至步骤612。如果不是,则流程进入步骤613。
于步骤612中,将该微码分支指令之分支目标地址提供至总线ADDR, 以执行该微码分支,此外,于该修补随机存取存储器551中,取得该一对多 修补之第一微指令位置。流程接着进行步骤613。
于步骤613中,该微处理器继续读取及执行指令,而流程进入步骤605。 本发明之一对一微码修补及一对多微码修补之效能已详述如上,现在, 请参考图7至图9,是显示利用前述的装置及方法,允许从系统存储器执行 微码修补,进而执行更具弹性之测试、仿真、及调试操作之细节。于此应用 中,所述修补之执行模式,称之为转译旁路模式或原生旁路模式。此一操作 模式已配合图2详述如上,其中,已揭示微指令可与宏指令交错,作为一程 序流程的一部分,储存于系统存储器中。于一实施例中,宏指令为x86宏指 令,通过一x86兼容微处理器执行。现在,将配合以下之图示,针对一程序 设计者、 一发明者、或一调试器,详细说明如何利用本发明进入及离开转译 旁路模式,以及,如何将原生指令与宏指令交错于一程序流程内部,通过插 入微码指令,对目前之微码例程进行调试,并且允许存取原生资源,例如 机器特定寄存器、隐藏寄存器等,以及,对应于微码例程之原生指令,在将 其烧录至只读存储器之前,如何进行测试。除此之外,特定微码例程可被编 程至系统存储器,并执行边界条件测试、作业测试、硬件调试、及其它测试 活动。
请参考图7,是显示根据本发明实施例之一装置700,用以从系统存储 器执行一微码修补。该装置700,与前述第5-6图所示之一对多修补装置500 大致相同,额外增加执行存储器731所储存之^U马序列所需之组件及物件, 相对于一修补阵列712或修补随机存取存储器751所储存之序列。于图7中, 该装置700之组件操作,与图5中,该装置500之组件操作大致相同,是将 图中许多数字以"7"取代。
于图5的装置500中,除了共同的组件之外,该装置700包括中断/执 行/交换逻辑单元755,用以存取一机器特定寄存器727内部之一旁路使能 (BE)位729,及一标志寄存器728内部之一旁路开启(BO)位730。该装 置700亦包括旁路码(bypass code) 735,是储存于系统存储器731中。该旁路码735,可包括多个封装(wrapper-encapsulated)微指令或宏指令之一 程序流程,具有封装微指令交错在其中。该旁路码735,为该程序流程,由 该微处理器执行,以代替一特定之微指令。
该装置700亦显示微指令之一使能旁路序列752,是被载入该修补随机 存取存储器751内部。该使能旁路序列752用于转译级,用以储存一先前宏 指令之上下文,并于进入转译旁路模式前进行转译及执行操作。该上下文是 储存于一保存上下文阵列754中。于一实施例中,该保存上下文阵列754为 一个或多个机器特定寄存器。示范之上下文信息包括该先前宏指令之地址、 它的下一个指令指标等。需将与该先前宏指令相关之信息充份储存于该保存 上下文阵列754中,以便于转译旁路模式结束时,可以恢复正常宏指令程序 流程之执行。为了恢复正常宏指令程序流程,将微指令之一恢复上下文序列 753载入该修补随机存取存储器751。为终止转译旁路模式,于该旁路码735 中,执行一微码分支指令,具有一分支目标地址,用以指定该恢复上下文微 码序列753之位置。于一实施例中,该恢复上下文序列753可固定储存于微 码只读存储器705中,以代替被载入该修补随机存取存储器751 。
于操作中,如上所述,将数据载入该修补阵列712或修补随机存取存储 器751。于该微指令之微码只读存储器地址,将一微码分支指令载入该修补 阵列712,该微指令将被取代、仿真、测试等。该修补阵列712之微码分支 指令,包括一第一微指令之一分支目标地址,是于修补随机存取存储器751 之使能旁路序列752中。当欲被置换之微指令地址被提供至总线ADDR时, 该修补阵列712发送并执行该微码分支指令,以指示流程进入该修补随机存 取存储器751之使能旁路序列752。该使能旁路序列752,是包括微指令, 用以指示该中断/执行/交换逻辑单元755设定该旁路使能(BE)位729, 进而指示转译逻辑单元200,如图2所示,旁路模式已被使能。使能旁路序 列之最后一个微指令包括一分支,对应于储存在系统存储器731里的旁路码 735。尔后,如图2所示,该旁路逻辑单元220执行检测封装(wrapper)指 令所需之操作、从该封装指令内部去除该原生指令、以及将原生指令传递到 该原生总线215。
当该微处理器于转译旁路模式时,通过传统技术,中断及其它任务控制 权转移事件(下文统称为"中断")发出信号通知该中断/执行/交换逻辑 单元755。当处理一中断时,于该寄存器727中,检查旁路使能(BE)位729之状态,以判断该微处理器是否操作于原生旁路模式。若是,先储存该状态,
再借助设定该标志寄存器728之旁^^开启(BO)位730,以处理该中断。需 注意,该标志寄存器728为该微处理器内部之一结构化寄存器(architectural register),于任务控制权转移期间保存其状态,并于控制权回复时恢复其状 态。于一x86之实施例中,该标志寄存器728包括一x86兼容处理器之标志 寄存器(EFLAGS),而该旁路开启(BO)位730包括上述标志寄存器之第 31个位。当设定旁路使能(BE)位729 (使能该旁路模式)时,若发生一中 断,则于处理该中断之前,该中断/执行/交换逻辑单元755设定该标志 寄存器728之旁路开启(BO)位730。除此之外,清除旁路使能(BE )位 729,从而禁能原生旁路模式。在从中断回复之前,若一封装宏指令是于具 控制权之一中断服务例程或其它应用程序内部,则该指令转译级200将根据 控制指令集架构之结构规格,用以解译该封装宏指令,于一实施例中,包括 产生一异常(exception)。如此一来,对于服务所述事件之操作系统模块, 或具程序控制权之其它应用程序而言,应用程序可利用交错原生指令,而不 会产生问题。从一中断事件回复至利用原生旁路模式之一应用程序时,该中 断/执行/交换逻辑单元755检查该标志寄存器728之旁路开启(BO)位 730的状态。假使该位730指出原生旁路模式之前被使能过,则设定该旁路 使能(BE)位729为一再使能(re-enable)旁路模式。接着,将控制权回复 至该应用程序,随后再度执行宏指令(包括封装指令)。于原生旁路模式之 应用程序可检查旁路开启(BO)位730之状态,以判断是否发生一中断, 也许改变了在中断发生前所使用之任一原生资源之状态或内容。于中断事件 时,因为原生资源并非结构性可存续, 一中断处置器,或具程序控制权之其 它应用程序,可以改变目前应用程序所使用之一原生资源的状态,该应用程 序是于旁路模式。于一选择性实施例中,于原生旁路模式时,该标志寄存器 728于该微处理器内部包括一原生寄存器,其内容借助执行一程序流程内部 之原生指令而被清除。根据该选择性实施例,从中断回复之后,该中断/执 行/交换逻辑单元755将该标志寄存器728之值i殳定为一非零(non-zero ) 值,因此,提供一手段,让该原生旁路应用能够判断是否发生一中断。于另 一实施例中,该标志寄存器728是包括具有旁路开启(BO)位730之一 结构化标志寄存器以及一原生寄存器,如上所述,提供了两种指示给该原生 旁路应用,以表明发生一中断。如上所述,对该恢复上下文序列753 4丸行一^敬码分支,以终止转译旁路 模式。于一实施例中,该恢复上下文序列753,指示该转译级重新载入储存 于保存上下文阵列754之宏指令上下文,及指示该中断/执行/交换逻辑 单元755设定该旁路使能(BE )位729,从而使该转译逻辑单元200回复至 正常操作模式。该恢复上下文序列753之最后一个微码指令被执行后,指示 一地址定序器708 —序列之最后一个微指令已被执行,然后,在储存上下文 之后,进入转译旁路模式之前,将对应于一宏指令之下一个入口点提供给该 多工器707。于一选择性实施例中,亦考虑该使能旁路序列752包括微指令, 以于转译旁路模式期间,指示该中断/执行/交换逻辑单元755完全禁能 中断。根据此实施例,保存存储器所需执行之唯一操作,为储存目前之中断 遮罩、于转译旁路模式期间遮蔽中断,然后,在回复到正常操作模式之前, 恢复该中断遮罩。
请参考图8,是显示根据本发明实施例之一示范封装宏指令800。该封 装宏指令800,是包括 一运算码(opcode )字段801及一原生指令字段802。 于一较佳实施例中,该运算码字段801包括一无效或一未使用运算码值,是 根据所使用之指令集架构。于一选择性实施例中,可利用一有效(valid)运 算码,其限制为,于转译旁路模式中,避免执行具有该有效运算码之指令。
该原生指令字段802包括一个或多个欲执行之微指令。于一实施例中, 是将一个微指令内嵌于该原生指令字段802内部。于另一实施例中,是将三 个微指令之38位编码内嵌于该原生指令字段802内部。于第三实施例中, 是将欲依序执行之多个微指令提供给该原生指令字段so厶
请参考图9,是显示根据本发明实施例之一转译旁路码卯0。该转译旁 路码900显示交错于该程序流程900之一些封装宏指令卯1、 902、 904,亦 包括数个有效宏指令903。如上所述,将该旁路码900载入系统存储器,于 该旁路码900中,将第一个指令之地址,作为一最后一个微指令内部之一分 支目标地址,该最后一个微指令是于该使能旁路序列752内部(图7),而该 序列是被载入该修补随机存取存储器751。因此,该使能旁路序列752执行 让该微处理器进入转译旁路模式所需之操作,以对该旁路码900之第一个指 令卯l执行一分支。当该第一个指令901进入该转译级时,旁路逻辑单元检 测该无效/未使用运算码、从其内部去除该内嵌之原生指令、以及将该原生 指令提供到该原生总线上用以执行。当最后一个封装指令904被提供至该转译级时,旁路逻辑单元从其内部 去除该内嵌之原生指令,该原生指令为一微码分支,对应于储存在该修补随
机存取存储器751内部之恢复上下文序列753之第一位置。因此,对应于该 恢复上下文序列753之程序流程分支,用以恢复正常操作所需之上下文,并 终止转译旁路模式。
请参考图10,是详述根据本发明实施例之一微码修补扩充机制1000框 图。该机制1000大体上与上述图7至图9之修补装置700相似,并增加载 入微码修补所需之组件与特征,且于制造期间,该微码修补被编程及被利用, 用以扩充该修补随机存取存储器751之容量,进而实现较多数目之微码修补。 该装置1000之组件操作,与图7的装置700具有相同编号之组件操作大体 上相似,其中,图7标号之百位数字以"10"取代之。
除了组件与图7的装置700相同外,该机制1000包括一熔丝阵列1056, 通过总线FSPTCH耦接至该修补载入器1011。该机制1000亦包括 一扩充 随机存取存储器EXPRAM 1055,通过总线LDEXP耦接至该修补载入器 1011。于制造期间,该熔丝阵列1056可借助烧断已选取之熔丝来编程,以 使能微码及其它种类之修补(意即,常数或机器状态更新),并借助本身提 供,而不需要将该修补分配至该区域,如同修补1034, 1032之例子,必须 被载入至基本输入输出系统之只读存储器1033或系统存储器1031。于一实 施例中,该熔丝阵列1056包括金属熔丝(未示出),置于一个或多个金属 处理层(例如 一集成电路芯片)中,可于制造期间,使用传统方法加以烧 断。于其它实施例中,该熔丝阵列1056包括聚合物熔丝(未示出),置于 一个或多个聚合物层中,可利用实际上相似之技术,加以选择性地烧断。进 一步,于一实施例中,该熔丝1056可利用金属及聚合物组合之熔丝加以实 现。
于一实施例中,该EXPRAM 1055包括多个随机存取存储器位置,可借 助位于总线LDEXP之该修补载入器1011寻址,以及,可借助控制电路(未 示出),使能已选择位置与该修补随机存取存储器1051所对应位置之覆盖 (overlay)或调换(swap)。该EXPRAM 1055之目的,是提供一有效用之 机制,用以储存大于该修补随机存取存储器1051之容量之微码修补。该 EXPRAM 1055之另一目的,除了微码只读存储器1005以外,于该微处理器 中,是用以提供作为修补机制之数据储存与编程。举例而言,于本领域普通技术人员所了解, 一现今微处理器包括数百个机器特定寄存器及相关之控制 电路,当中,许多必须于重置后加以初始化。于一实施例中,当所述多个寄
存器与电路之初始状态亦储存于该EXPRAM 1055中,在该樣i处理器执行指 令之前,使用该熔丝阵列1056,以使能所述状态之修补。于此常数更新之实 施例中,如上所述,某些机制之状态通常会接在重置之后被初始化。
当该机制不正确的^C初始化时,于初始化前,通过该EXPRAM 1055所 提供之数据,修补该初始状态,将进一步详述如下,用以更新状态,而不是 提供其它解决方案。上述之常数更新实施例仅用以说明该EXPRAM众多使 用方式之一,用以执行机器状态数据之修补。
于一实施例中,于一芯片之高速缓存内,该EXPRAM 1055包括一排或 多排额外存储体(bank),且无法由可程序化指令存取(意即,宏指令),但 可以被微码所存取,也就是,微指令之执行。于一特定实施例中,包括具 有4096可寻址位位置之EXPRAM 1055。
于操作时,如上所述之该修补阵列712和修补随机存取存储器751,可 通过相同之机制载入该EXPRAM 1055,亦即,通过位于系统存储器1031或 基本输入输出系统之只读存储器1033之修补数据1032、 1034。而该修补数 据1032、 1034另外包括系统控制数据(如前述之该初始化数值)。于基本输 入输出系统1033之指令执行前,必须更新机器状态的情况下,本发明实现 该常数修补数据之编程,是位于基本输入输出系统之只读存储器1033之指 定修补数据区1034中,或位于该熔丝阵列1056中。进一步,本发明实现微 码修补利用该EXPRAM 1056之一指定区域,用以调换以及/或者覆盖位于 该修补随机存取存储器1051之微码修补,将更具体说明如下。
于重置信号RESET转译之后,但于微指令执行之前,通过该修补载入 器IOII,载入编程于该熔丝阵列1056之数据。也就是,于重置之后,该微 处理器执行微指令,使得编程至该熔丝阵列1056之数据被读取与被载入。 由该熔丝阵列1056所接收之数据,会被编码,用以指示一目标修补单元(意 即,该修补阵列1012、修补随机存取存储器1051、或EXPRAM 1055 )、该 目标单元内之位置、以及其它信息,接下来将更进一步地详细说明。
接着,于重置之后,由该熔丝阵列1056,将数据载入该目标修补单元, 该机制IOOO组件之操作,大致上与上述图2至图9之方式相同,除了额外 之EXPRAM 1055,是用以提供微码修补之调换与覆盖,现在将配合图11更i羊细地j兌明。
接着参考图11,是显示依据本发明实施例之一细节框图1100,用以说 明于一微处理器中, 一修补随机存取存储器之覆盖技术。该框图1100,是包 括 一微码只读存储器1105、 一修补随机存取存储器1151、以及一扩充随 机存取存储器(EXPRAM) 1155,如同前述图示之说明。该框图1100,亦 包括 一扩充随机存取存储器(EXPRAM)控制器1162,经由总线1163耦 接至该修补随机存取存储器1151与该EXPRAM 1155两者,且控制该两个 修补单元1151、 1155,用以调换以及/或者覆盖微码修补。该EXPRAM控 制器1162,是耦接一微指令寄存器1161,且接收^:执行之微指令,该微指 令是由该微处理器之微指令修补电路(未示出)所指示。除此之外,经由如 图所示之该修补指令总线,将前述之修补微指令提供给该多工器1013。
为说明本发明,该框图1100是显示三个微码修补修补A 1164、修补 B1165、以及修补C1166。于修补A 1164至修补C 1166中,包括 一个或 多个微指令,如文中所述,已通过上述三个微码修补载入技术之任何一个载 入,意即,由该熔丝阵列载入、由基本输入输出系统之只读存储器载入(于 基本4餘入输出系统之宏指令4丸4亍初始之前、或扭^亍初始之后)、或由系统存 储器/高速緩存载入。如图所示,修补A 1164于该修补随机存取存储器1151 与该EXPRAM 1155两者中。可借助上述之技术,将该^'务补A 1164载入至该 修补随机存取存储器1151与该EXPRAM 1155中,或者,借助一个或多个 EXPRAM微指令1167之执行,开始将其载入该EXPRAM 1155,并于该修 补随机存取存储器1151中执行覆盖,其操作将叙述如下。
本发明实现一个或多个EXPRAM微指令1167,是被配置用以指示该 EXPRAM控制器1162搬动该EXPRAM 1155与该^f补随机存取存储器1151 间之数据。本发明亦实现一个或多个EXPRAM ^f鼓码例程,是被配置用以指 示该EXPRAM控制器1162搬动该EXPRAM 1155与该修补随机存取存储器 1151间之数据,其中,每一微码例程包括多个微指令。因此,为清楚说明, 下面之讨论将使用EXPRAM微指令1167之名称,其中,值得注意的是,前 述之微码例程亦包括在内。于一实施例中,是实现一调换EXPRAM微指令, 用以指示该EXPRAM控制器1162,将该修补随机存取存储器U51中,一 个或多个指定位置之内容,与该EXPRAM 1155中, 一个或多个M^定之位置 调换。于另一实施例中,是实现一覆盖EXPRAM微指令,用以指示该EXPRAM控制器1162,将该修补随机存取存储器1151中, 一个或多个指定 位置,以该EXPRAM 1155之一个或多个规定位置之内容覆盖。于其它实施 例中,是包括各种修改之实现,以调换与覆盖微指令。为清楚说明,如框图 IIOO所示之实施例,为一单一 EXPRAM微指令1167,然而,值得注意的是, 多个EXPRAM微指令1167可用以执行一调换或一覆盖,而于该EXPRAM 1155与修补随机存取存储器1151中,本发明包括指定及规定位置之各种形 式。
于一实施例中,一 EXPRAM微指令1167可存于该微码只读存储器1105 中,并执行一微码分支指令,用以实现一分支到微码只读存储器1105中, 该EXPRAM微指令1167储存之位置。亦一同传递来源与目的之地址参数, 用以于修补随机存取存储器1151与EXPRAM 1155中,指定欲被调换或覆 盖之区i或。
于另 一实施例中,是实现一 EXPRAM微指令1167,用以作为 一修补1164 之一部分,如图所示,于该修补随机存取存储器1151中,进而使能之后修 补指令之调换与覆盖。
依据本发明,于操作时,该EXPRAM控制器1162经由该指令寄存器 1161发送一 EXPRAM微指令1167用以执行,通过总线1163,于该两修补 单元1151、 1155之间,该EXPRAM控制器1162搬动该EXPRAM 1155之 规定内容与该修补随机存取存储器1151之指定内容,以作为其内容之调换 以及/或者覆盖,因此,能提供更多数目之修补1164-1166。于一实施例中, 该EXPRAM控制器1162,是包括多个微码例程,配置于该微码只读存储 器以及/或者该修补随机存取存储器1151之内。
再者,如前所述,该EXPRAM亦包括 一机器状态区域1168,由微处 理器之其它控制电路(未示出)所使用,例如用以维持该机器状态之隐藏 寄存器。该机器状态区域1168并未包括修补微指令,但是,可借助前述三 个修补载入技术之任一个载入至该位置。
参考图12,是显示一熔丝阵列机制1200之框图,用以于制造期间实现 一微码修补。该机制1200,是包括 一阵列控制器1201,经由总线RDBANK, 耦接多个熔丝存储体1202。每一熔丝存储体1202,是包括多个熔丝1203。 如图所示之实施例中,该熔丝阵列1200,是包括32个熔丝存储体[31:0] 1202,每一个具有64个熔丝F[63:0] 1203。如上所述,本发明实现金属或聚合物熔丝1203、或金属及聚合物熔丝之
组合1203。本发明亦包括电子与激光熔丝。经由总线RDBANK,该阵列 控制器1201读取每一熔丝存储体BANK[31:0]之每一熔丝F[63:0]状态,由通 过总线FSPTCH耦接该阵列控制器1201之该修补载入器(未示出)所指示。 一熔丝控制总线FSCTRL亦耦接该阵列控制器1201及微处理器之控制电路 (未示出),以将控制信息编码至一个或多个熔丝存储体1202之一个或多个 熔丝1203。
操作上,于重置之后,但于执行基本输入输出系统之指令前, 一重置微 码例程之一部分将微指令发送至该修补载入器,使得该熔丝阵列1200之内 容被读取并被分配至该控制电路(经由总线FSCTRL),或者,经由总线 FSPTCH,被分配至上述三个修补机制之任一个,意即,至该修补阵列、该 修补随机存取存储器、或该EXPRAM。
参考图13,是显示于图12中,该熔丝阵列之熔丝存储体O内部,熔丝 状态之范例表1300。于一实施例中,该熔丝阵列1200之一个或多个熔丝存 储体1202,是被配置用以包含一个或多个被编码之熔丝1203,用以指出一 对应之熔丝存储体是否具有编码之控制信息或修补信息。于一实施例中,是 实现一可重新配置之机制,用以编码修补信息,如范例表1300所示,其中, 编码之熔丝30:0用以指出存储体31:1是否有编程之控制信息或修补信息。 如该范例表所示,若该熔丝状态为一逻辑状态"0",则'其对应之熔丝存储体 包含控制信息。若该熔丝状态为一逻辑状态"1",则其对应之熔丝存储体包 含修补信息。上述之逻辑状态是通过传统方法决定。
参考图14,是显示依据本发明实施例之一示范修补存储体记录MOO之 字段框图,例如可被编程至熔丝存储体31:1,用以编码一微码修补,包含 一机器状态,是储存于该EXPRAM之机器状态区域,如图ll所述。如图所 示,该修补存储体记录1400,是对应该熔丝存储体之64个熔丝之状态。熔 丝37:0用以指明一 38位之修补数据字段1401,因此,使一 38位之微码修 补被指定。熔丝52:38用以指明位于微码地址空间之一 15位地址MICADDR (1402),因此,指定该微码只读存储器或该修补随机存取存储器之一位置。 熔丝57:53用以指明该修补阵列之一 5位地址PARRY ADDR ( 1403 )。熔丝 58用以指示该修补存储体记录1400之数据是否有效(V, 1404)。熔丝59 用以指示该记录1400是否可以读取(R, 1405 )。熔丝61:60是被编码用以指示一修补目标字段PTGT ( 1406),意即,该修补阵列("OO,,)、该修补随 机存取存储器("0r)、或该EXPRAM ("10")。保留数值"11"。最后,熔 丝63:62指示一保留数据字段RSVD ( 1407 )。
虽然本发明已以较佳实施例揭露如上,然其并非用以限定本发明,任何 本领域普通技术人员,在不脱离本发明之^青神和范围内,当可作些许之更动 与润饰,因此本发明之保护范围当视后附之申请专利范围所界定者为准。
权利要求
1. 一种修补装置,是于一微处理器内,用以将修补提供至储存于一微码只读存储器之微指令,或提供至该微处理器内之电路,该修补装置包括多个熔丝存储体,是被配置以储存相关修补记录,用以修补该微处理器之微码或电路,或用以储存相关控制数据实体,以对该微处理器之控制电路进行编程,其中,于该微处理器制造期间,上述熔丝存储体是以上述相关修补记录进行编程;以及一阵列控制器,是耦接至上述熔丝存储体,被配置用以读取上述相关修补记录,且被配置用以将上述相关修补记录提供至一修补载入器,其中,上述修补载入器是将对应该相关修补记录之修补,当被指定时,提供至该微处理器之指定目标修补机制;其中,于转译一微处理器重置信号之后,与执行储存于一基本输入输出只读存储器之指令前,上述修补载入器将该修补提供至上述指定目标修补机制。
2. 如权利要求1所述的修补装置,更包括 ' 一个或多个配置熔丝存储体,是被编码用以指出每一熔丝存储体是否利用上述相关修补记录其中之一,或上述相关控制数据实体其中之一进行编程;其中该阵列控制器将上述相关控制数据实体提供至该微处理器之控制 电路。
3. 如权利要求2所述的修补装置,其中,上述一个或多个配置熔丝存 储体之每一个,是包括多个熔丝,且其中,每一熔丝之状态是指定对应之 一熔丝存储体,具有一修补记录,或具有编程之一控制数据实体。
4. 如权利要求1所述的修补装置,其中,每一相关修补记录包括 一修补数据字段,用以指定对应之一修补; 一微码地址字段,用以指定微码地址空间之一地址; 一修补阵列地址字段,用以指定一修补阵列之一地址;以及 一修补目标字段,用以于该微处理器中,指定上述指定修补机制其中之
5. 如权利要求1所述的修补装置,其中,每一熔丝存储体是包括64个熔丝,且其中,每一熔丝是对应于一修补记录之一位。
6. 如权利要求1所述的修补装置,其中,每一电路是包括 一硬件寄存器,其中,于一些修补中,每一个包括初始状态数据,对应上述硬件寄存 器其中之一。
7. 如权利要求1所述的修补装置,其中,上述指定修补机制其中之一, 是包括 一修补阵列,位于该微处理器之一转译级内。
8. 如权利要求1所述的修补装置,其中,上述指定修补机制其中之一, 是包括 一修补随机存取存储器,位于该微处理器之一转译级内,且上述修 补随机存取存储器包括位于微码只读存储器地址空间内之地址。
9. 如权利要求1所述的修补装置,其中,上述指定修补机制其中之一, 是包括一扩充随机存取存储器,耦接该修补随机存取存储器,被配置用以储存 该修补,其中,该微处理器执行上述一个或多个第一修补,以替代对应之一 个或多个微指令,以及其中,上述一个或多个第二修补是用以修补对应之一 个或多个电路。
10. —种修补方法,于一微处理器制造期间,选择性地提供修补或控制 数据,该方法包括于该微处理器制造期间,编程多个熔丝存储体,用以储存相关修补记录, 以修补该微处理器之微码或电路,或储存相关控制数据实体,用以编程该微 处理器之控制电路;于该微处理器制造期间,编码一个或多个配置熔丝存储体,用以指出每 一熔丝存储体是否利用相关修补记录其中之一,或相关控制数据实体其中之 一进行编程;于转译一微处理器重置信号之后,与执行储存于 一基本输入输出只读存 储器之指令前,读取所述熔丝存储体及该一个或多个配置熔丝存储体;以及当被指定时,将对应该相关修补记录之修补提供至该微处理器之指定目 标修补机制,进而对该控制电路进行编程。
11. 如权利要求IO所述的修补方法,其中,每一相关修补记录是包括 一修补数据字段,用以指定对应之一修补;一樣i码地址字l殳,用以指定樣么码地址空间之一地址; 一修补阵列地址字段,用以指定一修补阵列之一地址;以及一修补目标字段,用以于该微处理器中,指定该指定修补机制其中之一。
12. 如权利要求10所述的修补方法,其中,该一个或多个配置熔丝存储体之每一个,是包括多个熔丝,且其中,每一熔丝之状态是指定对应之 一熔丝存储体,具有一修补记录或具有编程之一控制数据实体。
13. 如权利要求10所述的修补方法,其中,每一熔丝存储体是包括 64个熔丝,且其中,每一熔丝是对应于一修补记录之一位。
14. 如权利要求IO所述的修补方法,更包括寸该微处理器之一转译级内,指定一修补阵列,作为该指定修补机制其 中之一。
15. 如权利要求IO所述的修补方法,更包括于该微处理器之一转译级内,指定一修补随机存取存储器,作为该指定 修补机制^中之一,其中,该修补随机存取存储器包括微码只读存储器地址 空间内之i也址。
16. 如权利要求IO所述的修补方法,更包括指定一扩充随机存取存储器,作为该指定修补机制其中之一,其中,该 扩充随机存取存储器是被配置以储存该修补,且其中,该微处理器执行该一 个或多个第一修补,以替代对应之一个或多个微指令,以及其中,该一个或 多个第二修补是用以修补对应之一个或多个电路。
全文摘要
一种微处理器之修补装置,包括多个熔丝存储体与一阵列控制器。所述熔丝存储体是被配置以储存相关修补记录,用以修补该微处理器之微码或电路。该阵列控制器是耦接于所述熔丝存储体,且被配置以读取该相关修补记录,并被配置用以将该相关修补记录提供至一修补载入器,其中,该修补载入器将对应该相关修补记录之修补,当被指定时,提供至该微处理器之指定目标修补机制。于转译一微处理器重置信号之后,与执行储存于一基本输入输出只读存储器之指令前,该修补载入器系将该修补提供至该指定目标修补机制。
文档编号G06F9/24GK101299184SQ20081010878
公开日2008年11月5日 申请日期2008年6月2日 优先权日2007年7月24日
发明者G·葛兰·亨利, 泰瑞·派克斯 申请人:威盛电子股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1