summaryrefslogtreecommitdiffstats
path: root/web/server/h2o/libh2o/deps/picotls/deps/cifra/src/arm/boot.c
blob: d2a8e407bb14d36749c7cfa28827a6b368d51602 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#include <stdint.h>
#include <stdlib.h>
#include <string.h>

extern int main(void);

/* --- Defined by link script --- */
extern uint32_t __etext; /* End of text/start of data. */
extern uint32_t __data_start__, __data_end__; /* Data addresses in RAM */
extern uint32_t __bss_start__, __bss_end__; /* BSS addresses in RAM */
extern uint32_t __StackTop; /* End of stack in RAM */

#define ATTR_SECTION(sec) __attribute__ ((section (sec)))

/* --- Interrupt vector table. --- */
void Reset_Handler(void);
void SysTick_Handler(void);
void infinite_loop(void);
void do_nothing(void);

typedef void (*vector_fn)(void);

typedef struct {
  uint32_t *stack_top;
  vector_fn reset, nmi, hard_fault, mmu_fault, bus_fault, usage_fault;
  vector_fn reserved0[4];
  vector_fn svc, debug_monitor;
  vector_fn reserved1;
  vector_fn pendsv, systick;
  vector_fn irq[128];
} vectors_t;

#define COPY2(v) v, v
#define COPY4(v) COPY2(v), COPY2(v)
#define COPY8(v) COPY4(v), COPY4(v)
#define COPY16(v) COPY8(v), COPY8(v)
#define COPY32(v) COPY16(v), COPY16(v)
#define COPY64(v) COPY32(v), COPY32(v)
#define COPY128(v) COPY64(v), COPY64(v)

vectors_t vectors ATTR_SECTION(".isr_vector") = {
  .stack_top = &__StackTop,
  .reset = Reset_Handler,
  .nmi = do_nothing,
  .hard_fault = infinite_loop,
  .mmu_fault = infinite_loop,
  .bus_fault = infinite_loop,
  .usage_fault = infinite_loop,
  .svc = do_nothing,
  .debug_monitor = do_nothing,
  .pendsv = do_nothing,
  .systick = SysTick_Handler,
  .irq = { COPY128(do_nothing) }
};

/* --- ISRs --- */
void Reset_Handler(void)
{
  /* Copy data segment contents from flash to RAM. */
  uint32_t data_bytes = (&__data_end__ - &__data_start__) * 4;
  memcpy(&__etext, &__data_start__, data_bytes);

  /* Zero BSS. */
  uint32_t bss_bytes = (&__bss_end__ - &__bss_start__) * 4;
  memset(&__bss_start__, 0, bss_bytes);

  main();
  while (1)
    ;
}

void __assert_func(const char *file, int line, const char *func, const char *expr)
{
  while (1)
    ;
}

void infinite_loop(void)
{
  while (1)
    ;
}

void do_nothing(void)
{
}

uint32_t ticks = 0;

void SysTick_Handler(void)
{
  ticks++;
}

uint32_t get_ticks(void)
{
  return ticks;
}

void reset_ticks(void)
{
  ticks = 0;
}

void *memmove(void *vtarg, const void *vsrc, size_t len)
{
  if (vsrc > vtarg)
    return memcpy(vtarg, vsrc, len);
  else if (vsrc == vtarg)
    return vtarg;

  uint8_t *targ = vtarg;
  const uint8_t *src = vsrc;

  for (size_t i = len; i != 0; i++)
    targ[i - 1] = src[i - 1];
  return vtarg;
}

int memcmp(const void *va, const void *vb, size_t len)
{
  const uint8_t *a = va, *b = vb;

  for (size_t i = 0; i < len; i++)
  {
    if (a[i] != b[i])
      return a[i] < b[i] ? -1 : 1;
  }

  return 0;
}

size_t strlen(const char *c)
{
  size_t r = 0;
  while (*c++) r++;
  return r;
}

void abort(void)
{
  while (1)
    ;
}