armv8 aarch64 PMU寄存器介绍

1. PMCCFILTR_EL0, Performance Monitors Cycle Count Filter Register

作用
    决定循环计数器PMCCNTR_EL0的增长模式
位图

image.png

  • RES0
    保留位
  • P, bit[31]
    0b0 计算EL1中的周期
    0b1 不计算EL1中的周期
    如果实现了EL3的话,那么是否在EL1进行计数将会进一步的由NSK位进行控制
  • U, bit[30]
    0b0 计算EL0中的周期
    0b1 不计算EL0中的周期
    如果实现了EL3的话,那么是否在EL0进行计数将会进一步的由NSU位进行控制
  • NSK, bit[29]
    在实现了EL3的情况下:如果值与P相同则计算EL1中的周期,否则不。
  • NSU, bit[28]
    在实现了EL3的情况下:如果值与U相同则计算EL0中的周期,否则不。
  • NSH, bit[27]
    在实现了EL2的情况下:
    0b0 不计算EL2中的周期
    0b1 计算EL2中的周期
    如果实现了EL2和EL3的话,那么是否在EL2进行计数将会进一步的由SH位进行控制
  • M, bi[26]
    在实现了EL3的情况下:如果值与P相同则计算EL3中的周期,否则不。
  • SH, bi[24]
    在实现了EL3和FEAT_SEL2的情况下:如果值与NSH不相同则计算EL2中的周期,否则不。

读MRS/写MSR

op0 op1 CRn CRm op2
0b11 0b011 0b1110 0b1111 0b111

2. PMCCNTR_EL0, Performance Monitors Cycle Count Register

作用
    统计进程的时钟周期
    只有实现了FEAT_PMUv3,此计数器才存在。并且PMCCNTR的计数还会受到时钟频率的改变的影响,例如时钟被WFI和WFE指令暂停了。
位图

image.png

  • CCNT, bits[63:0]
    可以每一个时钟周期计数一次,也可以每64个时钟周期计数一次,具体由PMCR_EL0.D控制
    如果给PMCR_EL0.C设为1的话可以重置此计数器为0

读写

op0 op1 CRn CRm op2
0b11 0b011 0b1001 0b1101 0b000

3. PMCEID0_EL0, Performance Monitors Common Event Identification register 0

作用
    表明哪些通用架构事件和通用微架构事件被实现/计数,PMU事件编号从0x0000到0x001F和0x4000到0x401F
位图

image.png

  • IDhi<n>, bit[n+32], for n = 31 to 0
    只有实现了FEAT_PMUv3p1,这些位才有效,对应事件0x4000+n
    0b0 该位代表的事件没有实现或不会被计数
    0b1 该位代表的事件被实现了且会被计数
  • ID<n>, bit[n], for n = 31 to 0
    对应事件0x0000+n
    0b0 该位代表的事件没有实现或不会被计数
    0b1 该位代表的事件被实现了且会被计数

只读

op0 op1 CRn CRm op2
0b11 0b011 0b1001 0b1100 0b110

4. PMCEID1_EL0, Performance Monitors Common Event Identification register 1

作用
    表明哪些通用架构事件和通用微架构事件被实现/计数,PMU事件编号从0x0020到0x003F和0x4020到0x403F
位图

image.png

  • IDhi<n>, bit[n+32], for n = 31 to 0
    只有实现了FEAT_PMUv3p1,这些位才有效,对应事件0x4020+n
    0b0 该位代表的事件没有实现或不会被计数
    0b1 该位代表的事件被实现了且会被计数
  • ID<n>, bit[n], for n = 31 to 0
    对应事件0x0020+n
    0b0 该位代表的事件没有实现或不会被计数
    0b1 该位代表的事件被实现了且会被计数

只读

op0 op1 CRn CRm op2
0b11 0b011 0b1001 0b1100 0b111

5. PMCNTENCLR_EL0, Performance Monitors Count Enable Clear register

作用
    可以使计数器去使能。直接读的话表明哪些计数器使能了。
位图

image.png

  • RES0
    保留位
  • C, bit[31]
    0b0 读:表明PMCCNTR未使能。写:无意义。
    0b1 读:表明PMCCNTR使能了。写:PMCCNTR去使能。(这里写1,到clr寄存器里面的值最后应该是0)
  • Pn, bit[n], for n = 30 to 0
    0b0 读:表明PMEVCNTR<n>_EL0未使能。写:无意义。
    0b1 读:表明PMEVCNTR<n>_EL0使能了。写:PMEVCNTR<n>_EL0去使能。
    注:当EL2在当前安全状态下实现并启用时,则在EL1和EL0中,N是MDCR_EL2.HPMN中的值。否则N是PMCR_EL0.N的值。且如果N小于31,则[N,30]的位都是RAZ/WI(Read-As-Zero/Writes Ignored)的。

读写

op0 op1 CRn CRm op2
0b11 0b011 0b1001 0b1100 0b010

6. PMCNTENSET_EL0, Performance Monitors Count Enable Set register

作用
    使能计数器。直接读的话表明哪些计数器使能了。
位图

image.png

  • RES0
    保留位
  • C, bit[31]
    0b0 读:表明PMCCNTR未使能。写:无意义。
    0b1 读:表明PMCCNTR使能了。写:使能PMCCNTR。(这里写1,到set寄存器里面的值最后应该是1,注意与clr寄存器的区别)
  • Pn, bit[n], for n = 30 to 0
    0b0 读:表明PMEVCNTR<n>_EL0未使能。写:无意义。
    0b1 读:表明PMEVCNTR<n>_EL0使能了。写:使能PMEVCNTR<n>_EL0。
    注:当EL2在当前安全状态下实现并启用时,则在EL1和EL0中,N是MDCR_EL2.HPMN中的值。否则N是PMCR_EL0.N的值。且如果N小于31,则[N,30]的位都是RAZ/WI(Read-As-Zero/Writes Ignored)的。

读写

op0 op1 CRn CRm op2
0b11 0b011 0b1001 0b1100 0b001

7. PMCR_EL0, Performance Monitors Control Register

作用
    描述了性能监控的实现细节,包括实现的计数器的数量、用来配置和控制计数器等。
位图

image.png

  • RES0
    保留
  • FZS, bit[32]
    只有实现了FEAT_SPEv1p2的情况下这个位才有意义
    全称Freeze-on-SPE event(freeze on Statistical Profiling Buffer Management event)
    0b0 不要冻结统计分析缓冲区管理事件。
    0b1 事件计数器在统计分析缓冲区管理事件之后不计数。(需要PMBLIMITR_EL1.{PMFZ,E} == {1,1}和PMBSR_EL1.S == 1)
    如果实现了EL2的情况下,这个位只影响编号0到MDCR_EL2.HPMN-1的计数器,而MDCR_EL2.HPMN到PMCR_EL0.N-1的计数器(MDCR_EL2.HPMN小于PMCR_EL0.N的时候)以及PMCCNTR不受影响
  • IMP, bits[31:24]
    IMP,Implementer code。
    只读字段,且不建议使用此字段。
    只有在FEAT_PMUv3p7没有实现的情况下这个字段才有意义,否则是RAZ的。
    值为0,则IDCODE是保留字段,并且软件必须使用MIDR_EL1来标识PE。
    值为其他,这个字段和IDCODE一起标识PMU是由软件实现的。实现的代码由arm分配。且非零值的含义和MIDR_EL1.Implementer一样。
  • IDCODE, bits[23:16]
    IDCODE,Identification code。
    只读字段,且不建议使用此字段。
    只有在PMCR_EL0.IMP != 0x00时此字段才有意义
  • N, bits[15:11]
    只读字段
    表示实现了多少个pmu事件计数器,取值范围是0b00000-0b11111
    当实现了并使能了EL2的情况下,在EL1和EL0下读取此值,返回的是MDCR_EL2.HPMN的值。
  • FZO, bit[9]
    FZO,Freeze-on-overflow。
    只有在实现了FEAT_PMUv3p7的情况下此位才有意义,否则为保留字段
    0b0 在发生溢出时也不暂停计数器
    0b1 在PMOVSCLR_EL0[(N-1):0]非零的情况下,暂停事件计数器。
    如果实现了EL2,且MDCR_EL2.HPMN小于PMCR_EL0.N的情况下,此位忽略PMOVSCLR_EL0[(PMCR_EL0.N-1):MDCR_EL2.HPMN]的非零,且编号从MDCR_EL2.HPMN到PMCR_EL0.N的事件计数器不受影响。
    PMCCNTR不收此位影响。
  • LP, bit[7]
    只有在实现了FEAT_PMUv3p5的情况下此位才有意义,否则为保留字段
    此位决定溢出标识寄存器什么时候记录事件计数器发生了无符号溢出。
    0b0 导致PMEVCNTR<n>_EL0[31:0]溢出时
    0b1 导致PMEVCNTR<n>_EL0[63:0]溢出时
    这里n的大小取决于EL2的实现,以及MDCR_EL2.HPMN和PMCR_EL0.N的大小。
  • LC, bit[6]
    只有在EL0支持AArch32的情况下此位才有意义,否则为保留字段
    此位决定溢出标识寄存器什么时候记录PMCCNTR发生了无符号溢出。
    0b0 导致PMEVCNTR<n>_EL0[31:0]溢出时
    0b1 导致PMEVCNTR<n>_EL0[63:0]溢出时
    Arm不建议使用0b0
  • DP, bit[5]
    此位只有在实现了EL3或者(FEAT_PMUv3p1和EL2都实现)的情况下才有意义,否则为保留字段。
    0b0 无影响
    0b1 当[0..(MDCR_EL2.HPMN-1)]的事件计数器被禁用时,PMCCNTR被禁用
  • X, bit[4]
    export
    此位只有实现了PMU事件导出总线的情况下才有意义,否则为RAZ/WI的
    在已经实现的PMU事件导出总线中启用事件导出功能
    0b0 不导出事件
    0b1 当计数没有被禁止时导出事件
  • D, bit[3]
    只有在EL0支持AArch32的情况下此位才有意义,否则为保留字段
    0b0 控制PMCCNTR每一个时钟周期计数一次
    0b1 控制PMCCNTR每64个时钟周期计数一次
    当PMCR_EL0.LC == 1时,此位无效且PMCCNTR每一个时钟周期计数一次
    Arm不建议使用0b1
  • C, bit[2]
    此位是WO/RAZ
    0b0 无影响
    0b1 重置PMCCNTR为0
    重置PMCCNTR为0不影响对应的PMCCNTR的溢出标识位。
    如果实现了FEAT_PMUv3p5,PMCR_EL0.LC的影响会被忽略,则bit[63:0]会被重置。
  • P, bit[1]
    此位是WO/RAZ
    0b0 无影响
    0b1 重置当前异常等级下可访问的所有事件计数器为0,不包括PMCCNTR
    在EL0或者EL1下:如果实现并使能了EL2,且MDCR_EL2.HPMN小于PMCR_EL0.N的话,则此位写0b1对[MDCR_EL2.HPMN..(PMCR_EL0.N-1)]没影响,否则重置所有计数器。
    在EL2和EL3下:此位写0b1直接重置所有计数器
    重置为0不影响对应的计数器的溢出标识位。
    如果实现了FEAT_PMUv3p5,MDCR_EL2.HLP和PMCR_EL0.LP的影响会被忽略,则所有计数器的bit[63:0]会被重置。
  • E, bit[0]
    0b0 所有计数器[0..(PMN-1)],包括PMCCNTR都是不可用的
    0b1 所有计数器[0..(PMN-1)],包括PMCCNTR都由PMCNTENSET_EL0来使能。
    如果实现了EL2,则:PMN = HDCR.HPMN(EL2是AArch32);PMN = MDCR_EL2.HPMN(EL2是AArch64);PMN < PMCR_EL0.N的话,此位对[PMN..(PMCR_EL0.N-1)]没有影响。
    如果没有实现EL2,则PMN = PMCR_EL0.N。

读写

op0 op1 CRn CRm op2
0b11 0b011 0b1001 0b1100 0b000

8. PMEVCNTR<n>_EL0, Performance Monitors Event Count Registers, n = 0 - 30

作用
    用来事件计数的计数器,n从0到30
位图

image.png

  • Bits
    如果实现了FEAT_PMUv3p5,则是[63:0],否则为[31:0],多余的是保留位

访问
    可以直接访问计数器n,也可以将PMSELR_EL0.SEL置为n,然后通过PMXEVCNTR_EL0间接访问。
    如果访问的时候用的n的值大于实现的计数器的数量的话,此行为将会是未定义的行为。
    EL0想要访问的话,取决于PMUSERENR_EL0.{ER,EN}
读写

op0 op1 CRn CRm op2
0b11 0b011 0b1110 0b10:n[4:3] n[2:0]

这里假设要访问的是编号为7的计数器,对应的五位二进制是00111,所以上诉的n[4:3]就是00,n[2:0]就是111

9. PMEVTYPER<n>_EL0, Performance Monitors Event Type Registers, n = 0 - 30

作用
    事件类型寄存器n用来配置对应的计数器n。功能类似于PMCCFILTR_EL0对PMCCNTR的控制一样。
位图

image.png

  • MT, bit[25]
    只有当实现了FEAT_MTPMU(见ID_AA64DFR0_EL1.MTPMU)或实现了一个定义的多线程PMU扩展时此位才有效,否则为保留位
    0b0 仅在控制PE上进行事件计数
    0b1 对来自任何在级别1及以上的,且与当前PE具有相同亲和性的PE的事件进行计数
  • evtCount[15:10], bits[15:10]
    只有实现了FEAT_PMUv3p1时,此字段才有意义,否则为保留字段
    此时扩展到字段[9:0],详情见[9:0]
  • evtCount[9:0], bits[9:0]
    记录要计数的事件编号
    软件必须要使用PE支持的事件来编程此字段。
    (没看懂这字段的含义,读者可以自行查阅Arm手册)
  • 其他
    其他位的功能都和PMCCFILTR_EL0一样,不再赘述

访问
    可以直接访问计数器n,也可以将PMSELR_EL0.SEL置为n,然后通过PMXEVTYPER_EL0间接访问。
    如果访问的时候用的n的值大于实现的计数器的数量的话,此行为将会是未定义的行为。
    EL0想要访问的话,取决于PMUSERENR_EL0.{ER,EN}。
读写

op0 op1 CRn CRm op2
0b11 0b011 0b1110 0b11:n[4:3] n[2:0]

10. PMINTENCLR_EL1, Performance Monitors Interrupt Enable Clear register

作用
    禁用计数器的溢出中断请求功能
位图

image.png

  • RES0
    保留位
  • C. bit[31]
    0b0 读:表示PMCCNTR溢出中断请求被禁用;写:无影响
    0b1 读:表示PMCCNTR溢出中断请求启用;写:禁用PMCCNTR溢出中断请求
  • P<n>, bit[n], for n = 30 to 0
    0b0 读:表示PMEVCNTR<n>_EL0溢出中断请求被禁用;写:无影响
    0b1 读:表示PMEVCNTR<n>_EL0溢出中断请求启用;写:禁用PMEVCNTR<n>_EL0溢出中断请求
    当实现并使能了EL2,则在EL1中N的值是MDCR_EL2.HPMN,否则N是PMCR_EL0.N。如果N小于31,则[30:N]是RAZ/WI的。

读写

op0 op1 CRn CRm op2
0b11 0b000 0b1001 0b1110 0b010

11. PMINTENSET_EL1, Performance Monitors Interrupt Enable Set register

作用
    使能计数器的溢出中断请求功能
位图

image.png

  • RES0
    保留位
  • C. bit[31]
    0b0 读:表示PMCCNTR溢出中断请求被禁用;写:无影响
    0b1 读:表示PMCCNTR溢出中断请求启用;写:使能PMCCNTR溢出中断请求
  • P<n>, bit[n], for n = 30 to 0
    0b0 读:表示PMEVCNTR<n>_EL0溢出中断请求被禁用;写:无影响
    0b1 读:表示PMEVCNTR<n>_EL0溢出中断请求启用;写:使能PMEVCNTR<n>_EL0溢出中断请求
    当实现并使能了EL2,则在EL1中N的值是MDCR_EL2.HPMN,否则N是PMCR_EL0.N。如果N小于31,则[30:N]是RAZ/WI的。

读写

op0 op1 CRn CRm op2
0b11 0b000 0b1001 0b1110 0b001

12. PMMIR_EL1, Performance Monitors Machine Identification Register

作用
    描述特定于软件实现的性能监视器参数。
    仅当实现FEAT_PMUv3p4时,此寄存器才存在。否则,对PMMI_EL1的直接访问是未定义的。
位图

image.png

  • RES0
    保留位
  • BUS_WIDTH, bits[19:16]
    总线宽度。表明每个BUS_ACCESS事件相关的字节数。对应取值如下:
    0b0000 信息不可用
    0b0011-0b1100,每增加一,字节数翻倍,0b0011表示4字节,0b1100表示2048字节,其他值是保留值。
    每次传输都达到此字节数。但是访问可能小于总线宽度。
    (没看懂,读者可自行查阅Arm手册)
  • BUS_SLOTS, bits[15:8]
    总线计数。当此字段为非零时,BUS_ACCESS事件在单个BUS_CERS周期中可能递增的最大值为此值。
  • SLOTS, bits[7:0]
    操作宽度。STALL_SLOT事件在单个周期中可能递增的最大值。如果未实现STALL_SLOT事件,则此字段可能为RAZ。

读写

op0 op1 CRn CRm op2
0b11 0b000 0b1001 0b1110 0b110

13. PMOVSCLR_EL0, Performance Monitors Overflow Flag Status Clear Register

作用
    保存有计数器溢出的状态标识。写此寄存器可以重置溢出状态。
位图

image.png

  • RES0
    保留位
  • C, bit[31]
    0b0 读:自上一次这个位被重置以来,PMCCNTR计数器没有溢出;写:无影响
    0b1 读:自上一次这个位被重置以来,PMCCNTR计数器溢出了;写:重置此位为0。
  • P<n>, bit[n], for n = 30 to 0
    0b0 读:自上一次这个位被重置以来,PMEVCNTR<n>_EL0没有溢出;写:无影响
    0b1 读:自上一次这个位被重置以来,PMEVCNTR<n>_EL0计数器溢出了;写:重置此位为0。
    当实现并使能了EL2,则在EL1和EL0中N的值是MDCR_EL2.HPMN,否则N是PMCR_EL0.N。如果N小于31,则[30:N]是RAZ/WI的。

读写

op0 op1 CRn CRm op2
0b11 0b011 0b1001 0b1100 0b011

14. PMOVSSET_EL0, Performance Monitors Overflow Flag Status Set register

作用
    当对应计数器溢出时,设置对应的位,表明溢出
位图

image.png

  • RES0
    保留位
  • C, bit[31]
    0b0 读:自上一次这个位被重置以来,PMCCNTR计数器没有溢出;写:无影响
    0b1 读:自上一次这个位被重置以来,PMCCNTR计数器溢出了;写:置为1。
  • P<n>, bit[n], for n = 30 to 0
    0b0 读:自上一次这个位被重置以来,PMEVCNTR<n>_EL0没有溢出;写:无影响
    0b1 读:自上一次这个位被重置以来,PMEVCNTR<n>_EL0计数器溢出了;写:重为1。
    当实现并使能了EL2,则在EL1和EL0中N的值是MDCR_EL2.HPMN,否则N是PMCR_EL0.N。如果N小于31,则[30:N]是RAZ/WI的。

读写

op0 op1 CRn CRm op2
0b11 0b011 0b1001 0b1110 0b011

15. PMSELR_EL0, Performance Monitors Event Counter Selection Register

作用
    用来选择对应编号的计数器。
    可以和PMXEVCNTR_EL0一起配合使用,来决定选择的计数器的值。
    也可以和PMXEVTYPER_EL0一起配合使用,来决定选择的计数器的计数事件,计数模式等。
位图

image.png

  • RES0
    保留位
  • SEL, bits[4:0]
    取值为0b00000到0b11111,其中0b11111代表计数器PMCCNTR,其余的代表PMEVCNTR<n>_EL0。
    当值为0b11111:则读写PMXEVTYPER_EL0,实际上是在读写PMCCFILTR_EL0
    当值为剩下的:则读写PMXEVTYPER_EL0,实际上是在读写PMEVTYPER<n>_EL0

读写

op0 op1 CRn CRm op2
0b11 0b011 0b1001 0b1100 0b101

16. PMSWINC_EL0, Performance Monitors Software Increment register

作用
    当某个PMEVCNTR<n>_EL0计数器被配置用来作为计算软件自增事件(事件编号0x00)的计数器时,将它的计数增加一。
位图

image.png

  • RES0
    保留位
  • P<n>, bit[n], for n = 30 to 0
    0b0 无影响,写操作被忽略
    0b1 如果有某个已经使能的计数器被配置来计算软件自增事件的,则给那个计数器增加一,否则无影响,写操作被忽略。
    当实现并使能了EL2,则在EL1和EL0中N的值是MDCR_EL2.HPMN,否则N是PMCR_EL0.N。如果N小于31,则[30:N]是WI的。

只写

op0 op1 CRn CRm op2
0b11 0b011 0b1001 0b1100 0b100

17. PMUSERENR_EL0, Performance Monitors User Enable Register

作用
    决定EL0是否可以访问性能监视器
位图

image.png

  • RES0
    保留位
  • ER, bit[3]
    Event counter Read。EL0对事件计数器的访问会被trap到EL1或者EL2(实现并使能了EL2,且HCR_EL2.TGE是1)
    0b0 当PMUSERENR_EL0.EN也是0时,EL0读取PMXEVCNTR_EL0和PMEVCNTR<n>_EL0会被trap。
    0b1 覆盖PMUSERENR_EL0.EN并使能:在EL0对PMXEVCNTR_EL0和PMEVCNTR<n>_EL0的只读功能;在EL0对PMSELR_EL0的读写能力;在EL0对PMSELR的读写能力。
  • CR, bit[2]
    Cycle counter Read。EL0对PMCCNTR的访问会被trap到EL1或者EL2(实现并使能了EL2,且HCR_EL2.TGE是1)
    0b0 当PMUSERENR_EL0.EN也是0时,EL0读取PMCCNTR会被trap。
    0b1 覆盖PMUSERENR_EL0.EN并使能:在EL0对PMCCNTR的读写能力。
  • SW, bit[2]
    EL0对软件自增的写操作会被trap到EL1或者EL2(实现并使能了EL2,且HCR_EL2.TGE是1)
    0b0 当PMUSERENR_EL0.EN也是0时,EL0写PMSWINC_EL0会被trap。
    0b1 覆盖PMUSERENR_EL0.EN并使能:在EL0对PMSWINC_EL0的写能力。
  • EN, bit[0]
    0b0 制EL0访问寄存器会被trap,除非被PMUSERENR_EL0.{ER, CR, SW}覆盖
    0b1 在EL0,软件可以访问所有指定的寄存器。

读写

op0 op1 CRn CRm op2
0b11 0b011 0b1001 0b1110 0b000

18. PMXEVCNTR_EL0, Performance Monitors Selected Event Count Register

作用
    读或者写某个计数器,计数器是由PMSELR_EL0.SEL的值决定的
位图
    如果实现了FEAT_PMUv3p5

image.png

    否则为
image.png

  • RES0
    保留位
  • PMEVCNTR<n>
    对应于由PMSELR_EL0.SEL决定的计数器的值

读写

op0 op1 CRn CRm op2
0b11 0b011 0b1001 0b1101 0b010

19. PMXEVTYPER_EL0, Performance Monitors Selected Event Type Register

作用
    读或者写PMEVTYPER<n>_EL0或者PMCCFILTR_EL0,由PMSELR_EL0.SEL选择的计数器决定。
位图

image.png

  • RES0
    保留位
  • Event type register or PMCCFILTR_EL0
    值为0-30,此寄存器映射的是PMEVTYPER<n>_EL0
    值为31,此寄存器映射的是PMCCFILTR_EL0

读写

op0 op1 CRn CRm op2
0b11 0b011 0b1001 0b1101 0b001
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容